Some users of si_data_close() need to have the fd still open,
so we must move the call before fd_delete().
/* we may have to close a pending connection, and mark the
* response buffer as shutr
*/
+ si_data_close(si);
fd_delete(si_fd(si));
/* fall through */
case SI_ST_CER:
case SI_ST_TAR:
si->state = SI_ST_DIS;
- si_data_close(si);
if (si->release)
si->release(si);
default:
return;
if (si->ob->flags & BF_SHUTW) {
+ si_data_close(si);
fd_delete(si_fd(si));
si->state = SI_ST_DIS;
si->exp = TICK_ETERNITY;
- si_data_close(si);
if (si->release)
si->release(si);
return;