mirror of git://git.musl-libc.org/musl
fix spurious errors from pwd/grp functions when nscd backend is absent
for several pwd/grp functions, the only way the caller can distinguish between a successful negative result ("no such user/group") and an internal error is by clearing errno before the call and checking errno afterwards. the nscd backend support code correctly simulated a not-found response on systems where such a backend is not running, but failed to restore errno. this commit also fixed an outdated/incorrect comment.
This commit is contained in:
parent
75ce450395
commit
bd1eaceaa3
|
@ -32,6 +32,7 @@ FILE *__nscd_query(int32_t req, const char *key, int32_t *buf, size_t len, int *
|
||||||
},
|
},
|
||||||
.msg_iovlen = 2
|
.msg_iovlen = 2
|
||||||
};
|
};
|
||||||
|
int errno_save = errno;
|
||||||
|
|
||||||
*swap = 0;
|
*swap = 0;
|
||||||
retry:
|
retry:
|
||||||
|
@ -50,11 +51,14 @@ retry:
|
||||||
return f;
|
return f;
|
||||||
|
|
||||||
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
|
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
|
||||||
/* If there isn't a running nscd we return -1 to indicate that
|
/* If there isn't a running nscd we simulate a "not found"
|
||||||
* that is precisely what happened
|
* result and the caller is responsible for calling
|
||||||
*/
|
* fclose on the (unconnected) socket. The value of
|
||||||
if (errno == EACCES || errno == ECONNREFUSED || errno == ENOENT)
|
* errno must be left unchanged in this case. */
|
||||||
|
if (errno == EACCES || errno == ECONNREFUSED || errno == ENOENT) {
|
||||||
|
errno = errno_save;
|
||||||
return f;
|
return f;
|
||||||
|
}
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue