mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-12-27 15:16:03 +00:00
lwiperf: fix double-free of pbufs on recv error
This commit is contained in:
parent
330793d94d
commit
2fd83c9d2e
@ -434,13 +434,13 @@ lwiperf_tcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
|
|||||||
if (p->tot_len < sizeof(lwiperf_settings_t)) {
|
if (p->tot_len < sizeof(lwiperf_settings_t)) {
|
||||||
lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);
|
lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
return ERR_VAL;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
if (!conn->have_settings_buf) {
|
if (!conn->have_settings_buf) {
|
||||||
if (pbuf_copy_partial(p, &conn->settings, sizeof(lwiperf_settings_t), 0) != sizeof(lwiperf_settings_t)) {
|
if (pbuf_copy_partial(p, &conn->settings, sizeof(lwiperf_settings_t), 0) != sizeof(lwiperf_settings_t)) {
|
||||||
lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL);
|
lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL);
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
return ERR_VAL;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
conn->have_settings_buf = 1;
|
conn->have_settings_buf = 1;
|
||||||
if ((conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST | LWIPERF_FLAGS_ANSWER_NOW)) ==
|
if ((conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST | LWIPERF_FLAGS_ANSWER_NOW)) ==
|
||||||
@ -450,14 +450,14 @@ lwiperf_tcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
|
|||||||
if (err2 != ERR_OK) {
|
if (err2 != ERR_OK) {
|
||||||
lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_TXERROR);
|
lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_TXERROR);
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
return err2;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pbuf_memcmp(p, 0, &conn->settings, sizeof(lwiperf_settings_t)) != 0) {
|
if (pbuf_memcmp(p, 0, &conn->settings, sizeof(lwiperf_settings_t)) != 0) {
|
||||||
lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);
|
lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
return ERR_VAL;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
conn->bytes_transferred += sizeof(lwiperf_settings_t);
|
conn->bytes_transferred += sizeof(lwiperf_settings_t);
|
||||||
@ -488,7 +488,7 @@ lwiperf_tcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
|
|||||||
} else {
|
} else {
|
||||||
lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);
|
lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
return ERR_VAL;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user