Skip to content

Commit 7e06ee5

Browse files
committed
io BUGFIX avoid invalid arguments for getpwuid_r
Fixes #345
1 parent 3202ff2 commit 7e06ee5

File tree

1 file changed

+20
-23
lines changed

1 file changed

+20
-23
lines changed

src/io.c

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,34 +1182,31 @@ struct passwd *
11821182
nc_getpwuid(uid_t uid, struct passwd *pwd_buf, char **buf, size_t *buf_size)
11831183
{
11841184
struct passwd *pwd = NULL;
1185-
char *mem;
1186-
int r = 0;
1185+
long sys_size;
1186+
int ret;
11871187

11881188
do {
1189-
r = getpwuid_r(uid, pwd_buf, *buf, *buf_size, &pwd);
1190-
if (pwd) {
1191-
break;
1189+
if (!*buf_size) {
1190+
/* learn suitable buffer size */
1191+
sys_size = sysconf(_SC_GETPW_R_SIZE_MAX);
1192+
*buf_size = (sys_size == -1) ? 2048 : sys_size;
1193+
} else {
1194+
/* enlarge buffer */
1195+
*buf_size += 2048;
11921196
}
11931197

1194-
if (r == ERANGE) {
1195-
if (!*buf_size) {
1196-
ssize_t size = sysconf(_SC_GETPW_R_SIZE_MAX);
1197-
if (size == -1) {
1198-
*buf_size = 256;
1199-
} else {
1200-
*buf_size = size;
1201-
}
1202-
} else {
1203-
*buf_size <<= 2;
1204-
}
1205-
mem = realloc(*buf, *buf_size);
1206-
if (!mem) {
1207-
ERRMEM;
1208-
return NULL;
1209-
}
1210-
*buf = mem;
1198+
/* allocate some buffer */
1199+
*buf = nc_realloc(*buf, *buf_size);
1200+
if (!*buf) {
1201+
ERRMEM;
1202+
return NULL;
12111203
}
1212-
} while (r == ERANGE);
12131204

1205+
ret = getpwuid_r(uid, pwd_buf, *buf, *buf_size, &pwd);
1206+
} while (ret && (ret == ERANGE));
1207+
1208+
if (ret) {
1209+
ERR(NULL, "Retrieving UID \"%lu\" passwd entry failed (%s).", (unsigned long int)uid, strerror(ret));
1210+
}
12141211
return pwd;
12151212
}

0 commit comments

Comments
 (0)