Skip to content

Commit ffe0fb6

Browse files
SujanaSubrfwilhe
authored andcommitted
Patch for CVE-2025-22037 for Kernel 6.6 (#150)
Patch for CVE-2025-22037
1 parent 74f7c12 commit ffe0fb6

File tree

3 files changed

+110
-1
lines changed

3 files changed

+110
-1
lines changed

prepare_source

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
pkg=linux
22
version_orig=6.6.101
3-
version="$version_orig-0"
3+
version="$version_orig-1"
44

55
(
66
kernel_repo=https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

upstream_patches/CVE-2025-22037.patch

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
diff --git a/fs/smb/server/connection.h b/fs/smb/server/connection.h
2+
index 4fdd76ce53b9..ed3cf359dbf1 100644
3+
--- a/fs/smb/server/connection.h
4+
+++ b/fs/smb/server/connection.h
5+
@@ -27,6 +27,7 @@ enum {
6+
KSMBD_SESS_EXITING,
7+
KSMBD_SESS_NEED_RECONNECT,
8+
KSMBD_SESS_NEED_NEGOTIATE,
9+
+ KSMBD_SESS_NEED_SETUP,
10+
KSMBD_SESS_RELEASING
11+
};
12+
13+
@@ -187,6 +188,11 @@ static inline bool ksmbd_conn_need_negotiate(struct ksmbd_conn *conn)
14+
return READ_ONCE(conn->status) == KSMBD_SESS_NEED_NEGOTIATE;
15+
}
16+
17+
+static inline bool ksmbd_conn_need_setup(struct ksmbd_conn *conn)
18+
+{
19+
+ return READ_ONCE(conn->status) == KSMBD_SESS_NEED_SETUP;
20+
+}
21+
+
22+
static inline bool ksmbd_conn_need_reconnect(struct ksmbd_conn *conn)
23+
{
24+
return READ_ONCE(conn->status) == KSMBD_SESS_NEED_RECONNECT;
25+
@@ -217,6 +223,11 @@ static inline void ksmbd_conn_set_need_negotiate(struct ksmbd_conn *conn)
26+
WRITE_ONCE(conn->status, KSMBD_SESS_NEED_NEGOTIATE);
27+
}
28+
29+
+static inline void ksmbd_conn_set_need_setup(struct ksmbd_conn *conn)
30+
+{
31+
+ WRITE_ONCE(conn->status, KSMBD_SESS_NEED_SETUP);
32+
+}
33+
+
34+
static inline void ksmbd_conn_set_need_reconnect(struct ksmbd_conn *conn)
35+
{
36+
WRITE_ONCE(conn->status, KSMBD_SESS_NEED_RECONNECT);
37+
diff --git a/fs/smb/server/mgmt/user_session.c b/fs/smb/server/mgmt/user_session.c
38+
index 82dcc86a32c5..408f47220c07 100644
39+
--- a/fs/smb/server/mgmt/user_session.c
40+
+++ b/fs/smb/server/mgmt/user_session.c
41+
@@ -373,12 +373,12 @@ void destroy_previous_session(struct ksmbd_conn *conn,
42+
ksmbd_all_conn_set_status(id, KSMBD_SESS_NEED_RECONNECT);
43+
err = ksmbd_conn_wait_idle_sess_id(conn, id);
44+
if (err) {
45+
- ksmbd_all_conn_set_status(id, KSMBD_SESS_NEED_NEGOTIATE);
46+
+ ksmbd_all_conn_set_status(id, KSMBD_SESS_NEED_SETUP);
47+
goto out;
48+
}
49+
ksmbd_destroy_file_table(&prev_sess->file_table);
50+
prev_sess->state = SMB2_SESSION_EXPIRED;
51+
- ksmbd_all_conn_set_status(id, KSMBD_SESS_NEED_NEGOTIATE);
52+
+ ksmbd_all_conn_set_status(id, KSMBD_SESS_NEED_SETUP);
53+
out:
54+
up_write(&conn->session_lock);
55+
up_write(&sessions_table_lock);
56+
diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
57+
index d8325504a162..52e3791e51dc 100644
58+
--- a/fs/smb/server/smb2pdu.c
59+
+++ b/fs/smb/server/smb2pdu.c
60+
@@ -1252,7 +1252,7 @@ int smb2_handle_negotiate(struct ksmbd_work *work)
61+
}
62+
63+
conn->srv_sec_mode = le16_to_cpu(rsp->SecurityMode);
64+
- ksmbd_conn_set_need_negotiate(conn);
65+
+ ksmbd_conn_set_need_setup(conn);
66+
67+
err_out:
68+
if (rc)
69+
@@ -1273,6 +1273,9 @@ static int alloc_preauth_hash(struct ksmbd_session *sess,
70+
if (sess->Preauth_HashValue)
71+
return 0;
72+
73+
+ if (!conn->preauth_info)
74+
+ return -ENOMEM;
75+
+
76+
sess->Preauth_HashValue = kmemdup(conn->preauth_info->Preauth_HashValue,
77+
PREAUTH_HASHVALUE_SIZE, GFP_KERNEL);
78+
if (!sess->Preauth_HashValue)
79+
@@ -1677,6 +1680,11 @@ int smb2_sess_setup(struct ksmbd_work *work)
80+
81+
ksmbd_debug(SMB, "Received request for session setup\n");
82+
83+
+ if (!ksmbd_conn_need_setup(conn) && !ksmbd_conn_good(conn)) {
84+
+ work->send_no_response = 1;
85+
+ return rc;
86+
+ }
87+
+
88+
WORK_BUFFERS(work, req, rsp);
89+
90+
rsp->StructureSize = cpu_to_le16(9);
91+
@@ -1912,7 +1920,7 @@ int smb2_sess_setup(struct ksmbd_work *work)
92+
if (try_delay) {
93+
ksmbd_conn_set_need_reconnect(conn);
94+
ssleep(5);
95+
- ksmbd_conn_set_need_negotiate(conn);
96+
+ ksmbd_conn_set_need_setup(conn);
97+
}
98+
}
99+
smb2_set_err_rsp(work);
100+
@@ -2242,7 +2250,7 @@ int smb2_session_logoff(struct ksmbd_work *work)
101+
ksmbd_free_user(sess->user);
102+
sess->user = NULL;
103+
}
104+
- ksmbd_all_conn_set_status(sess_id, KSMBD_SESS_NEED_NEGOTIATE);
105+
+ ksmbd_all_conn_set_status(sess_id, KSMBD_SESS_NEED_SETUP);
106+
107+
rsp->StructureSize = cpu_to_le16(4);
108+
err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_logoff_rsp));

upstream_patches/series

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,4 @@ fpga-ofs-dev-6.6-lts-patches/0088-fpga-dfl-cxl-cache-depend-on-DRM.patch
8989
intel-dfl-fixes/001-fix-config-dependency-intel-s10hssi.patch
9090
CVE-2024-42107.patch
9191
CVE-2024-56647.patch
92+
CVE-2025-22037.patch

0 commit comments

Comments
 (0)