+2007-12-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/malloca.h (nmalloca): New macro.
+ * lib/c-strcasestr.c (knuth_morris_pratt): Use it.
+ * lib/c-strstr.c (knuth_morris_pratt): Likewise.
+ * lib/mbscasestr.c (knuth_morris_pratt_unibyte,
+ knuth_morris_pratt_multibyte): Likewise.
+ * lib/mbsstr.c (knuth_morris_pratt_unibyte,
+ knuth_morris_pratt_multibyte): Likewise.
+ * lib/memmem.c (knuth_morris_pratt): Likewise.
+ * lib/strcasestr.c (knuth_morris_pratt): Likewise.
+
2007-12-25 Bruno Haible <bruno@clisp.org>
Fixup after 2007-10-17 commit. Ensure that 'glob' stays under LGPLv2+.
size_t m = strlen (needle);
/* Allocate the table. */
- size_t *table = (size_t *) malloca (m * sizeof (size_t));
+ size_t *table = (size_t *) nmalloca (m, sizeof (size_t));
if (table == NULL)
return false;
/* Fill the table.
size_t m = strlen (needle);
/* Allocate the table. */
- size_t *table = (size_t *) malloca (m * sizeof (size_t));
+ size_t *table = (size_t *) nmalloca (m, sizeof (size_t));
if (table == NULL)
return false;
/* Fill the table.
# define freea free
#endif
-/* Maybe we should also define a variant
- nmalloca (size_t n, size_t s) - behaves like malloca (n * s)
- If this would be useful in your application. please speak up. */
+/* nmalloca(N,S) is an overflow-safe variant of malloca (N * S).
+ It allocates an array of N objects, each with S bytes of memory,
+ on the stack. S must be positive and N must be nonnegative.
+ The array must be freed using freea() before the function returns. */
+#if 1
+/* Cf. the definition of xalloc_oversized. */
+# define nmalloca(n, s) \
+ ((n) > (size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) \
+ ? NULL \
+ : malloca ((n) * (s)))
+#else
+extern void * nmalloca (size_t n, size_t s);
+#endif
#ifdef __cplusplus
size_t m = strlen (needle);
/* Allocate the table. */
- size_t *table = (size_t *) malloca (m * sizeof (size_t));
+ size_t *table = (size_t *) nmalloca (m, sizeof (size_t));
if (table == NULL)
return false;
/* Fill the table.
size_t *table;
/* Allocate room for needle_mbchars and the table. */
- char *memory = (char *) malloca (m * (sizeof (mbchar_t) + sizeof (size_t)));
+ char *memory = (char *) nmalloca (m, sizeof (mbchar_t) + sizeof (size_t));
if (memory == NULL)
return false;
needle_mbchars = (mbchar_t *) memory;
size_t m = strlen (needle);
/* Allocate the table. */
- size_t *table = (size_t *) malloca (m * sizeof (size_t));
+ size_t *table = (size_t *) nmalloca (m, sizeof (size_t));
if (table == NULL)
return false;
/* Fill the table.
size_t *table;
/* Allocate room for needle_mbchars and the table. */
- char *memory = (char *) malloca (m * (sizeof (mbchar_t) + sizeof (size_t)));
+ char *memory = (char *) nmalloca (m, sizeof (mbchar_t) + sizeof (size_t));
if (memory == NULL)
return false;
needle_mbchars = (mbchar_t *) memory;
const char **resultp)
{
/* Allocate the table. */
- size_t *table;
- if ((size_t) -1 / sizeof (size_t) < m)
- return false;
- table = (size_t *) malloca (m * sizeof (size_t));
+ size_t *table = (size_t *) nmalloca (m, sizeof (size_t));
if (table == NULL)
return false;
/* Fill the table.
size_t m = strlen (needle);
/* Allocate the table. */
- size_t *table = (size_t *) malloca (m * sizeof (size_t));
+ size_t *table = (size_t *) nmalloca (m, sizeof (size_t));
if (table == NULL)
return false;
/* Fill the table.