Subject: bug#35711: closed (Re: emacs crashes on m68k after d2f1971dd5)

From: [email-masked] (GNU bug Tracking System)
Date: Tue, 14 May 2019 18:12:02 +0000

Your bug report

#35711: emacs crashes on m68k after d2f1971dd5

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
35711: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=35711
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: emacs crashes on m68k after d2f1971dd5
From: Paul Eggert <[email-masked]>
To: John Paul Adrian Glaubitz <[email-masked]>, [email-masked]
Cc: Andreas Schwab <[email-masked]>, Michael Karcher <[email-masked]>
Date: Tue, 14 May 2019 11:10:52 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

On 5/14/19 2:10 AM, John Paul Adrian Glaubitz wrote:
> backporting your current
> patch to the 26 branch fixes the bug for me for emacs26.
>
> Thus, could you backport your patch to the 26 branch?

Thanks for checking. I backported it and am closing the bug report.

Subject: emacs crashes on m68k after d2f1971dd5
From: John Paul Adrian Glaubitz <[email-masked]>
To: [email-masked]
Cc: Andreas Schwab <[email-masked]>, Michael Karcher <[email-masked]>, Paul Eggert <[email-masked]>
Date: Mon, 13 May 2019 14:15:16 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Hello!

The commit [1] "Port flexible array members to GCC + valgrind" (d2f1971dd5)
broke emacs on m68k. This is because the new code aligns blocks of 1-byte
strings to 16 bit on m68k which is the default alignment on m68k.

The crash on m68k looks like this [2]:

/bin/mkdir -p ../etc
/usr/bin/make -C ../lisp update-subdirs
make[4]: Entering directory '/<<BUILDDIR>>/emacs-26.1+1/debian/build-gtk/lisp'
make[4]: Leaving directory '/<<BUILDDIR>>/emacs-26.1+1/debian/build-gtk/lisp'
./temacs --batch  --load loadup bootstrap
Loading loadup.el (source)...
Using load-path (/<<BUILDDIR>>/emacs-26.1+1/debian/build-src/lisp /<<BUILDDIR>>/emacs-26.1+1/debian/build-src/lisp/emacs-lisp /<<BUILDDIR>>/emacs-26.1+1/debian/build-src/lisp/progmodes /<<BUILDDIR>>/emacs-26.1+1/debian/build-src/lisp/language /<<BUILDDIR>>/emacs-26.1+1/debian/build-src/lisp/international /<<BUILDDIR>>/emacs-26.1+1/debian/build-src/lisp/textmodes /<<BUILDDIR>>/emacs-26.1+1/debian/build-src/lisp/vc)
Loading emacs-lisp/byte-run (source)...
Loading emacs-lisp/backquote (source)...
Loading subr (source)...
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
make[3]: *** [Makefile:738: bootstrap-emacs] Segmentation fault

The attached patch by Michael Karcher fixes the problem.

Thanks,
Adrian

> [1] http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=d2f1971dd570439da4198fa76603b53b072060f8
> [2] https://buildd.debian.org/status/fetch.php?pkg=emacs&arch=m68k&ver=1%3A26.1%2B1-3.2&stamp=1549253883&raw=0

-- 
 .''`.  John Paul Adrian Glaubitz
: :' :  Debian Developer - [email-masked]
`. `'   Freie Universitaet Berlin - [email-masked]
  `-    GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913
--- emacs-26.1+1.orig/src/alloc.c
+++ emacs-26.1+1/src/alloc.c
@@ -1766,14 +1766,14 @@ static char const string_overrun_cookie[
 
 /* The 'max' reserves space for the nbytes union member even when NBYTES + 1 is
    less than the size of that member.  The 'max' is not needed when
-   SDATA_DATA_OFFSET is a multiple of FLEXALIGNOF (struct sdata),
-   because then the alignment code reserves enough space.  */
+   the tail padding of "struct sdata" with a single payload byte is big enough
+   to accomodate the full union "sdata". */
 
 #define SDATA_SIZE(NBYTES)				      \
      ((SDATA_DATA_OFFSET				      \
-       + (SDATA_DATA_OFFSET % FLEXALIGNOF (struct sdata) == 0 \
-	  ? NBYTES					      \
-	  : max (NBYTES, FLEXALIGNOF (struct sdata) - 1))     \
+       + (FLEXSIZEOF (struct sdata, data, 1) < sizeof (sdata) \
+	  ? max (NBYTES, sizeof (sdata) - SDATA_DATA_OFFSET - 1) \
+	  : NBYTES)                                           \
        + 1						      \
        + FLEXALIGNOF (struct sdata) - 1)		      \
       & ~(FLEXALIGNOF (struct sdata) - 1))