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