* FAILED: patch "[PATCH] ksmbd: prevent out-of-bounds reads in share config responses" failed to apply to 6.12-stable tree
@ 2026-09-14 11:03 gregkh
2026-09-14 14:15 ` [PATCH 6.12.y 1/2] ksmbd: fail share config requests when path allocation fails Sasha Levin
0 siblings, 1 reply; 4+ messages in thread
From: gregkh @ 2026-09-14 11:03 UTC (permalink / raw)
To: linkinjeon, farhad.alemi, kpskanna1915; +Cc: stable
The patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm
tree, then please email the backport, including the original git commit
id to <stable@vger.kernel.org>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x f25e93768fcc5d8287e50b1ec52a42e4c276df34
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<stable@vger.kernel.org>' --in-reply-to '2026091411-perish-luster-7e07@gregkh' --subject-prefix 'PATCH 6.12.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From f25e93768fcc5d8287e50b1ec52a42e4c276df34 Mon Sep 17 00:00:00 2001
From: Namjae Jeon <linkinjeon@kernel.org>
Date: Fri, 28 Aug 2026 08:39:57 +0900
Subject: [PATCH] ksmbd: prevent out-of-bounds reads in share config responses
Validate IPC share configuration payload sizes before consuming
variable-length fields. Bound veto list parsing and account for
the separator byte when deriving the path length.
Fixes: a677ebd8ca2f ("ksmbd: validate payload size in ipc response")
Reported-by: Kanishka De Silva <kpskanna1915@gmail.com>
Reported-by: Farhad Alemi <farhad.alemi@berkeley.edu>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
diff --git a/fs/smb/server/mgmt/share_config.c b/fs/smb/server/mgmt/share_config.c
index b2d9580bddc6..cc9f18ede80d 100644
--- a/fs/smb/server/mgmt/share_config.c
+++ b/fs/smb/server/mgmt/share_config.c
@@ -146,9 +146,9 @@ static struct ksmbd_share_config *__share_lookup(const char *name)
static int parse_veto_list(struct ksmbd_share_config *share,
char *veto_list,
- int veto_list_sz)
+ size_t veto_list_sz)
{
- int sz = 0;
+ size_t sz;
if (!veto_list_sz)
return 0;
@@ -156,7 +156,7 @@ static int parse_veto_list(struct ksmbd_share_config *share,
while (veto_list_sz > 0) {
struct ksmbd_veto_pattern *p;
- sz = strlen(veto_list);
+ sz = strnlen(veto_list, veto_list_sz);
if (!sz)
break;
@@ -164,7 +164,7 @@ static int parse_veto_list(struct ksmbd_share_config *share,
if (!p)
return -ENOMEM;
- p->pattern = kstrdup(veto_list, KSMBD_DEFAULT_GFP);
+ p->pattern = kstrndup(veto_list, sz, KSMBD_DEFAULT_GFP);
if (!p->pattern) {
kfree(p);
return -ENOMEM;
@@ -172,6 +172,9 @@ static int parse_veto_list(struct ksmbd_share_config *share,
list_add(&p->list, &share->veto_list);
+ if (sz == veto_list_sz)
+ break;
+
veto_list += sz + 1;
veto_list_sz -= (sz + 1);
}
@@ -224,17 +227,28 @@ static struct ksmbd_share_config *share_config_request(struct ksmbd_work *work,
}
if (!test_share_config_flag(share, KSMBD_SHARE_FLAG_PIPE)) {
- int path_len = PATH_MAX;
+ size_t path_len;
- if (resp->payload_sz)
- path_len = resp->payload_sz - resp->veto_list_sz;
-
- share->path = kstrndup(ksmbd_share_config_path(resp), path_len,
- KSMBD_DEFAULT_GFP);
- if (!share->path) {
- ret = -ENOMEM;
+ if (resp->payload_sz <= resp->veto_list_sz) {
+ ret = -EINVAL;
} else {
- ret = 0;
+ path_len = resp->payload_sz - resp->veto_list_sz;
+ if (resp->veto_list_sz)
+ path_len--;
+
+ if (!path_len) {
+ ret = -EINVAL;
+ } else {
+ share->path = kstrndup(
+ ksmbd_share_config_path(resp),
+ path_len, KSMBD_DEFAULT_GFP);
+ if (!share->path)
+ ret = -ENOMEM;
+ else
+ ret = 0;
+ }
+ }
+ if (share->path) {
share->path_sz = strlen(share->path);
while (share->path_sz > 1 &&
share->path[share->path_sz - 1] == '/')
diff --git a/fs/smb/server/transport_ipc.c b/fs/smb/server/transport_ipc.c
index 4b0b572a3e1b..e550aa41ad2c 100644
--- a/fs/smb/server/transport_ipc.c
+++ b/fs/smb/server/transport_ipc.c
@@ -532,14 +532,21 @@ static int ipc_validate_msg(struct ipc_msg_table_entry *entry)
if (entry->msg_sz < sizeof(struct ksmbd_share_config_response))
return -EINVAL;
- if (resp->payload_sz) {
- if (resp->payload_sz < resp->veto_list_sz)
- return -EINVAL;
+ if (strnlen(resp->share_name, sizeof(resp->share_name)) ==
+ sizeof(resp->share_name))
+ return -EINVAL;
- if (check_add_overflow(sizeof(struct ksmbd_share_config_response),
- resp->payload_sz, &msg_sz))
- return -EINVAL;
- }
+ if (resp->veto_list_sz > resp->payload_sz)
+ return -EINVAL;
+
+ if (resp->flags != KSMBD_SHARE_FLAG_INVALID &&
+ !(resp->flags & KSMBD_SHARE_FLAG_PIPE) &&
+ resp->payload_sz <= resp->veto_list_sz)
+ return -EINVAL;
+
+ if (check_add_overflow(sizeof(struct ksmbd_share_config_response),
+ resp->payload_sz, &msg_sz))
+ return -EINVAL;
break;
}
case KSMBD_EVENT_LOGIN_REQUEST_EXT:
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 6.12.y 1/2] ksmbd: fail share config requests when path allocation fails
2026-09-14 11:03 FAILED: patch "[PATCH] ksmbd: prevent out-of-bounds reads in share config responses" failed to apply to 6.12-stable tree gregkh
@ 2026-09-14 14:15 ` Sasha Levin
2026-09-14 14:15 ` [PATCH 6.12.y 2/2] ksmbd: prevent out-of-bounds reads in share config responses Sasha Levin
0 siblings, 1 reply; 4+ messages in thread
From: Sasha Levin @ 2026-09-14 14:15 UTC (permalink / raw)
To: stable; +Cc: Shuhao Fu, Namjae Jeon, Steve French, Sasha Levin
From: Shuhao Fu <sfual@cse.ust.hk>
[ Upstream commit a74668eb2c0b866d7ac4823be6006ab2e227bc03 ]
Non-pipe shares must have a duplicated backing path before they can be
published. share_config_request() currently calls kstrndup() for that
path, but if the allocation fails it leaves ret unchanged. If veto list
parsing succeeds and share->name exists, the partially built share is
still inserted into the global share table with share->path left NULL.
A later share-root SMB2 create uses tree_conn->share_conf->path as the
lookup root. If the share was published with path == NULL, that request
passes a NULL pathname into do_getname_kernel()/strlen() and can crash
the ksmbd worker.
Set ret = -ENOMEM when path duplication fails so the incomplete share is
destroyed before publication.
Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
Signed-off-by: Shuhao Fu <sfual@cse.ust.hk>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Stable-dep-of: f25e93768fcc ("ksmbd: prevent out-of-bounds reads in share config responses")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
fs/smb/server/mgmt/share_config.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/fs/smb/server/mgmt/share_config.c b/fs/smb/server/mgmt/share_config.c
index 4a5bc3c144284..97b0bbd619979 100644
--- a/fs/smb/server/mgmt/share_config.c
+++ b/fs/smb/server/mgmt/share_config.c
@@ -172,7 +172,10 @@ static struct ksmbd_share_config *share_config_request(struct ksmbd_work *work,
share->path = kstrndup(ksmbd_share_config_path(resp), path_len,
KSMBD_DEFAULT_GFP);
- if (share->path) {
+ if (!share->path) {
+ ret = -ENOMEM;
+ } else {
+ ret = 0;
share->path_sz = strlen(share->path);
while (share->path_sz > 1 &&
share->path[share->path_sz - 1] == '/')
@@ -184,9 +187,10 @@ static struct ksmbd_share_config *share_config_request(struct ksmbd_work *work,
share->force_directory_mode = resp->force_directory_mode;
share->force_uid = resp->force_uid;
share->force_gid = resp->force_gid;
- ret = parse_veto_list(share,
- KSMBD_SHARE_CONFIG_VETO_LIST(resp),
- resp->veto_list_sz);
+ if (!ret)
+ ret = parse_veto_list(share,
+ KSMBD_SHARE_CONFIG_VETO_LIST(resp),
+ resp->veto_list_sz);
if (!ret && share->path) {
if (__ksmbd_override_fsids(work, share)) {
kill_share(share);
--
2.53.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 6.12.y 2/2] ksmbd: prevent out-of-bounds reads in share config responses
2026-09-14 14:15 ` [PATCH 6.12.y 1/2] ksmbd: fail share config requests when path allocation fails Sasha Levin
@ 2026-09-14 14:15 ` Sasha Levin
2026-09-30 13:20 ` Greg KH
0 siblings, 1 reply; 4+ messages in thread
From: Sasha Levin @ 2026-09-14 14:15 UTC (permalink / raw)
To: stable; +Cc: Namjae Jeon, Kanishka De Silva, Farhad Alemi, Sasha Levin
From: Namjae Jeon <linkinjeon@kernel.org>
[ Upstream commit f25e93768fcc5d8287e50b1ec52a42e4c276df34 ]
Validate IPC share configuration payload sizes before consuming
variable-length fields. Bound veto list parsing and account for
the separator byte when deriving the path length.
Fixes: a677ebd8ca2f ("ksmbd: validate payload size in ipc response")
Reported-by: Kanishka De Silva <kpskanna1915@gmail.com>
Reported-by: Farhad Alemi <farhad.alemi@berkeley.edu>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
fs/smb/server/mgmt/share_config.c | 40 +++++++++++++++++++++----------
fs/smb/server/transport_ipc.c | 21 ++++++++++------
2 files changed, 41 insertions(+), 20 deletions(-)
diff --git a/fs/smb/server/mgmt/share_config.c b/fs/smb/server/mgmt/share_config.c
index 97b0bbd619979..e34e86cce0fc3 100644
--- a/fs/smb/server/mgmt/share_config.c
+++ b/fs/smb/server/mgmt/share_config.c
@@ -88,9 +88,9 @@ static struct ksmbd_share_config *__share_lookup(const char *name)
static int parse_veto_list(struct ksmbd_share_config *share,
char *veto_list,
- int veto_list_sz)
+ size_t veto_list_sz)
{
- int sz = 0;
+ size_t sz;
if (!veto_list_sz)
return 0;
@@ -98,7 +98,7 @@ static int parse_veto_list(struct ksmbd_share_config *share,
while (veto_list_sz > 0) {
struct ksmbd_veto_pattern *p;
- sz = strlen(veto_list);
+ sz = strnlen(veto_list, veto_list_sz);
if (!sz)
break;
@@ -106,7 +106,7 @@ static int parse_veto_list(struct ksmbd_share_config *share,
if (!p)
return -ENOMEM;
- p->pattern = kstrdup(veto_list, KSMBD_DEFAULT_GFP);
+ p->pattern = kstrndup(veto_list, sz, KSMBD_DEFAULT_GFP);
if (!p->pattern) {
kfree(p);
return -ENOMEM;
@@ -114,6 +114,9 @@ static int parse_veto_list(struct ksmbd_share_config *share,
list_add(&p->list, &share->veto_list);
+ if (sz == veto_list_sz)
+ break;
+
veto_list += sz + 1;
veto_list_sz -= (sz + 1);
}
@@ -165,17 +168,28 @@ static struct ksmbd_share_config *share_config_request(struct ksmbd_work *work,
}
if (!test_share_config_flag(share, KSMBD_SHARE_FLAG_PIPE)) {
- int path_len = PATH_MAX;
-
- if (resp->payload_sz)
- path_len = resp->payload_sz - resp->veto_list_sz;
+ size_t path_len;
- share->path = kstrndup(ksmbd_share_config_path(resp), path_len,
- KSMBD_DEFAULT_GFP);
- if (!share->path) {
- ret = -ENOMEM;
+ if (resp->payload_sz <= resp->veto_list_sz) {
+ ret = -EINVAL;
} else {
- ret = 0;
+ path_len = resp->payload_sz - resp->veto_list_sz;
+ if (resp->veto_list_sz)
+ path_len--;
+
+ if (!path_len) {
+ ret = -EINVAL;
+ } else {
+ share->path = kstrndup(
+ ksmbd_share_config_path(resp),
+ path_len, KSMBD_DEFAULT_GFP);
+ if (!share->path)
+ ret = -ENOMEM;
+ else
+ ret = 0;
+ }
+ }
+ if (share->path) {
share->path_sz = strlen(share->path);
while (share->path_sz > 1 &&
share->path[share->path_sz - 1] == '/')
diff --git a/fs/smb/server/transport_ipc.c b/fs/smb/server/transport_ipc.c
index a0b9b3def3346..10847d1cda4ac 100644
--- a/fs/smb/server/transport_ipc.c
+++ b/fs/smb/server/transport_ipc.c
@@ -524,14 +524,21 @@ static int ipc_validate_msg(struct ipc_msg_table_entry *entry)
if (entry->msg_sz < sizeof(struct ksmbd_share_config_response))
return -EINVAL;
- if (resp->payload_sz) {
- if (resp->payload_sz < resp->veto_list_sz)
- return -EINVAL;
+ if (strnlen(resp->share_name, sizeof(resp->share_name)) ==
+ sizeof(resp->share_name))
+ return -EINVAL;
- if (check_add_overflow(sizeof(struct ksmbd_share_config_response),
- resp->payload_sz, &msg_sz))
- return -EINVAL;
- }
+ if (resp->veto_list_sz > resp->payload_sz)
+ return -EINVAL;
+
+ if (resp->flags != KSMBD_SHARE_FLAG_INVALID &&
+ !(resp->flags & KSMBD_SHARE_FLAG_PIPE) &&
+ resp->payload_sz <= resp->veto_list_sz)
+ return -EINVAL;
+
+ if (check_add_overflow(sizeof(struct ksmbd_share_config_response),
+ resp->payload_sz, &msg_sz))
+ return -EINVAL;
break;
}
case KSMBD_EVENT_LOGIN_REQUEST_EXT:
--
2.53.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 6.12.y 2/2] ksmbd: prevent out-of-bounds reads in share config responses
2026-09-14 14:15 ` [PATCH 6.12.y 2/2] ksmbd: prevent out-of-bounds reads in share config responses Sasha Levin
@ 2026-09-30 13:20 ` Greg KH
0 siblings, 0 replies; 4+ messages in thread
From: Greg KH @ 2026-09-30 13:20 UTC (permalink / raw)
To: Sasha Levin; +Cc: stable, Namjae Jeon, Kanishka De Silva, Farhad Alemi
On Mon, Sep 14, 2026 at 10:15:51AM -0400, Sasha Levin wrote:
> From: Namjae Jeon <linkinjeon@kernel.org>
>
> [ Upstream commit f25e93768fcc5d8287e50b1ec52a42e4c276df34 ]
>
> Validate IPC share configuration payload sizes before consuming
> variable-length fields. Bound veto list parsing and account for
> the separator byte when deriving the path length.
>
> Fixes: a677ebd8ca2f ("ksmbd: validate payload size in ipc response")
> Reported-by: Kanishka De Silva <kpskanna1915@gmail.com>
> Reported-by: Farhad Alemi <farhad.alemi@berkeley.edu>
> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
> Signed-off-by: Sasha Levin <sashal@kernel.org>
> ---
> fs/smb/server/mgmt/share_config.c | 40 +++++++++++++++++++++----------
> fs/smb/server/transport_ipc.c | 21 ++++++++++------
> 2 files changed, 41 insertions(+), 20 deletions(-)
>
> diff --git a/fs/smb/server/mgmt/share_config.c b/fs/smb/server/mgmt/share_config.c
> index 97b0bbd619979..e34e86cce0fc3 100644
> --- a/fs/smb/server/mgmt/share_config.c
> +++ b/fs/smb/server/mgmt/share_config.c
> @@ -88,9 +88,9 @@ static struct ksmbd_share_config *__share_lookup(const char *name)
>
> static int parse_veto_list(struct ksmbd_share_config *share,
> char *veto_list,
> - int veto_list_sz)
> + size_t veto_list_sz)
> {
> - int sz = 0;
> + size_t sz;
>
> if (!veto_list_sz)
> return 0;
> @@ -98,7 +98,7 @@ static int parse_veto_list(struct ksmbd_share_config *share,
> while (veto_list_sz > 0) {
> struct ksmbd_veto_pattern *p;
>
> - sz = strlen(veto_list);
> + sz = strnlen(veto_list, veto_list_sz);
> if (!sz)
> break;
>
> @@ -106,7 +106,7 @@ static int parse_veto_list(struct ksmbd_share_config *share,
> if (!p)
> return -ENOMEM;
>
> - p->pattern = kstrdup(veto_list, KSMBD_DEFAULT_GFP);
> + p->pattern = kstrndup(veto_list, sz, KSMBD_DEFAULT_GFP);
> if (!p->pattern) {
> kfree(p);
> return -ENOMEM;
> @@ -114,6 +114,9 @@ static int parse_veto_list(struct ksmbd_share_config *share,
>
> list_add(&p->list, &share->veto_list);
>
> + if (sz == veto_list_sz)
> + break;
> +
> veto_list += sz + 1;
> veto_list_sz -= (sz + 1);
> }
> @@ -165,17 +168,28 @@ static struct ksmbd_share_config *share_config_request(struct ksmbd_work *work,
> }
>
> if (!test_share_config_flag(share, KSMBD_SHARE_FLAG_PIPE)) {
> - int path_len = PATH_MAX;
> -
> - if (resp->payload_sz)
> - path_len = resp->payload_sz - resp->veto_list_sz;
> + size_t path_len;
>
> - share->path = kstrndup(ksmbd_share_config_path(resp), path_len,
> - KSMBD_DEFAULT_GFP);
> - if (!share->path) {
> - ret = -ENOMEM;
> + if (resp->payload_sz <= resp->veto_list_sz) {
> + ret = -EINVAL;
> } else {
> - ret = 0;
> + path_len = resp->payload_sz - resp->veto_list_sz;
> + if (resp->veto_list_sz)
> + path_len--;
> +
> + if (!path_len) {
> + ret = -EINVAL;
> + } else {
> + share->path = kstrndup(
> + ksmbd_share_config_path(resp),
> + path_len, KSMBD_DEFAULT_GFP);
> + if (!share->path)
> + ret = -ENOMEM;
> + else
> + ret = 0;
> + }
> + }
> + if (share->path) {
> share->path_sz = strlen(share->path);
> while (share->path_sz > 1 &&
> share->path[share->path_sz - 1] == '/')
> diff --git a/fs/smb/server/transport_ipc.c b/fs/smb/server/transport_ipc.c
> index a0b9b3def3346..10847d1cda4ac 100644
> --- a/fs/smb/server/transport_ipc.c
> +++ b/fs/smb/server/transport_ipc.c
> @@ -524,14 +524,21 @@ static int ipc_validate_msg(struct ipc_msg_table_entry *entry)
> if (entry->msg_sz < sizeof(struct ksmbd_share_config_response))
> return -EINVAL;
>
> - if (resp->payload_sz) {
> - if (resp->payload_sz < resp->veto_list_sz)
> - return -EINVAL;
> + if (strnlen(resp->share_name, sizeof(resp->share_name)) ==
> + sizeof(resp->share_name))
> + return -EINVAL;
>
> - if (check_add_overflow(sizeof(struct ksmbd_share_config_response),
> - resp->payload_sz, &msg_sz))
> - return -EINVAL;
> - }
> + if (resp->veto_list_sz > resp->payload_sz)
> + return -EINVAL;
> +
> + if (resp->flags != KSMBD_SHARE_FLAG_INVALID &&
> + !(resp->flags & KSMBD_SHARE_FLAG_PIPE) &&
> + resp->payload_sz <= resp->veto_list_sz)
> + return -EINVAL;
> +
> + if (check_add_overflow(sizeof(struct ksmbd_share_config_response),
> + resp->payload_sz, &msg_sz))
> + return -EINVAL;
> break;
> }
> case KSMBD_EVENT_LOGIN_REQUEST_EXT:
> --
> 2.53.0
>
>
Series did not apply
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-09-30 13:21 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-14 11:03 FAILED: patch "[PATCH] ksmbd: prevent out-of-bounds reads in share config responses" failed to apply to 6.12-stable tree gregkh
2026-09-14 14:15 ` [PATCH 6.12.y 1/2] ksmbd: fail share config requests when path allocation fails Sasha Levin
2026-09-14 14:15 ` [PATCH 6.12.y 2/2] ksmbd: prevent out-of-bounds reads in share config responses Sasha Levin
2026-09-30 13:20 ` Greg KH
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox