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:
Christian Göttsche 2023-12-19 17:09:31 +01:00 committed by James Carter
parent ebf4168577
commit a1fa1c8ad7
1 changed files with 10 additions and 3 deletions

View File

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