From: Akim Demaille <akim@epita.fr> Date: Fri, 30 Nov 2001 14:04:24 +0000 (+0000) Subject: * lib/quotearg.h (quotearg_n, quotearg_n_style): X-Git-Tag: before-m4-back-end~222 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/f4e421e6e4e6f500c9721140c32f4d5bf300b185 * lib/quotearg.h (quotearg_n, quotearg_n_style): First arg is int, not unsigned. * lib/quotearg.c (quotearg_n, quotearg_n_style): Likewise. (SIZE_MAX, UINT_MAX): New macros. (quotearg_n_options): Abort if N is negative. Avoid overflow check on hosts where size_t is 64 bits and int is 32 bits, as overflow is impossible there. Fix off-by-one typo that caused unnecessary reallocation. --- diff --git a/ChangeLog b/ChangeLog index 164460e5..6d3ac89f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2001-11-27 Paul Eggert <eggert@twinsun.com> + + * lib/quotearg.h (quotearg_n, quotearg_n_style): + First arg is int, not unsigned. + * lib/quotearg.c (quotearg_n, quotearg_n_style): Likewise. + (SIZE_MAX, UINT_MAX): New macros. + (quotearg_n_options): Abort if N is negative. + Avoid overflow check on hosts where size_t is 64 bits and int + is 32 bits, as overflow is impossible there. + Fix off-by-one typo that caused unnecessary reallocation. + 2001-11-29 Paul Eggert <eggert@twinsun.com> Name space cleanup in generated parser. diff --git a/lib/quotearg.c b/lib/quotearg.c index ca42365e..58df4e2e 100644 --- a/lib/quotearg.c +++ b/lib/quotearg.c @@ -44,9 +44,15 @@ #ifndef CHAR_BIT # define CHAR_BIT 8 #endif +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif #ifndef UCHAR_MAX # define UCHAR_MAX ((unsigned char) -1) #endif +#ifndef UINT_MAX +# define UINT_MAX ((unsigned int) -1) +#endif #if HAVE_C_BACKSLASH_A # define ALERT_CHAR '\a' @@ -539,6 +545,7 @@ quotearg_n_options (int n, char const *arg, one small component of a "memory exhausted" message in slot 0. */ static char slot0[256]; static unsigned int nslots = 1; + unsigned int n0 = n; struct slotvec { size_t size; @@ -547,20 +554,26 @@ quotearg_n_options (int n, char const *arg, static struct slotvec slotvec0 = {sizeof slot0, slot0}; static struct slotvec *slotvec = &slotvec0; - if (nslots <= n) + if (n < 0) + abort (); + + if (nslots <= n0) { - int n1 = n + 1; - size_t s = n1 * sizeof (struct slotvec); - if (! (0 < n1 && n1 == s / sizeof (struct slotvec))) - abort (); + unsigned int n1 = n0 + 1; + size_t s = n1 * sizeof *slotvec; + + if (SIZE_MAX / UINT_MAX <= sizeof *slotvec + && n1 != s / sizeof *slotvec) + xalloc_die (); + if (slotvec == &slotvec0) { - slotvec = (struct slotvec *) xmalloc (sizeof (struct slotvec)); + slotvec = (struct slotvec *) xmalloc (sizeof *slotvec); *slotvec = slotvec0; } slotvec = (struct slotvec *) xrealloc (slotvec, s); - memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec)); - nslots = n; + memset (slotvec + nslots, 0, (n1 - nslots) * sizeof *slotvec); + nslots = n1; } { @@ -580,7 +593,7 @@ quotearg_n_options (int n, char const *arg, } char * -quotearg_n (unsigned int n, char const *arg) +quotearg_n (int n, char const *arg) { return quotearg_n_options (n, arg, &default_quoting_options); } @@ -592,7 +605,7 @@ quotearg (char const *arg) } char * -quotearg_n_style (unsigned int n, enum quoting_style s, char const *arg) +quotearg_n_style (int n, enum quoting_style s, char const *arg) { struct quoting_options o; o.style = s; diff --git a/lib/quotearg.h b/lib/quotearg.h index f6463b1a..09000bf6 100644 --- a/lib/quotearg.h +++ b/lib/quotearg.h @@ -89,7 +89,7 @@ size_t quotearg_buffer PARAMS ((char *buffer, size_t buffersize, The returned value points to static storage that can be reused by the next call to this function with the same value of N. N must be nonnegative. */ -char *quotearg_n PARAMS ((unsigned int n, char const *arg)); +char *quotearg_n PARAMS ((int n, char const *arg)); /* Equivalent to quotearg_n (0, ARG). */ char *quotearg PARAMS ((char const *arg)); @@ -97,8 +97,7 @@ char *quotearg PARAMS ((char const *arg)); /* Use style S and storage slot N to return a quoted version of the string ARG. This is like quotearg_n (N, ARG), except that it uses S with no other options to specify the quoting method. */ -char *quotearg_n_style PARAMS ((unsigned int n, enum quoting_style s, - char const *arg)); +char *quotearg_n_style PARAMS ((int n, enum quoting_style s, char const *arg)); /* Equivalent to quotearg_n_style (0, S, ARG). */ char *quotearg_style PARAMS ((enum quoting_style s, char const *arg));