]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve C-h C-h bug fix
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 16 Feb 2020 19:36:19 +0000 (11:36 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 16 Feb 2020 19:37:07 +0000 (11:37 -0800)
* src/lread.c (read1): Guard against two 'struct Lisp_Vector *'
pointers differing only in their most significant bit.  Problem
reported by Pip Cet (Bug#39529#22).

src/lread.c

index 1613719eb1d9ca5ddb0bb1f6d68418ecde09b441..70984d37e183564491fc86e486f7bd7949f9a124 100644 (file)
@@ -2982,10 +2982,13 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
                 as 0.  This placeholder 0 would lead to accidental sharing in
                 purecopy's hash-consing, so replace it with a (hopefully)
                 unique integer placeholder, which is negative so that it is
-                not confused with a DOC file offset.  Eventually
-                Snarf-documentation should replace the placeholder with the
-                actual docstring.  */
-             EMACS_UINT hash = XHASH (tmp) | (INTMASK - INTMASK / 2);
+                not confused with a DOC file offset (the USE_LSB_TAG shift
+                relies on the fact that VALMASK is one bit narrower than
+                INTMASK).  Eventually Snarf-documentation should replace the
+                placeholder with the actual docstring.  */
+             verify (INTMASK & ~VALMASK);
+             EMACS_UINT hash = ((XHASH (tmp) >> USE_LSB_TAG)
+                                | (INTMASK - INTMASK / 2));
              ASET (tmp, COMPILED_DOC_STRING, make_ufixnum (hash));
            }