When an read error is detected, no error must be reported on the SPOP
connection is there are still some data to parse. It is important to be sure
to process all data before reporting the error and be sure to not truncate
received frames. However, we must also take care to handle short read case
to not wait data that will never be received.
This patch must be backported to 3.1.
TRACE_DATA("received read0", SPOP_EV_SPOP_CONN_RECV, conn);
spop_conn->flags |= SPOP_CF_RCVD_SHUT;
}
- if (conn->flags & CO_FL_ERROR) {
+ if ((conn->flags & CO_FL_ERROR) &&
+ (!b_data(&spop_conn->dbuf) || (spop_conn->flags & SPOP_CF_DEM_SHORT_READ))) {
TRACE_DATA("connection error", SPOP_EV_SPOP_CONN_RECV, conn);
spop_conn->flags |= SPOP_CF_ERROR;
}