Skip to content

Commit 010eb01

Browse files
namjaejeonsmfrench
authored andcommitted
ksmbd: fix infinite loop caused by next_smb2_rcv_hdr_off reset in error paths
The problem occurs when a signed request fails smb2 signature verification check. In __process_request(), if check_sign_req() returns an error, set_smb2_rsp_status(work, STATUS_ACCESS_DENIED) is called. set_smb2_rsp_status() set work->next_smb2_rcv_hdr_off as zero. By resetting next_smb2_rcv_hdr_off to zero, the pointer to the next command in the chain is lost. Consequently, is_chained_smb2_message() continues to point to the same request header instead of advancing. If the header's NextCommand field is non-zero, the function returns true, causing __handle_ksmbd_work() to repeatedly process the same failed request in an infinite loop. This results in the kernel log being flooded with "bad smb2 signature" messages and high CPU usage. This patch fixes the issue by changing the return value from SERVER_HANDLER_CONTINUE to SERVER_HANDLER_ABORT. This ensures that the processing loop terminates immediately rather than attempting to continue from an invalidated offset. Reported-by: tianshuo han <hantianshuo233@gmail.com> Cc: stable@vger.kernel.org Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 214220e commit 010eb01

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

fs/smb/server/server.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,21 +126,21 @@ static int __process_request(struct ksmbd_work *work, struct ksmbd_conn *conn,
126126
andx_again:
127127
if (command >= conn->max_cmds) {
128128
conn->ops->set_rsp_status(work, STATUS_INVALID_PARAMETER);
129-
return SERVER_HANDLER_CONTINUE;
129+
return SERVER_HANDLER_ABORT;
130130
}
131131

132132
cmds = &conn->cmds[command];
133133
if (!cmds->proc) {
134134
ksmbd_debug(SMB, "*** not implemented yet cmd = %x\n", command);
135135
conn->ops->set_rsp_status(work, STATUS_NOT_IMPLEMENTED);
136-
return SERVER_HANDLER_CONTINUE;
136+
return SERVER_HANDLER_ABORT;
137137
}
138138

139139
if (work->sess && conn->ops->is_sign_req(work, command)) {
140140
ret = conn->ops->check_sign_req(work);
141141
if (!ret) {
142142
conn->ops->set_rsp_status(work, STATUS_ACCESS_DENIED);
143-
return SERVER_HANDLER_CONTINUE;
143+
return SERVER_HANDLER_ABORT;
144144
}
145145
}
146146

0 commit comments

Comments
 (0)