summaryrefslogtreecommitdiff
path: root/cpu_ref/rsCpuExecutable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpu_ref/rsCpuExecutable.cpp')
-rw-r--r--cpu_ref/rsCpuExecutable.cpp23
1 files changed, 9 insertions, 14 deletions
diff --git a/cpu_ref/rsCpuExecutable.cpp b/cpu_ref/rsCpuExecutable.cpp
index 98f9ef85..f45e8f0d 100644
--- a/cpu_ref/rsCpuExecutable.cpp
+++ b/cpu_ref/rsCpuExecutable.cpp
@@ -281,7 +281,7 @@ static char* strgets(char *s, int size, const char **ppstr) {
}
ScriptExecutable* ScriptExecutable::createFromSharedObject(
- Context* RSContext, void* sharedObj) {
+ Context* RSContext, void* sharedObj, uint32_t expectedChecksum) {
char line[MAXLINE];
size_t varCount = 0;
@@ -299,7 +299,7 @@ ScriptExecutable* ScriptExecutable::createFromSharedObject(
uint32_t* forEachSignatures = nullptr;
const char ** pragmaKeys = nullptr;
const char ** pragmaValues = nullptr;
- char *checksum = nullptr;
+ uint32_t checksum = 0;
const char *rsInfo = (const char *) dlsym(sharedObj, ".rs.info");
@@ -519,25 +519,21 @@ ScriptExecutable* ScriptExecutable::createFromSharedObject(
}
if (strgets(line, MAXLINE, &rsInfo) != nullptr) {
- if (strncmp(line, CHECKSUM_STR, strlen(CHECKSUM_STR)) != 0) {
+ if (sscanf(line, CHECKSUM_STR "%08x", &checksum) != 1) {
ALOGE("Invalid checksum flag!: %s", line);
goto error;
}
-
- // consume trailing newline character
- char *c = strrchr(line, '\n');
- if (c) {
- *c = '\0';
- }
-
- char *checksumStart = &line[strlen(CHECKSUM_STR)];
- checksum = new char[strlen(checksumStart) + 1];
- strcpy(checksum, checksumStart);
} else {
ALOGE("Missing checksum in shared obj file");
goto error;
}
+ if (expectedChecksum != 0 && checksum != expectedChecksum) {
+ ALOGE("Found invalid checksum. Expected %08x, got %08x\n",
+ expectedChecksum, checksum);
+ goto error;
+ }
+
#endif // RS_COMPATIBILITY_LIB
return new ScriptExecutable(
@@ -550,7 +546,6 @@ ScriptExecutable* ScriptExecutable::createFromSharedObject(
error:
#ifndef RS_COMPATIBILITY_LIB
- delete[] checksum;
for (size_t idx = 0; idx < pragmaCount; ++idx) {
delete [] pragmaKeys[idx];