1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-08 05:57:51 +03:00

lib/tsocket: remember the first error as tstream_bsd->error

If we found that the connection is broken, there's no point
in trying to use it anymore, so just return the first error we detected.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15202

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
(cherry picked from commit 4c7e2b9b60de5d02bb3f69effe7eddbf466a6155)
This commit is contained in:
Stefan Metzmacher 2022-10-13 16:23:03 +02:00 committed by Jule Anger
parent d8d5146d16
commit aeb7dd2ca8

View File

@ -1744,6 +1744,7 @@ int _tdgram_unix_socket(const struct tsocket_address *local,
struct tstream_bsd { struct tstream_bsd {
int fd; int fd;
int error;
void *event_ptr; void *event_ptr;
struct tevent_fd *fde; struct tevent_fd *fde;
@ -1921,7 +1922,19 @@ static ssize_t tstream_bsd_pending_bytes(struct tstream_context *stream)
return -1; return -1;
} }
if (bsds->error != 0) {
errno = bsds->error;
return -1;
}
ret = tsocket_bsd_pending(bsds->fd); ret = tsocket_bsd_pending(bsds->fd);
if (ret == -1) {
/*
* remember the error and don't
* allow further requests
*/
bsds->error = errno;
}
return ret; return ret;
} }
@ -2029,9 +2042,15 @@ static void tstream_bsd_readv_handler(void *private_data)
int _count; int _count;
bool ok, retry; bool ok, retry;
if (bsds->error != 0) {
tevent_req_error(req, bsds->error);
return;
}
ret = readv(bsds->fd, state->vector, state->count); ret = readv(bsds->fd, state->vector, state->count);
if (ret == 0) { if (ret == 0) {
/* propagate end of file */ /* propagate end of file */
bsds->error = EPIPE;
tevent_req_error(req, EPIPE); tevent_req_error(req, EPIPE);
return; return;
} }
@ -2040,6 +2059,13 @@ static void tstream_bsd_readv_handler(void *private_data)
/* retry later */ /* retry later */
return; return;
} }
if (err != 0) {
/*
* remember the error and don't
* allow further requests
*/
bsds->error = err;
}
if (tevent_req_error(req, err)) { if (tevent_req_error(req, err)) {
return; return;
} }
@ -2172,9 +2198,15 @@ static void tstream_bsd_writev_handler(void *private_data)
int _count; int _count;
bool ok, retry; bool ok, retry;
if (bsds->error != 0) {
tevent_req_error(req, bsds->error);
return;
}
ret = writev(bsds->fd, state->vector, state->count); ret = writev(bsds->fd, state->vector, state->count);
if (ret == 0) { if (ret == 0) {
/* propagate end of file */ /* propagate end of file */
bsds->error = EPIPE;
tevent_req_error(req, EPIPE); tevent_req_error(req, EPIPE);
return; return;
} }
@ -2183,6 +2215,13 @@ static void tstream_bsd_writev_handler(void *private_data)
/* retry later */ /* retry later */
return; return;
} }
if (err != 0) {
/*
* remember the error and don't
* allow further requests
*/
bsds->error = err;
}
if (tevent_req_error(req, err)) { if (tevent_req_error(req, err)) {
return; return;
} }