diff --git a/src/ChangeLog b/src/ChangeLog index c3eaaa4ff2decf6be32ef550e3a01b9e2c853917..1be34fdbfe2d75e484dd1bebb4dc7951c25f9721 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,9 @@ 2011-06-23 Paul Eggert + * minibuf.c (read_minibuf_noninteractive): Use ptrdiff_t, not int, + for sizes. Check for string overflow more accurately. + Simplify newline removal at end; this suppresses a GCC 4.6.0 warning. + * macros.c: Integer and buffer overflow fixes. * keyboard.h (struct keyboard.kbd_macro_bufsize): * macros.c (Fstart_kbd_macro, store_kbd_macro_char): diff --git a/src/minibuf.c b/src/minibuf.c index ca2f22df9edef6267b6099958e48122e1f9cf21e..2b5e94ad35689c2543bf979a12bef82252381ddf 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -237,7 +237,7 @@ read_minibuf_noninteractive (Lisp_Object map, Lisp_Object initial, Lisp_Object defalt, int allow_props, int inherit_input_method) { - size_t size, len; + ptrdiff_t size, len; char *line, *s; Lisp_Object val; @@ -247,12 +247,12 @@ read_minibuf_noninteractive (Lisp_Object map, Lisp_Object initial, val = Qnil; size = 100; len = 0; - line = (char *) xmalloc (size * sizeof *line); + line = (char *) xmalloc (size); while ((s = fgets (line + len, size - len, stdin)) != NULL && (len = strlen (line), len == size - 1 && line[len - 1] != '\n')) { - if ((size_t) -1 / 2 < size) + if (STRING_BYTES_BOUND / 2 < size) memory_full (SIZE_MAX); size *= 2; line = (char *) xrealloc (line, size); @@ -260,11 +260,9 @@ read_minibuf_noninteractive (Lisp_Object map, Lisp_Object initial, if (s) { - len = strlen (line); - - if (len > 0 && line[len - 1] == '\n') - line[--len] = '\0'; - + char *nl = strchr (line, '\n'); + if (nl) + *nl = '\0'; val = build_string (line); xfree (line); }