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

This commit is contained in:
2026-09-25 02:04:46 +08:00
parent a1f1f46262
commit c12139da06
5 changed files with 85 additions and 10 deletions
+3
View File
@@ -199,6 +199,9 @@ static int receive_file(int socket, const char *path)
lftpd_io_close(fh);
if (err < 0) {
/* 异常结束(连接重置/超时/预算耗尽):删除截断文件防残留并返回错误码
* → STOR 回报 450 而非误报 226(Trap 23 待办 #3) */
lftpd_io_unlink(path);
return err;
}
if (total == 0) {
+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) {
/* 监听超时(异常情况) */
+8
View File
@@ -171,6 +171,14 @@ typedef struct {
/* 单连接模式自动重监听:连接断开后由 net 层自动回到 LISTEN(BSD 风格监听常驻) */
uint8_t auto_relisten;
/* 释放来源标记(Trap 23 待办 #3):1 = 异常释放(芯片 TIMEOUT,对端 RST/掉链),
* 0 = 正常释放(芯片 DISCONNECT,对端 FIN)或新连接。L3 挂起 recv 的了结断连
* 分支据此决定回 EOF(0) 还是 NET_ERR_CONNRESET:异常结束上报应用(lftpd STOR)
* 为错误 → 回 5xx 而非误报 226。由 handle_timeout_event / handle_disconnect_event
* 置位,新连接建立时(net_socket / relisten 成功)清零——新连接不得继承上一条
* 连接的释放原因。 */
uint8_t released_abnormal;
/* 统计信息 */
uint32_t recv_bytes; /* 累计接收字节数 */
uint32_t send_bytes; /* 累计发送字节数 */