Fix up group-member, quotearg accordingly.
+2003-10-29 Paul Eggert <eggert@twinsun.com>
+
+ * modules/group-member: Depend on stdbool.
+
2003-10-20 Bruno Haible <bruno@clisp.org>
* modules/wait-process: New file.
2003-10-29 Paul Eggert <eggert@twinsun.com>
+ * xalloc.h (xalloc_oversized): Now a macro, not a function,
+ so that it works even if SIZE_MAX < N. Do not include <stdbool.h>;
+ no longer needed.
+ * quotearg.c (quotearg_n_options): Use it.
+ * group-member.c: Include <stdbool.h>.
+ (free_group_info): Arg is now const *; don't free arg.
+ (get_group_info): Now returns bool and accepts struct group_info *,
+ rather than returning a malloc'ed struct group_info *.
+ All uses changed. Check for overflow in internal size calculation.
+
* getusershell.c (readname): Simplify the code by using x2nrealloc
rather than xmalloc/xrealloc.
* linebuffer.c (initbuffer, readlinebuffer): Simplify the code by
#include "group-member.h"
+#include <stdbool.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#if HAVE_GETGROUPS
static void
-free_group_info (struct group_info *g)
+free_group_info (struct group_info const *g)
{
free (g->group);
- free (g);
}
-static struct group_info *
-get_group_info (void)
+static bool
+get_group_info (struct group_info *gi)
{
int n_groups;
- int n_group_slots;
- struct group_info *gi;
+ int n_group_slots = getgroups (0, NULL);
GETGROUPS_T *group;
- /* getgroups () returns the number of elements that it was able to
- place into the array. We simply continue to call getgroups ()
- until the number of elements placed into the array is smaller than
- the physical size of the array. */
+ if (n_group_slots < 0)
+ return false;
- group = NULL;
- n_groups = 0;
- n_group_slots = 0;
- while (n_groups == n_group_slots)
- {
- n_group_slots += 64;
- group = xrealloc (group, n_group_slots * sizeof (GETGROUPS_T));
- n_groups = getgroups (n_group_slots, group);
- }
+ /* Avoid xnmalloc, as it goes awry when SIZE_MAX < n_group_slots. */
+ if (xalloc_oversized (n_group_slots, sizeof *group))
+ xalloc_die ();
+ group = xmalloc (n_group_slots * sizeof *group);
+ n_groups = getgroups (n_group_slots, group);
/* In case of error, the user loses. */
if (n_groups < 0)
{
free (group);
- return NULL;
+ return false;
}
- gi = xmalloc (sizeof (*gi));
gi->n_groups = n_groups;
gi->group = group;
- return gi;
+ return true;
}
#endif /* not HAVE_GETGROUPS */
#else
int i;
int found;
- struct group_info *gi;
+ struct group_info gi;
- gi = get_group_info ();
- if (gi == NULL)
+ if (! get_group_info (&gi))
return 0;
/* Search through the list looking for GID. */
found = 0;
- for (i = 0; i < gi->n_groups; i++)
+ for (i = 0; i < gi.n_groups; i++)
{
- if (gid == gi->group[i])
+ if (gid == gi.group[i])
{
found = 1;
break;
}
}
- free_group_info (gi);
+ free_group_info (&gi);
return found;
#endif /* HAVE_GETGROUPS */
{
unsigned int n1 = n0 + 1;
- if (SIZE_MAX / sizeof *slotvec < n1)
+ if (xalloc_oversized (n1, sizeof *slotvec))
xalloc_die ();
if (slotvec == &slotvec0)
#ifndef XALLOC_H_
# define XALLOC_H_
-# include <stdbool.h>
# include <stddef.h>
# ifndef __attribute__
void *xclone (void const *p, size_t s);
char *xstrdup (const char *str);
-/* Return true if an array of N objects, each of size S, cannot exist
- due to size arithmetic overflow. S must be nonzero. */
-
-static inline bool
-xalloc_oversized (size_t n, size_t s)
-{
- size_t size_max = -1;
- return size_max / s < n;
-}
+/* Return 1 if an array of N objects, each of size S, cannot exist due
+ to size arithmetic overflow. S must be positive and N must be
+ nonnegative. This is a macro, not an inline function, so that it
+ works correctly even when SIZE_MAX < N. */
+#define xalloc_oversized(n, s) ((size_t) -1 / (s) < (n))
/* These macros are deprecated; they will go away soon, and are retained
temporarily only to ease conversion to the functions described above. */
+2003-10-29 Paul Eggert <eggert@twinsun.com>
+
+ * xalloc.m4 (gl_XALLOC): Undo previous change.
+
2003-10-29 Paul Eggert <eggert@twinsun.com>
* host-os.m4 (UTILS_HOST_OS): Resurrect netbsd*-gnu. Add comments
-# xalloc.m4 serial 5
+# xalloc.m4 serial 6
dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
dnl This file is free software, distributed under the terms of the GNU
dnl General Public License. As a special exception to the GNU General
AC_DEFUN([gl_XALLOC],
[
- AC_REQUIRE([AC_C_INLINE])
gl_PREREQ_XMALLOC
gl_PREREQ_XSTRDUP
])
Depends-on:
xalloc
+stdbool
configure.ac:
jm_FUNC_GROUP_MEMBER