emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Change of octal prefix character crashes Emacs [2nd time]


From: Ehud Karni
Subject: Change of octal prefix character crashes Emacs [2nd time]
Date: Tue, 1 Mar 2005 13:09:21 +0200

A few days ago (2005-02-25) I sent a report about a crash in emacs
22.0.50 with a patch that fix it. There was no response, and nobody
installed it in CVS. I'm resending it, hoping someone will look at
it this time.

Changing the octal prefix character by setting slot 2 of the
`standard-display-table' cause Emacs to crash when trying to
display a character that should be displayed in octal.

How to crash Emacs:
1. Add octal displayed characters, e.g. \221 \222 \223
2. Eval the following 2 lines:
   (setq standard-display-table (make-display-table))
   (set-display-table-slot standard-display-table 2 ?!)
3. If Emacs has not crashed yet, refresh the view by ^L.

The cause of the crash is a bug in `get_next_display_element' in
xdisp.c . The local variable `face_id' is always used but is not
set when there is no face to replacing prefix character.

The patch below fix this bug.

Ehud.


*** /lnx1/gnu/src/emacs/src/xdisp.c.~1.986.~    Sun Feb 27 12:53:09 2005
--- /lnx1/gnu/src/emacs/src/xdisp.c     Tue Mar  1 12:48:06 2005
***************
*** 5087,5097 ****
                 display.  Then, set IT->dpvec to these glyphs.  */
              GLYPH g;
              int ctl_len;
!             int face_id, lface_id;
              GLYPH escape_glyph;

              if (it->c < 128 && it->ctl_arrow_p)
                {
                  /* Set IT->ctl_chars[0] to the glyph for `^'.  */
                  if (it->dp
                      && INTEGERP (DISP_CTRL_GLYPH (it->dp))
--- 5087,5098 ----
                 display.  Then, set IT->dpvec to these glyphs.  */
              GLYPH g;
              int ctl_len;
!             int face_id, lface_id = 0 ;
              GLYPH escape_glyph;

              if (it->c < 128 && it->ctl_arrow_p)
                {
+                 g = '^';           /* default glyph for Control */
                  /* Set IT->ctl_chars[0] to the glyph for `^'.  */
                  if (it->dp
                      && INTEGERP (DISP_CTRL_GLYPH (it->dp))
***************
*** 5099,5117 ****
                    {
                      g = XINT (DISP_CTRL_GLYPH (it->dp));
                      lface_id = FAST_GLYPH_FACE (g);
!                     if (lface_id)
!                       {
!                         g = FAST_GLYPH_CHAR (g);
!                         face_id = merge_faces (it->f, Qt, lface_id,
!                                                it->face_id);
!                       }
                    }
                  else
                    {
                      /* Merge the escape-glyph face into the current face.  */
                      face_id = merge_faces (it->f, Qescape_glyph, 0,
                                             it->face_id);
-                     g = '^';
                    }

                  XSETINT (it->ctl_chars[0], g);
--- 5100,5117 ----
                    {
                      g = XINT (DISP_CTRL_GLYPH (it->dp));
                      lface_id = FAST_GLYPH_FACE (g);
!                   }
!                 if (lface_id)
!                   {
!                      g = FAST_GLYPH_CHAR (g);
!                      face_id = merge_faces (it->f, Qt, lface_id,
!                                             it->face_id);
                    }
                  else
                    {
                      /* Merge the escape-glyph face into the current face.  */
                      face_id = merge_faces (it->f, Qescape_glyph, 0,
                                             it->face_id);
                    }

                  XSETINT (it->ctl_chars[0], g);
***************
*** 5121,5145 ****
                  goto display_control;
                }

              if (it->dp
                  && INTEGERP (DISP_ESCAPE_GLYPH (it->dp))
                  && GLYPH_CHAR_VALID_P (XFASTINT (DISP_ESCAPE_GLYPH (it->dp))))
                {
                  escape_glyph = XFASTINT (DISP_ESCAPE_GLYPH (it->dp));
                  lface_id = FAST_GLYPH_FACE (escape_glyph);
!                 if (lface_id)
!                   {
!                     escape_glyph = FAST_GLYPH_CHAR (escape_glyph);
!                     face_id = merge_faces (it->f, Qt, lface_id,
!                                            it->face_id);
!                   }
                }
              else
                {
                  /* Merge the escape-glyph face into the current face.  */
                  face_id = merge_faces (it->f, Qescape_glyph, 0,
                                         it->face_id);
-                 escape_glyph = '\\';
                }

              if (it->c == 0x8a0 || it->c == 0x8ad)
--- 5121,5145 ----
                  goto display_control;
                }

+             escape_glyph = '\\';    /* default for Octal display */
              if (it->dp
                  && INTEGERP (DISP_ESCAPE_GLYPH (it->dp))
                  && GLYPH_CHAR_VALID_P (XFASTINT (DISP_ESCAPE_GLYPH (it->dp))))
                {
                  escape_glyph = XFASTINT (DISP_ESCAPE_GLYPH (it->dp));
                  lface_id = FAST_GLYPH_FACE (escape_glyph);
!               }
!             if (lface_id)
!               {
!                 escape_glyph = FAST_GLYPH_CHAR (escape_glyph);
!                 face_id = merge_faces (it->f, Qt, lface_id,
!                                        it->face_id);
                }
              else
                {
                  /* Merge the escape-glyph face into the current face.  */
                  face_id = merge_faces (it->f, Qescape_glyph, 0,
                                         it->face_id);
                }

              if (it->c == 0x8a0 || it->c == 0x8ad)

Diff finished at Tue Mar  1 12:48:28

--
 Ehud Karni           Tel: +972-3-7966-561  /"\
 Mivtach - Simon      Fax: +972-3-7966-667  \ /  ASCII Ribbon Campaign
 Insurance agencies   (USA) voice mail and   X   Against   HTML   Mail
 http://www.mvs.co.il  FAX:  1-815-5509341  / \
 GnuPG: 98EA398D <http://www.keyserver.net/>    Better Safe Than Sorry




reply via email to

[Prev in Thread] Current Thread [Next in Thread]