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));