Browse Source

Patch built-in Lua to fix miscompile on Android (#12347)

paradust7 1 year ago
parent
commit
e1f707d7e1
1 changed files with 7 additions and 2 deletions
  1. 7 2
      lib/lua/src/lgc.c

+ 7 - 2
lib/lua/src/lgc.c

@@ -164,8 +164,13 @@ static int traversetable (global_State *g, Table *h) {
     markobject(g, h->metatable);
   mode = gfasttm(g, h->metatable, TM_MODE);
   if (mode && ttisstring(mode)) {  /* is there a weak mode? */
-    weakkey = (strchr(svalue(mode), 'k') != NULL);
-    weakvalue = (strchr(svalue(mode), 'v') != NULL);
+    // Android's 'FORTIFY libc' calls __builtin_object_size on the argument of strchr.
+    // This produces an incorrect size for the expression `svalue(mode)`, causing
+    // an assertion. By placing it in a temporary, __builtin_object_size returns
+    // -1 (for unknown size) which functions correctly.
+    const char *tmp = svalue(mode);
+    weakkey = (strchr(tmp, 'k') != NULL);
+    weakvalue = (strchr(tmp, 'v') != NULL);
     if (weakkey || weakvalue) {  /* is really weak? */
       h->marked &= ~(KEYWEAK | VALUEWEAK);  /* clear bits */
       h->marked |= cast_byte((weakkey << KEYWEAKBIT) |