Fix unportable gid_t parsing in fgetgrent_r(3).

This commit is contained in:
Jonas 'Sortie' Termansen 2013-12-28 21:48:28 +01:00
parent ac3928bfc8
commit ace4a6cc54
1 changed files with 20 additions and 10 deletions

View File

@ -49,19 +49,29 @@ static char* next_field(char** current)
return result; return result;
} }
static id_t next_field_id(char** current) static bool next_field_uintmax(char** current, uintmax_t* result)
{ {
char* id_str = next_field(current); char* id_str = next_field(current);
if ( !id_str ) if ( !id_str )
return -1; return false;
char* id_endptr; char* id_endptr;
intmax_t id_imax = strtoimax(id_str, &id_endptr, 10); uintmax_t id_umax = strtoumax(id_str, &id_endptr, 10);
if ( id_imax < 0 || *id_endptr ) if ( *id_endptr )
return -1; return false;
id_t id = (id_t) id_imax; *result = id_umax;
if ( id != id_imax ) return true;
return -1; }
return id;
static gid_t next_field_gid(char** current, gid_t* result)
{
uintmax_t id_umax;
if ( !next_field_uintmax(current, &id_umax) )
return false;
gid_t gid = (gid_t) id_umax;
if ( (uintmax_t) gid != (uintmax_t) id_umax )
return false;
*result = gid;
return true;
} }
static size_t count_num_members(const char* member_string) static size_t count_num_members(const char* member_string)
@ -177,7 +187,7 @@ int fgetgrent_r(FILE* restrict fp,
goto parse_failure; goto parse_failure;
if ( !(result->gr_passwd = next_field(&parse_str)) ) if ( !(result->gr_passwd = next_field(&parse_str)) )
goto parse_failure; goto parse_failure;
if ( !(result->gr_gid = next_field_id(&parse_str)) < 0 ) if ( !next_field_gid(&parse_str, &result->gr_gid) )
goto parse_failure; goto parse_failure;
char* member_string; char* member_string;
if ( !(member_string = next_field(&parse_str)) ) if ( !(member_string = next_field(&parse_str)) )