diff options
| author | Paul Eggert | 2011-08-29 12:58:56 -0700 |
|---|---|---|
| committer | Paul Eggert | 2011-08-29 12:58:56 -0700 |
| commit | 670741ab04da51fa86058b6a88f0923adfcea1b2 (patch) | |
| tree | 49e1671092bec25c27dec0647387df1e7e09ef00 /src | |
| parent | 80f2e268a31679c363e0fa2c660d8dca53871aed (diff) | |
| download | emacs-670741ab04da51fa86058b6a88f0923adfcea1b2.tar.gz emacs-670741ab04da51fa86058b6a88f0923adfcea1b2.zip | |
* xfaces.c (x_update_menu_appearance): Don't overrun buffer
if X resource line is longer than 512 bytes.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 3 | ||||
| -rw-r--r-- | src/xfaces.c | 35 |
2 files changed, 24 insertions, 14 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 97d1ea08db1..aeb984ee8df 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -91,6 +91,9 @@ | |||
| 91 | * term.c (produce_glyphless_glyph): Make sprintf buffer a bit bigger | 91 | * term.c (produce_glyphless_glyph): Make sprintf buffer a bit bigger |
| 92 | to avoid potential buffer overrun. | 92 | to avoid potential buffer overrun. |
| 93 | 93 | ||
| 94 | * xfaces.c (x_update_menu_appearance): Don't overrun buffer | ||
| 95 | if X resource line is longer than 512 bytes. | ||
| 96 | |||
| 94 | 2011-08-26 Paul Eggert <eggert@cs.ucla.edu> | 97 | 2011-08-26 Paul Eggert <eggert@cs.ucla.edu> |
| 95 | 98 | ||
| 96 | Integer and memory overflow issues (Bug#9196). | 99 | Integer and memory overflow issues (Bug#9196). |
diff --git a/src/xfaces.c b/src/xfaces.c index 431ca07b8df..47d55f4da4b 100644 --- a/src/xfaces.c +++ b/src/xfaces.c | |||
| @@ -3549,6 +3549,8 @@ x_update_menu_appearance (struct frame *f) | |||
| 3549 | rdb != NULL)) | 3549 | rdb != NULL)) |
| 3550 | { | 3550 | { |
| 3551 | char line[512]; | 3551 | char line[512]; |
| 3552 | char *buf = line; | ||
| 3553 | ptrdiff_t bufsize = sizeof line; | ||
| 3552 | Lisp_Object lface = lface_from_face_name (f, Qmenu, 1); | 3554 | Lisp_Object lface = lface_from_face_name (f, Qmenu, 1); |
| 3553 | struct face *face = FACE_FROM_ID (f, MENU_FACE_ID); | 3555 | struct face *face = FACE_FROM_ID (f, MENU_FACE_ID); |
| 3554 | const char *myname = SSDATA (Vx_resource_name); | 3556 | const char *myname = SSDATA (Vx_resource_name); |
| @@ -3561,24 +3563,25 @@ x_update_menu_appearance (struct frame *f) | |||
| 3561 | 3563 | ||
| 3562 | if (STRINGP (LFACE_FOREGROUND (lface))) | 3564 | if (STRINGP (LFACE_FOREGROUND (lface))) |
| 3563 | { | 3565 | { |
| 3564 | sprintf (line, "%s.%s*foreground: %s", | 3566 | exprintf (&buf, &bufsize, line, -1, "%s.%s*foreground: %s", |
| 3565 | myname, popup_path, | 3567 | myname, popup_path, |
| 3566 | SDATA (LFACE_FOREGROUND (lface))); | 3568 | SDATA (LFACE_FOREGROUND (lface))); |
| 3567 | XrmPutLineResource (&rdb, line); | 3569 | XrmPutLineResource (&rdb, line); |
| 3568 | sprintf (line, "%s.pane.menubar*foreground: %s", | 3570 | exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*foreground: %s", |
| 3569 | myname, SDATA (LFACE_FOREGROUND (lface))); | 3571 | myname, SDATA (LFACE_FOREGROUND (lface))); |
| 3570 | XrmPutLineResource (&rdb, line); | 3572 | XrmPutLineResource (&rdb, line); |
| 3571 | changed_p = 1; | 3573 | changed_p = 1; |
| 3572 | } | 3574 | } |
| 3573 | 3575 | ||
| 3574 | if (STRINGP (LFACE_BACKGROUND (lface))) | 3576 | if (STRINGP (LFACE_BACKGROUND (lface))) |
| 3575 | { | 3577 | { |
| 3576 | sprintf (line, "%s.%s*background: %s", | 3578 | exprintf (&buf, &bufsize, line, -1, "%s.%s*background: %s", |
| 3577 | myname, popup_path, | 3579 | myname, popup_path, |
| 3578 | SDATA (LFACE_BACKGROUND (lface))); | 3580 | SDATA (LFACE_BACKGROUND (lface))); |
| 3579 | XrmPutLineResource (&rdb, line); | 3581 | XrmPutLineResource (&rdb, line); |
| 3580 | sprintf (line, "%s.pane.menubar*background: %s", | 3582 | |
| 3581 | myname, SDATA (LFACE_BACKGROUND (lface))); | 3583 | exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*background: %s", |
| 3584 | myname, SDATA (LFACE_BACKGROUND (lface))); | ||
| 3582 | XrmPutLineResource (&rdb, line); | 3585 | XrmPutLineResource (&rdb, line); |
| 3583 | changed_p = 1; | 3586 | changed_p = 1; |
| 3584 | } | 3587 | } |
| @@ -3616,11 +3619,12 @@ x_update_menu_appearance (struct frame *f) | |||
| 3616 | #else | 3619 | #else |
| 3617 | char *fontsetname = SSDATA (xlfd); | 3620 | char *fontsetname = SSDATA (xlfd); |
| 3618 | #endif | 3621 | #endif |
| 3619 | sprintf (line, "%s.pane.menubar*font%s: %s", | 3622 | exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*font%s: %s", |
| 3620 | myname, suffix, fontsetname); | 3623 | myname, suffix, fontsetname); |
| 3621 | XrmPutLineResource (&rdb, line); | 3624 | XrmPutLineResource (&rdb, line); |
| 3622 | sprintf (line, "%s.%s*font%s: %s", | 3625 | |
| 3623 | myname, popup_path, suffix, fontsetname); | 3626 | exprintf (&buf, &bufsize, line, -1, "%s.%s*font%s: %s", |
| 3627 | myname, popup_path, suffix, fontsetname); | ||
| 3624 | XrmPutLineResource (&rdb, line); | 3628 | XrmPutLineResource (&rdb, line); |
| 3625 | changed_p = 1; | 3629 | changed_p = 1; |
| 3626 | if (fontsetname != SSDATA (xlfd)) | 3630 | if (fontsetname != SSDATA (xlfd)) |
| @@ -3630,6 +3634,9 @@ x_update_menu_appearance (struct frame *f) | |||
| 3630 | 3634 | ||
| 3631 | if (changed_p && f->output_data.x->menubar_widget) | 3635 | if (changed_p && f->output_data.x->menubar_widget) |
| 3632 | free_frame_menubar (f); | 3636 | free_frame_menubar (f); |
| 3637 | |||
| 3638 | if (buf != line) | ||
| 3639 | xfree (buf); | ||
| 3633 | } | 3640 | } |
| 3634 | } | 3641 | } |
| 3635 | 3642 | ||