Add report_error(), this may fix issue #1376

This commit is contained in:
Cloud Wu
2021-04-07 07:26:02 +00:00
parent bc71164a99
commit df2803469e

View File

@@ -677,6 +677,15 @@ _failed_getaddrinfo:
return SOCKET_ERR; return SOCKET_ERR;
} }
static int
report_error(struct socket *s, struct socket_message *result, const char *err) {
result->id = s->id;
result->ud = 0;
result->opaque = s->opaque;
result->data = (char *)err;
return SOCKET_ERR;
}
static int static int
close_write(struct socket_server *ss, struct socket *s, struct socket_lock *l, struct socket_message *result) { close_write(struct socket_server *ss, struct socket *s, struct socket_lock *l, struct socket_message *result) {
if (s->closing) { if (s->closing) {
@@ -696,11 +705,7 @@ close_write(struct socket_server *ss, struct socket *s, struct socket_lock *l, s
ATOM_STORE(&s->type, SOCKET_TYPE_HALFCLOSE_WRITE); ATOM_STORE(&s->type, SOCKET_TYPE_HALFCLOSE_WRITE);
shutdown(s->fd, SHUT_WR); shutdown(s->fd, SHUT_WR);
enable_write(ss, s, false); enable_write(ss, s, false);
result->id = s->id; return report_error(s, result, strerror(errno));
result->ud = 0;
result->opaque = s->opaque;
result->data = strerror(errno);
return SOCKET_ERR;
} }
} }
@@ -894,11 +899,7 @@ send_buffer_(struct socket_server *ss, struct socket *s, struct socket_lock *l,
int err = enable_write(ss, s, false); int err = enable_write(ss, s, false);
if (err) { if (err) {
result->opaque = s->opaque; return report_error(s, result, "disable write failed");
result->id = s->id;
result->ud = 0;
result->data = "disable write failed";
return SOCKET_ERR;
} }
if(s->warn_size > 0){ if(s->warn_size > 0){
@@ -989,11 +990,7 @@ trigger_write(struct socket_server *ss, struct request_send * request, struct so
if (socket_invalid(s, id)) if (socket_invalid(s, id))
return -1; return -1;
if (enable_write(ss, s, true)) { if (enable_write(ss, s, true)) {
result->opaque = s->opaque; return report_error(s, result, "enable write failed");
result->id = s->id;
result->ud = 0;
result->data = "enable write failed";
return SOCKET_ERR;
} }
return -1; return -1;
} }
@@ -1050,11 +1047,7 @@ send_socket(struct socket_server *ss, struct request_send * request, struct sock
} }
} }
if (enable_write(ss, s, true)) { if (enable_write(ss, s, true)) {
result->opaque = s->opaque; return report_error(s, result, "enable write failed");
result->id = s->id;
result->ud = 0;
result->data = "enable write failed";
return SOCKET_ERR;
} }
} else { } else {
if (s->protocol == PROTOCOL_TCP) { if (s->protocol == PROTOCOL_TCP) {
@@ -1223,11 +1216,7 @@ pause_socket(struct socket_server *ss, struct request_resumepause *request, stru
return -1; return -1;
} }
if (enable_read(ss, s, false)) { if (enable_read(ss, s, false)) {
result->id = id; return report_error(s, result, "enable read failed");
result->opaque = request->opaque;
result->ud = 0;
result->data = "enable read failed";
return SOCKET_ERR;
} }
return -1; return -1;
} }
@@ -1302,12 +1291,7 @@ set_udp_address(struct socket_server *ss, struct request_setudp *request, struct
int type = request->address[0]; int type = request->address[0];
if (type != s->protocol) { if (type != s->protocol) {
// protocol mismatch // protocol mismatch
result->opaque = s->opaque; return report_error(s, result, "protocol mismatch");
result->id = s->id;
result->ud = 0;
result->data = "protocol mismatch";
return SOCKET_ERR;
} }
if (type == PROTOCOL_UDP) { if (type == PROTOCOL_UDP) {
memcpy(s->p.udp_address, request->address, 1+2+4); // 1 type, 2 port, 4 ipv4 memcpy(s->p.udp_address, request->address, 1+2+4); // 1 type, 2 port, 4 ipv4
@@ -1424,8 +1408,7 @@ forward_message_tcp(struct socket_server *ss, struct socket *s, struct socket_lo
case AGAIN_WOULDBLOCK: case AGAIN_WOULDBLOCK:
break; break;
default: default:
result->data = strerror(errno); return report_error(s, result, strerror(errno));
return SOCKET_ERR;
} }
return -1; return -1;
} }
@@ -1750,8 +1733,7 @@ socket_server_poll(struct socket_server *ss, struct socket_message * result, int
} else { } else {
err = "Unknown error"; err = "Unknown error";
} }
result->data = (char *)err; return report_error(s, result, err);
return SOCKET_ERR;
} }
if (e->eof) { if (e->eof) {
// For epoll (at least), FIN packets are exchanged both ways. // For epoll (at least), FIN packets are exchanged both ways.