libsemanage: support huge passwd entries
getpwnam_r(3) might return ERANGE in case the supplied buffer was too short for the passwd entry. Retry with a bigger buffer. Signed-off-by: Christian Göttsche <cgzones@googlemail.com> Acked-by: James Carter <jwcart2@gmail.com>
This commit is contained in:
parent
ebf4168577
commit
a1fa1c8ad7
|
@ -985,9 +985,6 @@ static int add_user(genhomedircon_settings_t * s,
|
|||
rbuflen = 1024;
|
||||
else if (rbuflen <= 0)
|
||||
goto cleanup;
|
||||
rbuf = malloc(rbuflen);
|
||||
if (rbuf == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if (user) {
|
||||
prefix = semanage_user_get_prefix(user);
|
||||
|
@ -1005,7 +1002,17 @@ static int add_user(genhomedircon_settings_t * s,
|
|||
homedir_role = prefix;
|
||||
}
|
||||
|
||||
retry:
|
||||
rbuf = malloc(rbuflen);
|
||||
if (rbuf == NULL)
|
||||
goto cleanup;
|
||||
|
||||
retval = getpwnam_r(name, &pwstorage, rbuf, rbuflen, &pwent);
|
||||
if (retval == ERANGE && rbuflen < LONG_MAX / 2) {
|
||||
free(rbuf);
|
||||
rbuflen *= 2;
|
||||
goto retry;
|
||||
}
|
||||
if (retval != 0 || pwent == NULL) {
|
||||
if (retval != 0 && retval != ENOENT) {
|
||||
goto cleanup;
|
||||
|
|
Loading…
Reference in New Issue