old_state = wsi->state;
+ if (wsi->socket_is_permanently_unusable)
+ goto just_kill_connection;
+
switch (old_state) {
case WSI_STATE_DEAD_SOCKET:
return;
LWS_CALLBACK_CLIENT_CONNECTION_ERROR, wsi->user_space, NULL, 0);
free(wsi->u.hdr.ah);
+ wsi->u.hdr.ah = NULL;
goto just_kill_connection;
}
-
- if (wsi->mode == LWS_CONNMODE_HTTP2_SERVING) {
- if (wsi->u.hdr.ah) {
- free(wsi->u.hdr.ah);
- wsi->u.hdr.ah = NULL;
- }
- }
if (wsi->mode == LWS_CONNMODE_HTTP_SERVING_ACCEPTED) {
if (wsi->u.http.fd != LWS_INVALID_FILE) {
wsi->rxflow_buffer = NULL;
}
+ if (wsi->mode == LWS_CONNMODE_HTTP2_SERVING && wsi->u.hdr.ah) {
+ free(wsi->u.hdr.ah);
+ wsi->u.hdr.ah = NULL;
+ }
+
if ((old_state == WSI_STATE_ESTABLISHED ||
wsi->mode == LWS_CONNMODE_WS_SERVING ||
wsi->mode == LWS_CONNMODE_WS_CLIENT)) {
switch (n) {
case LWS_SSL_CAPABLE_ERROR:
+ /* we're going to close, let close know sends aren't possible */
+ wsi->socket_is_permanently_unusable = 1;
return -1;
case LWS_SSL_CAPABLE_MORE_SERVICE:
/* nothing got sent, not fatal, retry the whole thing later */
unsigned int hdr_parsing_completed:1;
unsigned int user_space_externally_allocated:1;
+ unsigned int socket_is_permanently_unusable:1;
char pending_timeout; /* enum pending_timeout */
time_t pending_timeout_limit;