diff options
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 69 |
1 files changed, 26 insertions, 43 deletions
diff --git a/src/buffer.c b/src/buffer.c index 832044ae6f4..37d2975c8c7 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -2557,13 +2557,10 @@ overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr, | |||
| 2557 | Either make it bigger, or don't store any more in it. */ | 2557 | Either make it bigger, or don't store any more in it. */ |
| 2558 | if (extend) | 2558 | if (extend) |
| 2559 | { | 2559 | { |
| 2560 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | 2560 | vec = xpalloc (vec, len_ptr, 1, OVERLAY_COUNT_MAX, |
| 2561 | memory_full (SIZE_MAX); | 2561 | sizeof *vec); |
| 2562 | /* Make it work with an initial len == 0. */ | ||
| 2563 | len = len * 2 + 4; | ||
| 2564 | *len_ptr = len; | ||
| 2565 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | ||
| 2566 | *vec_ptr = vec; | 2562 | *vec_ptr = vec; |
| 2563 | len = *len_ptr; | ||
| 2567 | } | 2564 | } |
| 2568 | else | 2565 | else |
| 2569 | inhibit_storing = 1; | 2566 | inhibit_storing = 1; |
| @@ -2600,13 +2597,10 @@ overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr, | |||
| 2600 | { | 2597 | { |
| 2601 | if (extend) | 2598 | if (extend) |
| 2602 | { | 2599 | { |
| 2603 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | 2600 | vec = xpalloc (vec, len_ptr, 1, OVERLAY_COUNT_MAX, |
| 2604 | memory_full (SIZE_MAX); | 2601 | sizeof *vec); |
| 2605 | /* Make it work with an initial len == 0. */ | ||
| 2606 | len = len * 2 + 4; | ||
| 2607 | *len_ptr = len; | ||
| 2608 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | ||
| 2609 | *vec_ptr = vec; | 2602 | *vec_ptr = vec; |
| 2603 | len = *len_ptr; | ||
| 2610 | } | 2604 | } |
| 2611 | else | 2605 | else |
| 2612 | inhibit_storing = 1; | 2606 | inhibit_storing = 1; |
| @@ -2697,13 +2691,10 @@ overlays_in (EMACS_INT beg, EMACS_INT end, int extend, | |||
| 2697 | Either make it bigger, or don't store any more in it. */ | 2691 | Either make it bigger, or don't store any more in it. */ |
| 2698 | if (extend) | 2692 | if (extend) |
| 2699 | { | 2693 | { |
| 2700 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | 2694 | vec = xpalloc (vec, len_ptr, 1, OVERLAY_COUNT_MAX, |
| 2701 | memory_full (SIZE_MAX); | 2695 | sizeof *vec); |
| 2702 | /* Make it work with an initial len == 0. */ | ||
| 2703 | len = len * 2 + 4; | ||
| 2704 | *len_ptr = len; | ||
| 2705 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | ||
| 2706 | *vec_ptr = vec; | 2696 | *vec_ptr = vec; |
| 2697 | len = *len_ptr; | ||
| 2707 | } | 2698 | } |
| 2708 | else | 2699 | else |
| 2709 | inhibit_storing = 1; | 2700 | inhibit_storing = 1; |
| @@ -2745,13 +2736,10 @@ overlays_in (EMACS_INT beg, EMACS_INT end, int extend, | |||
| 2745 | { | 2736 | { |
| 2746 | if (extend) | 2737 | if (extend) |
| 2747 | { | 2738 | { |
| 2748 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | 2739 | vec = xpalloc (vec, len_ptr, 1, OVERLAY_COUNT_MAX, |
| 2749 | memory_full (SIZE_MAX); | 2740 | sizeof *vec); |
| 2750 | /* Make it work with an initial len == 0. */ | ||
| 2751 | len = len * 2 + 4; | ||
| 2752 | *len_ptr = len; | ||
| 2753 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | ||
| 2754 | *vec_ptr = vec; | 2741 | *vec_ptr = vec; |
| 2742 | len = *len_ptr; | ||
| 2755 | } | 2743 | } |
| 2756 | else | 2744 | else |
| 2757 | inhibit_storing = 1; | 2745 | inhibit_storing = 1; |
| @@ -2933,7 +2921,7 @@ struct sortstrlist | |||
| 2933 | struct sortstr *buf; /* An array that expands as needed; never freed. */ | 2921 | struct sortstr *buf; /* An array that expands as needed; never freed. */ |
| 2934 | ptrdiff_t size; /* Allocated length of that array. */ | 2922 | ptrdiff_t size; /* Allocated length of that array. */ |
| 2935 | ptrdiff_t used; /* How much of the array is currently in use. */ | 2923 | ptrdiff_t used; /* How much of the array is currently in use. */ |
| 2936 | EMACS_INT bytes; /* Total length of the strings in buf. */ | 2924 | ptrdiff_t bytes; /* Total length of the strings in buf. */ |
| 2937 | }; | 2925 | }; |
| 2938 | 2926 | ||
| 2939 | /* Buffers for storing information about the overlays touching a given | 2927 | /* Buffers for storing information about the overlays touching a given |
| @@ -2944,7 +2932,7 @@ static struct sortstrlist overlay_heads, overlay_tails; | |||
| 2944 | static unsigned char *overlay_str_buf; | 2932 | static unsigned char *overlay_str_buf; |
| 2945 | 2933 | ||
| 2946 | /* Allocated length of overlay_str_buf. */ | 2934 | /* Allocated length of overlay_str_buf. */ |
| 2947 | static EMACS_INT overlay_str_len; | 2935 | static ptrdiff_t overlay_str_len; |
| 2948 | 2936 | ||
| 2949 | /* A comparison function suitable for passing to qsort. */ | 2937 | /* A comparison function suitable for passing to qsort. */ |
| 2950 | static int | 2938 | static int |
| @@ -2966,17 +2954,7 @@ record_overlay_string (struct sortstrlist *ssl, Lisp_Object str, | |||
| 2966 | EMACS_INT nbytes; | 2954 | EMACS_INT nbytes; |
| 2967 | 2955 | ||
| 2968 | if (ssl->used == ssl->size) | 2956 | if (ssl->used == ssl->size) |
| 2969 | { | 2957 | ssl->buf = xpalloc (ssl->buf, &ssl->size, 5, -1, sizeof *ssl->buf); |
| 2970 | if (min (PTRDIFF_MAX, SIZE_MAX) / (sizeof (struct sortstr) * 2) | ||
| 2971 | < ssl->size) | ||
| 2972 | memory_full (SIZE_MAX); | ||
| 2973 | else if (0 < ssl->size) | ||
| 2974 | ssl->size *= 2; | ||
| 2975 | else | ||
| 2976 | ssl->size = 5; | ||
| 2977 | ssl->buf = ((struct sortstr *) | ||
| 2978 | xrealloc (ssl->buf, ssl->size * sizeof (struct sortstr))); | ||
| 2979 | } | ||
| 2980 | ssl->buf[ssl->used].string = str; | 2958 | ssl->buf[ssl->used].string = str; |
| 2981 | ssl->buf[ssl->used].string2 = str2; | 2959 | ssl->buf[ssl->used].string2 = str2; |
| 2982 | ssl->buf[ssl->used].size = size; | 2960 | ssl->buf[ssl->used].size = size; |
| @@ -2991,6 +2969,8 @@ record_overlay_string (struct sortstrlist *ssl, Lisp_Object str, | |||
| 2991 | else | 2969 | else |
| 2992 | nbytes = SBYTES (str); | 2970 | nbytes = SBYTES (str); |
| 2993 | 2971 | ||
| 2972 | if (INT_ADD_OVERFLOW (ssl->bytes, nbytes)) | ||
| 2973 | memory_full (SIZE_MAX); | ||
| 2994 | ssl->bytes += nbytes; | 2974 | ssl->bytes += nbytes; |
| 2995 | 2975 | ||
| 2996 | if (STRINGP (str2)) | 2976 | if (STRINGP (str2)) |
| @@ -3003,6 +2983,8 @@ record_overlay_string (struct sortstrlist *ssl, Lisp_Object str, | |||
| 3003 | else | 2983 | else |
| 3004 | nbytes = SBYTES (str2); | 2984 | nbytes = SBYTES (str2); |
| 3005 | 2985 | ||
| 2986 | if (INT_ADD_OVERFLOW (ssl->bytes, nbytes)) | ||
| 2987 | memory_full (SIZE_MAX); | ||
| 3006 | ssl->bytes += nbytes; | 2988 | ssl->bytes += nbytes; |
| 3007 | } | 2989 | } |
| 3008 | } | 2990 | } |
| @@ -3096,14 +3078,15 @@ overlay_strings (EMACS_INT pos, struct window *w, unsigned char **pstr) | |||
| 3096 | Lisp_Object tem; | 3078 | Lisp_Object tem; |
| 3097 | EMACS_INT i; | 3079 | EMACS_INT i; |
| 3098 | unsigned char *p; | 3080 | unsigned char *p; |
| 3099 | EMACS_INT total = overlay_heads.bytes + overlay_tails.bytes; | 3081 | ptrdiff_t total; |
| 3100 | 3082 | ||
| 3083 | if (INT_ADD_OVERFLOW (overlay_heads.bytes, overlay_tails.bytes)) | ||
| 3084 | memory_full (SIZE_MAX); | ||
| 3085 | total = overlay_heads.bytes + overlay_tails.bytes; | ||
| 3101 | if (total > overlay_str_len) | 3086 | if (total > overlay_str_len) |
| 3102 | { | 3087 | overlay_str_buf = xpalloc (overlay_str_buf, &overlay_str_len, |
| 3103 | overlay_str_len = total; | 3088 | total - overlay_str_len, -1, 1); |
| 3104 | overlay_str_buf = (unsigned char *)xrealloc (overlay_str_buf, | 3089 | |
| 3105 | total); | ||
| 3106 | } | ||
| 3107 | p = overlay_str_buf; | 3090 | p = overlay_str_buf; |
| 3108 | for (i = overlay_tails.used; --i >= 0;) | 3091 | for (i = overlay_tails.used; --i >= 0;) |
| 3109 | { | 3092 | { |