@@ -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;
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> --- libsemanage/src/genhomedircon.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)