]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix pdumper-related GC bug
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 11 Jul 2021 07:27:43 +0000 (00:27 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 11 Jul 2021 08:30:11 +0000 (01:30 -0700)
* src/alloc.c (mark_maybe_pointer): Also mark pointers
to pdumper objects, even when the pointers are tagged.
Add a FIXME saying why this isn’t enough.

src/alloc.c

index 76d8c7ddd111c17436fbb36549f7bcdfa6115bca..752eaec13521f555494f9ae9485397d22cfe56c1 100644 (file)
@@ -4755,6 +4755,17 @@ mark_maybe_pointer (void *p)
      definitely _don't_ have an object.  */
   if (pdumper_object_p (p))
     {
+      /* FIXME: This code assumes that every reachable pdumper object
+        is addressed either by a pointer to the object start, or by
+        the same pointer with an LSB-style tag.  This assumption
+        fails if a pdumper object is reachable only via machine
+        addresses of non-initial object components.  Although such
+        addressing is rare in machine code generated by C compilers
+        from Emacs source code, it can occur in some cases.  To fix
+        this problem, the pdumper code should grok non-initial
+        addresses, as the non-pdumper code does.  */
+      uintptr_t mask = VALMASK;
+      p = (void *) ((uintptr_t) p & mask);
       /* Don't use pdumper_object_p_precise here! It doesn't check the
          tag bits. OBJ here might be complete garbage, so we need to
          verify both the pointer and the tag.  */