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