tsan: better flag parsing: do not confuse flag that is a part of another flag
authorDmitry Vyukov <dvyukov@google.com>
Wed, 27 Mar 2013 17:59:13 +0000 (17:59 +0000)
committerDmitry Vyukov <dvyukov@google.com>
Wed, 27 Mar 2013 17:59:13 +0000 (17:59 +0000)
(e.g. suppressions and print_suppressions)

llvm-svn: 178158

compiler-rt/lib/sanitizer_common/sanitizer_flags.cc

index 2ef4278..c34c462 100644 (file)
@@ -22,11 +22,20 @@ static bool GetFlagValue(const char *env, const char *name,
                          const char **value, int *value_length) {
   if (env == 0)
     return false;
-  const char *pos = internal_strstr(env, name);
-  const char *end;
-  if (pos == 0)
-    return false;
+  const char *pos = 0;
+  for (;;) {
+    pos = internal_strstr(env, name);
+    if (pos == 0)
+      return false;
+    if (pos != env && ((pos[-1] >= 'a' && pos[-1] <= 'z') || pos[-1] == '_')) {
+      // Seems to be middle of another flag name or value.
+      env = pos + 1;
+      continue;
+    }
+    break;
+  }
   pos += internal_strlen(name);
+  const char *end;
   if (pos[0] != '=') {
     end = pos;
   } else {