diff options
| author | Eli Zaretskii | 2013-01-19 22:04:33 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2013-01-19 22:04:33 +0200 |
| commit | 59ac2d1316937bb013ef437885dcdc0225c71de9 (patch) | |
| tree | e2272769f60a36aeb74f8f01b479b597455f0065 | |
| parent | 3a955a1f8617ae65709772863a4cb8bb9ec73de7 (diff) | |
| download | emacs-59ac2d1316937bb013ef437885dcdc0225c71de9.tar.gz emacs-59ac2d1316937bb013ef437885dcdc0225c71de9.zip | |
Fix crashes with lots of overlays.
src/editfns.c (get_pos_property): Use SAFE_ALLOCA_LISP, to avoid
segfault when there are lots of overlays.
src/buffer.c (sort_overlays): Use SAFE_NALLOCA, to avoid segfault
when there are lots of overlays. See
http://lists.gnu.org/archive/html/emacs-devel/2013-01/msg00421.html
for the details and a way to reproduce.
| -rw-r--r-- | src/ChangeLog | 10 | ||||
| -rw-r--r-- | src/buffer.c | 7 | ||||
| -rw-r--r-- | src/editfns.c | 5 |
3 files changed, 20 insertions, 2 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index c66963738bd..2564e57a825 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,13 @@ | |||
| 1 | 2013-01-19 Eli Zaretskii <eliz@gnu.org> | ||
| 2 | |||
| 3 | * editfns.c (get_pos_property): Use SAFE_ALLOCA_LISP, to avoid | ||
| 4 | segfault when there are lots of overlays. | ||
| 5 | |||
| 6 | * buffer.c (sort_overlays): Use SAFE_NALLOCA, to avoid segfault | ||
| 7 | when there are lots of overlays. See | ||
| 8 | http://lists.gnu.org/archive/html/emacs-devel/2013-01/msg00421.html | ||
| 9 | for the details and a way to reproduce. | ||
| 10 | |||
| 1 | 2013-01-19 Paul Eggert <eggert@cs.ucla.edu> | 11 | 2013-01-19 Paul Eggert <eggert@cs.ucla.edu> |
| 2 | 12 | ||
| 3 | * fileio.c: Use O_APPEND to append. | 13 | * fileio.c: Use O_APPEND to append. |
diff --git a/src/buffer.c b/src/buffer.c index 66581cb7828..aa3fcf8c234 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -3151,7 +3151,10 @@ ptrdiff_t | |||
| 3151 | sort_overlays (Lisp_Object *overlay_vec, ptrdiff_t noverlays, struct window *w) | 3151 | sort_overlays (Lisp_Object *overlay_vec, ptrdiff_t noverlays, struct window *w) |
| 3152 | { | 3152 | { |
| 3153 | ptrdiff_t i, j; | 3153 | ptrdiff_t i, j; |
| 3154 | struct sortvec *sortvec = alloca (noverlays * sizeof *sortvec); | 3154 | USE_SAFE_ALLOCA; |
| 3155 | struct sortvec *sortvec; | ||
| 3156 | |||
| 3157 | SAFE_NALLOCA (sortvec, 1, noverlays); | ||
| 3155 | 3158 | ||
| 3156 | /* Put the valid and relevant overlays into sortvec. */ | 3159 | /* Put the valid and relevant overlays into sortvec. */ |
| 3157 | 3160 | ||
| @@ -3197,6 +3200,8 @@ sort_overlays (Lisp_Object *overlay_vec, ptrdiff_t noverlays, struct window *w) | |||
| 3197 | 3200 | ||
| 3198 | for (i = 0; i < noverlays; i++) | 3201 | for (i = 0; i < noverlays; i++) |
| 3199 | overlay_vec[i] = sortvec[i].overlay; | 3202 | overlay_vec[i] = sortvec[i].overlay; |
| 3203 | |||
| 3204 | SAFE_FREE (); | ||
| 3200 | return (noverlays); | 3205 | return (noverlays); |
| 3201 | } | 3206 | } |
| 3202 | 3207 | ||
diff --git a/src/editfns.c b/src/editfns.c index 197950517b7..020285cf4ec 100644 --- a/src/editfns.c +++ b/src/editfns.c | |||
| @@ -386,6 +386,7 @@ get_pos_property (Lisp_Object position, register Lisp_Object prop, Lisp_Object o | |||
| 386 | ptrdiff_t noverlays; | 386 | ptrdiff_t noverlays; |
| 387 | Lisp_Object *overlay_vec, tem; | 387 | Lisp_Object *overlay_vec, tem; |
| 388 | struct buffer *obuf = current_buffer; | 388 | struct buffer *obuf = current_buffer; |
| 389 | USE_SAFE_ALLOCA; | ||
| 389 | 390 | ||
| 390 | set_buffer_temp (XBUFFER (object)); | 391 | set_buffer_temp (XBUFFER (object)); |
| 391 | 392 | ||
| @@ -398,7 +399,7 @@ get_pos_property (Lisp_Object position, register Lisp_Object prop, Lisp_Object o | |||
| 398 | make enough space for all, and try again. */ | 399 | make enough space for all, and try again. */ |
| 399 | if (noverlays > 40) | 400 | if (noverlays > 40) |
| 400 | { | 401 | { |
| 401 | overlay_vec = alloca (noverlays * sizeof *overlay_vec); | 402 | SAFE_ALLOCA_LISP (overlay_vec, noverlays); |
| 402 | noverlays = overlays_around (posn, overlay_vec, noverlays); | 403 | noverlays = overlays_around (posn, overlay_vec, noverlays); |
| 403 | } | 404 | } |
| 404 | noverlays = sort_overlays (overlay_vec, noverlays, NULL); | 405 | noverlays = sort_overlays (overlay_vec, noverlays, NULL); |
| @@ -421,10 +422,12 @@ get_pos_property (Lisp_Object position, register Lisp_Object prop, Lisp_Object o | |||
| 421 | ; /* The overlay will not cover a char inserted at point. */ | 422 | ; /* The overlay will not cover a char inserted at point. */ |
| 422 | else | 423 | else |
| 423 | { | 424 | { |
| 425 | SAFE_FREE (); | ||
| 424 | return tem; | 426 | return tem; |
| 425 | } | 427 | } |
| 426 | } | 428 | } |
| 427 | } | 429 | } |
| 430 | SAFE_FREE (); | ||
| 428 | 431 | ||
| 429 | { /* Now check the text properties. */ | 432 | { /* Now check the text properties. */ |
| 430 | int stickiness = text_property_stickiness (prop, position, object); | 433 | int stickiness = text_property_stickiness (prop, position, object); |