diff options
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 64 |
1 files changed, 25 insertions, 39 deletions
diff --git a/src/buffer.c b/src/buffer.c index cacc8a41339..b61d083c3e6 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -2568,13 +2568,10 @@ overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr, | |||
| 2568 | Either make it bigger, or don't store any more in it. */ | 2568 | Either make it bigger, or don't store any more in it. */ |
| 2569 | if (extend) | 2569 | if (extend) |
| 2570 | { | 2570 | { |
| 2571 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | 2571 | vec = xpalloc (vec, len_ptr, 1, OVERLAY_COUNT_MAX, |
| 2572 | memory_full (SIZE_MAX); | 2572 | sizeof *vec); |
| 2573 | /* Make it work with an initial len == 0. */ | ||
| 2574 | len = len * 2 + 4; | ||
| 2575 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | ||
| 2576 | *vec_ptr = vec; | 2573 | *vec_ptr = vec; |
| 2577 | *len_ptr = len; | 2574 | len = *len_ptr; |
| 2578 | } | 2575 | } |
| 2579 | else | 2576 | else |
| 2580 | inhibit_storing = 1; | 2577 | inhibit_storing = 1; |
| @@ -2611,13 +2608,10 @@ overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr, | |||
| 2611 | { | 2608 | { |
| 2612 | if (extend) | 2609 | if (extend) |
| 2613 | { | 2610 | { |
| 2614 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | 2611 | vec = xpalloc (vec, len_ptr, 1, OVERLAY_COUNT_MAX, |
| 2615 | memory_full (SIZE_MAX); | 2612 | sizeof *vec); |
| 2616 | /* Make it work with an initial len == 0. */ | ||
| 2617 | len = len * 2 + 4; | ||
| 2618 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | ||
| 2619 | *vec_ptr = vec; | 2613 | *vec_ptr = vec; |
| 2620 | *len_ptr = len; | 2614 | len = *len_ptr; |
| 2621 | } | 2615 | } |
| 2622 | else | 2616 | else |
| 2623 | inhibit_storing = 1; | 2617 | inhibit_storing = 1; |
| @@ -2708,13 +2702,10 @@ overlays_in (EMACS_INT beg, EMACS_INT end, int extend, | |||
| 2708 | Either make it bigger, or don't store any more in it. */ | 2702 | Either make it bigger, or don't store any more in it. */ |
| 2709 | if (extend) | 2703 | if (extend) |
| 2710 | { | 2704 | { |
| 2711 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | 2705 | vec = xpalloc (vec, len_ptr, 1, OVERLAY_COUNT_MAX, |
| 2712 | memory_full (SIZE_MAX); | 2706 | sizeof *vec); |
| 2713 | /* Make it work with an initial len == 0. */ | ||
| 2714 | len = len * 2 + 4; | ||
| 2715 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | ||
| 2716 | *vec_ptr = vec; | 2707 | *vec_ptr = vec; |
| 2717 | *len_ptr = len; | 2708 | len = *len_ptr; |
| 2718 | } | 2709 | } |
| 2719 | else | 2710 | else |
| 2720 | inhibit_storing = 1; | 2711 | inhibit_storing = 1; |
| @@ -2756,13 +2747,10 @@ overlays_in (EMACS_INT beg, EMACS_INT end, int extend, | |||
| 2756 | { | 2747 | { |
| 2757 | if (extend) | 2748 | if (extend) |
| 2758 | { | 2749 | { |
| 2759 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | 2750 | vec = xpalloc (vec, len_ptr, 1, OVERLAY_COUNT_MAX, |
| 2760 | memory_full (SIZE_MAX); | 2751 | sizeof *vec); |
| 2761 | /* Make it work with an initial len == 0. */ | ||
| 2762 | len = len * 2 + 4; | ||
| 2763 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | ||
| 2764 | *vec_ptr = vec; | 2752 | *vec_ptr = vec; |
| 2765 | *len_ptr = len; | 2753 | len = *len_ptr; |
| 2766 | } | 2754 | } |
| 2767 | else | 2755 | else |
| 2768 | inhibit_storing = 1; | 2756 | inhibit_storing = 1; |
| @@ -2944,7 +2932,7 @@ struct sortstrlist | |||
| 2944 | struct sortstr *buf; /* An array that expands as needed; never freed. */ | 2932 | struct sortstr *buf; /* An array that expands as needed; never freed. */ |
| 2945 | ptrdiff_t size; /* Allocated length of that array. */ | 2933 | ptrdiff_t size; /* Allocated length of that array. */ |
| 2946 | ptrdiff_t used; /* How much of the array is currently in use. */ | 2934 | ptrdiff_t used; /* How much of the array is currently in use. */ |
| 2947 | EMACS_INT bytes; /* Total length of the strings in buf. */ | 2935 | ptrdiff_t bytes; /* Total length of the strings in buf. */ |
| 2948 | }; | 2936 | }; |
| 2949 | 2937 | ||
| 2950 | /* Buffers for storing information about the overlays touching a given | 2938 | /* Buffers for storing information about the overlays touching a given |
| @@ -2977,14 +2965,7 @@ record_overlay_string (struct sortstrlist *ssl, Lisp_Object str, | |||
| 2977 | EMACS_INT nbytes; | 2965 | EMACS_INT nbytes; |
| 2978 | 2966 | ||
| 2979 | if (ssl->used == ssl->size) | 2967 | if (ssl->used == ssl->size) |
| 2980 | { | 2968 | ssl->buf = xpalloc (ssl->buf, &ssl->size, 5, -1, sizeof *ssl->buf); |
| 2981 | ptrdiff_t ssl_size = 0 < ssl->size ? ssl->size * 2 : 5; | ||
| 2982 | if (min (PTRDIFF_MAX, SIZE_MAX) / sizeof (struct sortstr) < ssl_size) | ||
| 2983 | memory_full (SIZE_MAX); | ||
| 2984 | ssl->buf = ((struct sortstr *) | ||
| 2985 | xrealloc (ssl->buf, ssl_size * sizeof (struct sortstr))); | ||
| 2986 | ssl->size = ssl_size; | ||
| 2987 | } | ||
| 2988 | ssl->buf[ssl->used].string = str; | 2969 | ssl->buf[ssl->used].string = str; |
| 2989 | ssl->buf[ssl->used].string2 = str2; | 2970 | ssl->buf[ssl->used].string2 = str2; |
| 2990 | ssl->buf[ssl->used].size = size; | 2971 | ssl->buf[ssl->used].size = size; |
| @@ -2999,6 +2980,8 @@ record_overlay_string (struct sortstrlist *ssl, Lisp_Object str, | |||
| 2999 | else | 2980 | else |
| 3000 | nbytes = SBYTES (str); | 2981 | nbytes = SBYTES (str); |
| 3001 | 2982 | ||
| 2983 | if (INT_ADD_OVERFLOW (ssl->bytes, nbytes)) | ||
| 2984 | memory_full (SIZE_MAX); | ||
| 3002 | ssl->bytes += nbytes; | 2985 | ssl->bytes += nbytes; |
| 3003 | 2986 | ||
| 3004 | if (STRINGP (str2)) | 2987 | if (STRINGP (str2)) |
| @@ -3011,6 +2994,8 @@ record_overlay_string (struct sortstrlist *ssl, Lisp_Object str, | |||
| 3011 | else | 2994 | else |
| 3012 | nbytes = SBYTES (str2); | 2995 | nbytes = SBYTES (str2); |
| 3013 | 2996 | ||
| 2997 | if (INT_ADD_OVERFLOW (ssl->bytes, nbytes)) | ||
| 2998 | memory_full (SIZE_MAX); | ||
| 3014 | ssl->bytes += nbytes; | 2999 | ssl->bytes += nbytes; |
| 3015 | } | 3000 | } |
| 3016 | } | 3001 | } |
| @@ -3104,14 +3089,15 @@ overlay_strings (EMACS_INT pos, struct window *w, unsigned char **pstr) | |||
| 3104 | Lisp_Object tem; | 3089 | Lisp_Object tem; |
| 3105 | EMACS_INT i; | 3090 | EMACS_INT i; |
| 3106 | unsigned char *p; | 3091 | unsigned char *p; |
| 3107 | EMACS_INT total = overlay_heads.bytes + overlay_tails.bytes; | 3092 | ptrdiff_t total; |
| 3108 | 3093 | ||
| 3094 | if (INT_ADD_OVERFLOW (overlay_heads.bytes, overlay_tails.bytes)) | ||
| 3095 | memory_full (SIZE_MAX); | ||
| 3096 | total = overlay_heads.bytes + overlay_tails.bytes; | ||
| 3109 | if (total > overlay_str_len) | 3097 | if (total > overlay_str_len) |
| 3110 | { | 3098 | overlay_str_buf = xpalloc (overlay_str_buf, &overlay_str_len, |
| 3111 | overlay_str_buf = (unsigned char *)xrealloc (overlay_str_buf, | 3099 | total - overlay_str_len, -1, 1); |
| 3112 | total); | 3100 | |
| 3113 | overlay_str_len = total; | ||
| 3114 | } | ||
| 3115 | p = overlay_str_buf; | 3101 | p = overlay_str_buf; |
| 3116 | for (i = overlay_tails.used; --i >= 0;) | 3102 | for (i = overlay_tails.used; --i >= 0;) |
| 3117 | { | 3103 | { |