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
|
||||
};
|
||||
int errno_save = errno;
|
||||
|
||||
*swap = 0;
|
||||
retry:
|
||||
|
@ -50,11 +51,14 @@ retry:
|
|||
return f;
|
||||
|
||||
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
|
||||
/* If there isn't a running nscd we return -1 to indicate that
|
||||
* that is precisely what happened
|
||||
*/
|
||||
if (errno == EACCES || errno == ECONNREFUSED || errno == ENOENT)
|
||||
/* If there isn't a running nscd we simulate a "not found"
|
||||
* result and the caller is responsible for calling
|
||||
* fclose on the (unconnected) socket. The value of
|
||||
* errno must be left unchanged in this case. */
|
||||
if (errno == EACCES || errno == ECONNREFUSED || errno == ENOENT) {
|
||||
errno = errno_save;
|
||||
return f;
|
||||
}
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue