Index: ports/nacl-spawn/nacl_spawn.cc |
diff --git a/ports/nacl-spawn/nacl_spawn.cc b/ports/nacl-spawn/nacl_spawn.cc |
index a2915f74a4e9eea06a2f0f9b86158ff0da831e13..59cd9a955dc0b8af195414c7a093b9e8601cf245 100644 |
--- a/ports/nacl-spawn/nacl_spawn.cc |
+++ b/ports/nacl-spawn/nacl_spawn.cc |
@@ -240,13 +240,10 @@ static bool UseBuiltInFallback(std::string* prog, struct PP_Var req_var) { |
return false; |
} |
-// Check if a file is a pnacl type file. |
-// If the file can't be read, return false. |
-static bool IsPNaClType(const std::string& filename) { |
- // Open script. |
+static bool CheckFileMagic(const std::string& filename, |
+ const std::string& magic) { |
int fh = open(filename.c_str(), O_RDONLY); |
if (fh < 0) { |
- // Default to nacl type if the file can't be read. |
return false; |
} |
// Read first 4 bytes. |
@@ -254,7 +251,17 @@ static bool IsPNaClType(const std::string& filename) { |
ssize_t len = read(fh, buffer, sizeof buffer); |
close(fh); |
// Decide based on the header. |
- return len == 4 && memcmp(buffer, "PEXE", sizeof buffer) == 0; |
+ return len == 4 && memcmp(buffer, magic.c_str(), sizeof buffer) == 0; |
+} |
+ |
+// Check if a file contains finalised PNaCl bitcode |
+static bool IsPNaClType(const std::string& filename) { |
+ return CheckFileMagic(filename, "PEXE"); |
+} |
+ |
+// Check if a file contains LLVM bitcode |
+static bool IsBitcode(const std::string& filename) { |
+ return CheckFileMagic(filename, "BC\xc0\xde"); |
} |
// Adds a NMF to the request if |prog| is stored in HTML5 filesystem. |
@@ -276,12 +283,23 @@ static bool AddNmfToRequest(std::string prog, struct PP_Var req_var) { |
return true; |
} |
+ bool debug = getenv("LD_DEBUG") != NULL; |
+ |
// Check for pnacl. |
if (IsPNaClType(prog)) { |
+ if (debug) { |
+ fprintf(stderr, "%s: loading PNaCl bitcode: %s\n", |
+ LOADER_NAME, prog.c_str()); |
+ } |
AddNmfToRequestForPNaCl(prog, req_var); |
return true; |
} |
+ if (IsBitcode(prog)) { |
+ fprintf(stderr, "%s: cannot execute unfinalized bitcode\n", prog.c_str()); |
+ return false; |
+ } |
+ |
std::string arch; |
std::vector<std::string> dependencies; |
if (!nspawn_find_arch_and_library_deps(prog, &arch, &dependencies)) |