diff options
| author | Paul Eggert | 2011-06-20 00:21:06 -0700 |
|---|---|---|
| committer | Paul Eggert | 2011-06-20 00:21:06 -0700 |
| commit | 171e2a582e4c7d6bfd6d6ff0373720b59568bcb2 (patch) | |
| tree | 4f890becce238ad2856f519f72d647831fef1888 /src/termcap.c | |
| parent | ad39facaee4dcbd0e3f002e0a1674fce00e92c0c (diff) | |
| download | emacs-171e2a582e4c7d6bfd6d6ff0373720b59568bcb2.tar.gz emacs-171e2a582e4c7d6bfd6d6ff0373720b59568bcb2.zip | |
* termcap.c: Don't assume sizes fit in int and never overflow.
(struct termcap_buffer, tgetent): Use ptrdiff_t, not int, for sizes.
(gobble_line): Check for size-calculation overflow.
Diffstat (limited to 'src/termcap.c')
| -rw-r--r-- | src/termcap.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/termcap.c b/src/termcap.c index 5b71ad229d7..e191f6b3af3 100644 --- a/src/termcap.c +++ b/src/termcap.c | |||
| @@ -323,10 +323,10 @@ tputs (register const char *str, int nlines, int (*outfun) (int)) | |||
| 323 | struct termcap_buffer | 323 | struct termcap_buffer |
| 324 | { | 324 | { |
| 325 | char *beg; | 325 | char *beg; |
| 326 | int size; | 326 | ptrdiff_t size; |
| 327 | char *ptr; | 327 | char *ptr; |
| 328 | int ateof; | 328 | int ateof; |
| 329 | int full; | 329 | ptrdiff_t full; |
| 330 | }; | 330 | }; |
| 331 | 331 | ||
| 332 | /* Forward declarations of static functions. */ | 332 | /* Forward declarations of static functions. */ |
| @@ -367,7 +367,7 @@ tgetent (char *bp, const char *name) | |||
| 367 | register char *bp1; | 367 | register char *bp1; |
| 368 | char *tc_search_point; | 368 | char *tc_search_point; |
| 369 | char *term; | 369 | char *term; |
| 370 | int malloc_size = 0; | 370 | ptrdiff_t malloc_size = 0; |
| 371 | register int c; | 371 | register int c; |
| 372 | char *tcenv = NULL; /* TERMCAP value, if it contains :tc=. */ | 372 | char *tcenv = NULL; /* TERMCAP value, if it contains :tc=. */ |
| 373 | char *indirect = NULL; /* Terminal type in :tc= in TERMCAP value. */ | 373 | char *indirect = NULL; /* Terminal type in :tc= in TERMCAP value. */ |
| @@ -637,6 +637,8 @@ gobble_line (int fd, register struct termcap_buffer *bufp, char *append_end) | |||
| 637 | { | 637 | { |
| 638 | if (bufp->full == bufp->size) | 638 | if (bufp->full == bufp->size) |
| 639 | { | 639 | { |
| 640 | if ((PTRDIFF_MAX - 1) / 2 < bufp->size) | ||
| 641 | memory_full (SIZE_MAX); | ||
| 640 | bufp->size *= 2; | 642 | bufp->size *= 2; |
| 641 | /* Add 1 to size to ensure room for terminating null. */ | 643 | /* Add 1 to size to ensure room for terminating null. */ |
| 642 | tem = (char *) xrealloc (buf, bufp->size + 1); | 644 | tem = (char *) xrealloc (buf, bufp->size + 1); |
| @@ -715,4 +717,3 @@ tprint (cap) | |||
| 715 | } | 717 | } |
| 716 | 718 | ||
| 717 | #endif /* TEST */ | 719 | #endif /* TEST */ |
| 718 | |||