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@xxxxxxxxxxxxxx> --- libsemanage/src/genhomedircon.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/libsemanage/src/genhomedircon.c b/libsemanage/src/genhomedircon.c index 66585987..ecb34fc7 100644 --- a/libsemanage/src/genhomedircon.c +++ b/libsemanage/src/genhomedircon.c @@ -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; -- 2.43.0