mirror of
https://github.com/NixOS/nix
synced 2025-06-24 22:11:15 +02:00
handle buffer too small for getgrnam_r
Signed-off-by: Samuli Thomasson <samuli.thomasson@pm.me>
This commit is contained in:
parent
62cc737d19
commit
1d358ebb1c
1 changed files with 12 additions and 4 deletions
|
@ -252,7 +252,7 @@ struct ChrootLinuxDerivationBuilder : LinuxDerivationBuilder
|
||||||
struct group * gr = nullptr;
|
struct group * gr = nullptr;
|
||||||
long bufsize = sysconf(_SC_GETGR_R_SIZE_MAX);
|
long bufsize = sysconf(_SC_GETGR_R_SIZE_MAX);
|
||||||
if (bufsize == -1) bufsize = 16384;
|
if (bufsize == -1) bufsize = 16384;
|
||||||
std::vector<char> buffer(bufsize);
|
std::vector<char> buffer;
|
||||||
|
|
||||||
for (const auto & group_entry : settings.supplementaryGroups.get()) {
|
for (const auto & group_entry : settings.supplementaryGroups.get()) {
|
||||||
std::string group_name = group_entry;
|
std::string group_name = group_entry;
|
||||||
|
@ -270,9 +270,17 @@ struct ChrootLinuxDerivationBuilder : LinuxDerivationBuilder
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = getgrnam_r(group_name.c_str(), &grp, buffer.data(), buffer.size(), &gr);
|
while (true) {
|
||||||
if (ret != 0)
|
buffer.resize(bufsize);
|
||||||
throw Error("getgrnam_r failed for group '%s': %s", group_name, strerror(ret));
|
int ret = getgrnam_r(group_name.c_str(), &grp, buffer.data(), buffer.size(), &gr);
|
||||||
|
if (ret == 0) {
|
||||||
|
break;
|
||||||
|
} else if (ret == ERANGE) { // buffer too small
|
||||||
|
bufsize *= 2;
|
||||||
|
} else if (ret != 0)
|
||||||
|
throw Error("getgrnam_r failed for group '%s': %s", group_name, strerror(ret));
|
||||||
|
}
|
||||||
|
|
||||||
if (!gr) {
|
if (!gr) {
|
||||||
debug("Supplementary group '%s' not found", group_name);
|
debug("Supplementary group '%s' not found", group_name);
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue