aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorJoakim Verona2011-08-27 19:45:48 +0200
committerJoakim Verona2011-08-27 19:45:48 +0200
commit9fb7b0cab34a48a4c7b66abb6b8edc4ee20467b4 (patch)
treee94476d49f15747fcb9409d773702e88201855a4 /src/buffer.c
parentc7489583c30031c0ecfae9d20b20c149ca1935e9 (diff)
parentb75258b32810f3690442bddef2e10eef126d2d25 (diff)
downloademacs-9fb7b0cab34a48a4c7b66abb6b8edc4ee20467b4.tar.gz
emacs-9fb7b0cab34a48a4c7b66abb6b8edc4ee20467b4.zip
upstream
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c69
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;
2944static unsigned char *overlay_str_buf; 2932static unsigned char *overlay_str_buf;
2945 2933
2946/* Allocated length of overlay_str_buf. */ 2934/* Allocated length of overlay_str_buf. */
2947static EMACS_INT overlay_str_len; 2935static 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. */
2950static int 2938static 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 {