https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89819

Jeffrey A. Law <law at redhat dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |law at redhat dot com

--- Comment #2 from Jeffrey A. Law <law at redhat dot com> ---
Somewhat trimmed down testcase...  Certainly easier to analyze...

typedef __SIZE_TYPE__ size_t;
typedef unsigned long int uintmax_t;

struct group
{
  char *gr_name;
  char *gr_passwd;
  unsigned gr_gid;
  char **gr_mem;
};

struct passwd
{
  char *pw_name;
  char *pw_passwd;

  unsigned pw_uid;
  unsigned pw_gid;
  char *pw_gecos;
  char *pw_dir;
  char *pw_shell;
};

extern struct group *getgrnam (const char *);
extern struct group *getgrgid (unsigned);
extern void endgrent (void);
extern struct passwd *getpwnam (const char *);
extern void endpwent (void);
extern unsigned long int strtoul (const char *__restrict,
                                  char **__restrict, int);

char const *
parse_with_separator (char const *spec, char const *separator,
                      unsigned *uid, unsigned *gid,
                      char **username, char **groupname)
{
  static const char *E_bad_spec = "invalid spec";
  const char *error_msg;
  char *u;
  char const *g;
  struct group *grp;
  unsigned unum = *uid;

  error_msg = 0;

  u = 0;
  if (separator == 0)
    u = __builtin_strdup (spec);
  size_t ulen = separator - spec;
  u = __builtin_malloc (ulen + 1);

  g = (separator == 0 || *(separator + 1) == '\0' ? 0 : separator + 1);

  if (u != 0)
    {
      _Bool use_login_group = (separator != 0 && g == 0);
      if (use_login_group)
        error_msg = E_bad_spec;

      endpwent ();
    }

  if (g != 0 && error_msg == 0)
    grp = (*g == '+' ? 0 : getgrnam (g));

  if (error_msg == 0)
    *uid = unum;

  return 0;
}

Reply via email to