Skip to content

Commit fde8b82

Browse files
authored
Merge pull request cesanta#1507 from jameshilliard/mbedtls-reset
Handle MBEDTLS_ERR_NET_CONN_RESET errors
2 parents b20eded + 3ec17c4 commit fde8b82

3 files changed

Lines changed: 46 additions & 12 deletions

File tree

mongoose.c

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3211,6 +3211,16 @@ bool mg_sock_would_block(void) {
32113211
;
32123212
}
32133213

3214+
bool mg_sock_conn_reset(void);
3215+
bool mg_sock_conn_reset(void) {
3216+
int err = MG_SOCK_ERRNO;
3217+
#if MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK
3218+
return err == WSAECONNRESET;
3219+
#else
3220+
return err == EPIPE || err == ECONNRESET;
3221+
#endif
3222+
}
3223+
32143224
static void iolog(struct mg_connection *c, char *buf, long n, bool r) {
32153225
if (n == 0) {
32163226
// Do nothing
@@ -4258,25 +4268,32 @@ void mg_tls_free(struct mg_connection *c) {
42584268
}
42594269

42604270
bool mg_sock_would_block(void);
4271+
bool mg_sock_conn_reset(void);
42614272

42624273
static int mg_net_send(void *ctx, const unsigned char *buf, size_t len) {
42634274
struct mg_connection *c = (struct mg_connection *) ctx;
42644275
int fd = (int) (size_t) c->fd;
42654276
int n = (int) send(fd, buf, len, 0);
42664277
MG_VERBOSE(("%lu n=%d, errno=%d", c->id, n, errno));
4267-
if (n > 0) return n;
4268-
if (n < 0 && mg_sock_would_block()) return MBEDTLS_ERR_SSL_WANT_WRITE;
4269-
return MBEDTLS_ERR_NET_SEND_FAILED;
4278+
if (n < 0) {
4279+
if (mg_sock_would_block()) return MBEDTLS_ERR_SSL_WANT_WRITE;
4280+
if (mg_sock_conn_reset()) return MBEDTLS_ERR_NET_CONN_RESET;
4281+
return MBEDTLS_ERR_NET_SEND_FAILED;
4282+
}
4283+
return n;
42704284
}
42714285

42724286
static int mg_net_recv(void *ctx, unsigned char *buf, size_t len) {
42734287
struct mg_connection *c = (struct mg_connection *) ctx;
42744288
int n, fd = (int) (size_t) c->fd;
42754289
n = (int) recv(fd, buf, len, 0);
42764290
MG_VERBOSE(("%lu n=%d, errno=%d", c->id, n, errno));
4277-
if (n > 0) return n;
4278-
if (n < 0 && mg_sock_would_block()) return MBEDTLS_ERR_SSL_WANT_READ;
4279-
return MBEDTLS_ERR_NET_RECV_FAILED;
4291+
if (n < 0) {
4292+
if (mg_sock_would_block()) return MBEDTLS_ERR_SSL_WANT_READ;
4293+
if (mg_sock_conn_reset()) return MBEDTLS_ERR_NET_CONN_RESET;
4294+
return MBEDTLS_ERR_NET_RECV_FAILED;
4295+
}
4296+
return n;
42804297
}
42814298

42824299
void mg_tls_handshake(struct mg_connection *c) {

src/sock.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,16 @@ bool mg_sock_would_block(void) {
8888
;
8989
}
9090

91+
bool mg_sock_conn_reset(void);
92+
bool mg_sock_conn_reset(void) {
93+
int err = MG_SOCK_ERRNO;
94+
#if MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK
95+
return err == WSAECONNRESET;
96+
#else
97+
return err == EPIPE || err == ECONNRESET;
98+
#endif
99+
}
100+
91101
static void iolog(struct mg_connection *c, char *buf, long n, bool r) {
92102
if (n == 0) {
93103
// Do nothing

src/tls_mbed.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,32 @@ void mg_tls_free(struct mg_connection *c) {
2424
}
2525

2626
bool mg_sock_would_block(void);
27+
bool mg_sock_conn_reset(void);
2728

2829
static int mg_net_send(void *ctx, const unsigned char *buf, size_t len) {
2930
struct mg_connection *c = (struct mg_connection *) ctx;
3031
int fd = (int) (size_t) c->fd;
3132
int n = (int) send(fd, buf, len, 0);
3233
MG_VERBOSE(("%lu n=%d, errno=%d", c->id, n, errno));
33-
if (n > 0) return n;
34-
if (n < 0 && mg_sock_would_block()) return MBEDTLS_ERR_SSL_WANT_WRITE;
35-
return MBEDTLS_ERR_NET_SEND_FAILED;
34+
if (n < 0) {
35+
if (mg_sock_would_block()) return MBEDTLS_ERR_SSL_WANT_WRITE;
36+
if (mg_sock_conn_reset()) return MBEDTLS_ERR_NET_CONN_RESET;
37+
return MBEDTLS_ERR_NET_SEND_FAILED;
38+
}
39+
return n;
3640
}
3741

3842
static int mg_net_recv(void *ctx, unsigned char *buf, size_t len) {
3943
struct mg_connection *c = (struct mg_connection *) ctx;
4044
int n, fd = (int) (size_t) c->fd;
4145
n = (int) recv(fd, buf, len, 0);
4246
MG_VERBOSE(("%lu n=%d, errno=%d", c->id, n, errno));
43-
if (n > 0) return n;
44-
if (n < 0 && mg_sock_would_block()) return MBEDTLS_ERR_SSL_WANT_READ;
45-
return MBEDTLS_ERR_NET_RECV_FAILED;
47+
if (n < 0) {
48+
if (mg_sock_would_block()) return MBEDTLS_ERR_SSL_WANT_READ;
49+
if (mg_sock_conn_reset()) return MBEDTLS_ERR_NET_CONN_RESET;
50+
return MBEDTLS_ERR_NET_RECV_FAILED;
51+
}
52+
return n;
4653
}
4754

4855
void mg_tls_handshake(struct mg_connection *c) {

0 commit comments

Comments
 (0)