Trap23待办3: 异常释放(TIMEOUT/RST)挂起recv以CONNRESET了结, STOR异常结束回450并删除截断文件, 探针加--check-abort

This commit is contained in:
2026-09-25 02:04:46 +08:00
parent af495ffcfb
commit 2425031270
5 changed files with 85 additions and 10 deletions
+17 -1
View File
@@ -789,6 +789,7 @@ int net_socket(int domain, int type) {
p_sock->in_use = 1;
p_sock->send_ready = 1;
p_sock->readable = 0;
p_sock->released_abnormal = 0; /* 新 fd 不得继承上一条连接的释放原因(Trap 23 待办 #3) */
net_relisten_clear(sockfd); /* 新 fd 不得继承上一次的待重试状态 */
net_pending_clear(sockfd); /* 新 fd 不得继承上一次挂起的 recv 请求(L3) */
@@ -1541,6 +1542,7 @@ static int net_relisten_locked(net_sock_t *p_sock) {
}
p_sock->state = NET_SOCK_STATE_LISTENING;
p_sock->released_abnormal = 0U; /* 新监听不得继承上一条连接的释放原因(Trap 23 待办 #3) */
p_sock->remote_port = 0;
p_sock->remote_ip = 0;
memset(p_sock->remote_ip_arr, 0, sizeof(p_sock->remote_ip_arr));
@@ -1814,7 +1816,16 @@ static void net_pending_tick(void) {
if (p_sock->auto_relisten != 0U) {
(void)net_relisten_try(p_sock); /* 非阻塞:失败由重试轮询接管 */
}
net_pending_complete(i, 0);
/* Trap 23 待办 #3:异常释放(TIMEOUT/RST)不是正常 EOF——对端未发
* 正常 FIN → 以连接重置了结,应用(lftpd STOR)对异常结束回 5xx
* 而非误报 226;正常 FIN(DISCONNECT)仍回 0(FTP STOR 无长度声明,
* 在途 FIN 与正常完成不可区分——协议边界,见 Trap 23 记录) */
if (p_sock->released_abnormal != 0U) {
s_net_errno = NET_ERR_CONNRESET;
net_pending_complete(i, NET_ERR_CONNRESET);
} else {
net_pending_complete(i, 0);
}
}
continue;
}
@@ -2809,6 +2820,7 @@ static void handle_disconnect_event(net_sock_t *p_sock) {
s_relisten_quarantine[qfd] = NET_RELISTEN_SETTLE_GRACEFUL;
}
}
p_sock->released_abnormal = 0U; /* 正常释放(对端 FIN):断连了结回 EOF(0) */
p_sock->state = NET_SOCK_STATE_CLOSED;
fire_event(p_sock, NET_EVENT_DISCONNECTED);
} else if (p_sock->state != NET_SOCK_STATE_CLOSED &&
@@ -2878,6 +2890,10 @@ static void handle_timeout_event(net_sock_t *p_sock) {
s_relisten_quarantine[qfd] = 1U;
}
}
/* Trap 23 待办 #3:标记异常释放——L3 挂起 recv 排空断连后以
* NET_ERR_CONNRESET 了结(而非 EOF),应用(lftpd STOR)回报 5xx
* 而非误报 226(见 net_pending_tick 断连分支) */
p_sock->released_abnormal = 1U;
p_sock->state = NET_SOCK_STATE_CLOSED;
} else if (p_sock->state == NET_SOCK_STATE_LISTENING) {
/* 监听超时(异常情况) */