Trap23待办3: 异常释放(TIMEOUT/RST)挂起recv以CONNRESET了结, STOR异常结束回450并删除截断文件, 探针加--check-abort
This commit is contained in:
@@ -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) {
|
||||
/* 监听超时(异常情况) */
|
||||
|
||||
Reference in New Issue
Block a user