public inbox for linux-cifs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mount.cifs: fix buffer overrun in set_password
@ 2026-03-31  0:09 David Disseldorp
  2026-03-31 17:44 ` Henrique Carvalho
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: David Disseldorp @ 2026-03-31  0:09 UTC (permalink / raw)
  To: linux-cifs; +Cc: Steve French, David Disseldorp, Bruno Bierbaumer

The existing (j > pass_length) check is insufficient to avoid dst buffer
overrun into the start of the adjacent struct parsed_mount_info field.
Check for overrun before writing to dst, and account for comma-expansion
and null-termination.

Bug: https://bugzilla.samba.org/show_bug.cgi?id=16044

Reported-by: Bruno Bierbaumer <bruno@bierbaumer.net>
Signed-off-by: David Disseldorp <ddiss@suse.de>
---
 mount.cifs.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/mount.cifs.c b/mount.cifs.c
index 1923913..d41ca6a 100644
--- a/mount.cifs.c
+++ b/mount.cifs.c
@@ -350,13 +350,13 @@ set_password(struct parsed_mount_info *parsed_info, const char *src,
 	unsigned int i = 0, j = 0;
 
 	while (src[i]) {
-		if (src[i] == ',')
-			dst[j++] = ',';
-		dst[j++] = src[i++];
-		if (j > pass_length) {
+		if (j + 2 >= pass_length) {
 			fprintf(stderr, "Converted password too long!\n");
 			return EX_USAGE;
 		}
+		if (src[i] == ',')
+			dst[j++] = ',';
+		dst[j++] = src[i++];
 	}
 	dst[j] = '\0';
 	if (is_pass2)
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] mount.cifs: fix buffer overrun in set_password
  2026-03-31  0:09 [PATCH] mount.cifs: fix buffer overrun in set_password David Disseldorp
@ 2026-03-31 17:44 ` Henrique Carvalho
  2026-03-31 23:56 ` Steve French
  2026-04-01 13:40 ` Enzo Matsumiya
  2 siblings, 0 replies; 8+ messages in thread
From: Henrique Carvalho @ 2026-03-31 17:44 UTC (permalink / raw)
  To: David Disseldorp; +Cc: linux-cifs, Steve French, Bruno Bierbaumer

Reviewed-by: Henrique Carvalho <henrique.carvalho@suse.com>

On Tue, Mar 31, 2026 at 11:09:11AM +1100, David Disseldorp wrote:
> The existing (j > pass_length) check is insufficient to avoid dst buffer
> overrun into the start of the adjacent struct parsed_mount_info field.
> Check for overrun before writing to dst, and account for comma-expansion
> and null-termination.
> 
> Bug: https://bugzilla.samba.org/show_bug.cgi?id=16044
> 
> Reported-by: Bruno Bierbaumer <bruno@bierbaumer.net>
> Signed-off-by: David Disseldorp <ddiss@suse.de>
> ---
>  mount.cifs.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/mount.cifs.c b/mount.cifs.c
> index 1923913..d41ca6a 100644
> --- a/mount.cifs.c
> +++ b/mount.cifs.c
> @@ -350,13 +350,13 @@ set_password(struct parsed_mount_info *parsed_info, const char *src,
>  	unsigned int i = 0, j = 0;
>  
>  	while (src[i]) {
> -		if (src[i] == ',')
> -			dst[j++] = ',';
> -		dst[j++] = src[i++];
> -		if (j > pass_length) {
> +		if (j + 2 >= pass_length) {
>  			fprintf(stderr, "Converted password too long!\n");
>  			return EX_USAGE;
>  		}
> +		if (src[i] == ',')
> +			dst[j++] = ',';
> +		dst[j++] = src[i++];
>  	}
>  	dst[j] = '\0';
>  	if (is_pass2)
> -- 
> 2.51.0
> 
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] mount.cifs: fix buffer overrun in set_password
  2026-03-31  0:09 [PATCH] mount.cifs: fix buffer overrun in set_password David Disseldorp
  2026-03-31 17:44 ` Henrique Carvalho
@ 2026-03-31 23:56 ` Steve French
  2026-04-01  0:58   ` David Disseldorp
  2026-04-01 13:40 ` Enzo Matsumiya
  2 siblings, 1 reply; 8+ messages in thread
From: Steve French @ 2026-03-31 23:56 UTC (permalink / raw)
  To: David Disseldorp; +Cc: linux-cifs, Bruno Bierbaumer

added RB from Henrique and updated
git.samba.org/data/git/cifs-utils.git and
https://github.com/smfrench/smb3-utils for-next

On Mon, Mar 30, 2026 at 7:10 PM David Disseldorp <ddiss@suse.de> wrote:
>
> The existing (j > pass_length) check is insufficient to avoid dst buffer
> overrun into the start of the adjacent struct parsed_mount_info field.
> Check for overrun before writing to dst, and account for comma-expansion
> and null-termination.
>
> Bug: https://bugzilla.samba.org/show_bug.cgi?id=16044
>
> Reported-by: Bruno Bierbaumer <bruno@bierbaumer.net>
> Signed-off-by: David Disseldorp <ddiss@suse.de>
> ---
>  mount.cifs.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/mount.cifs.c b/mount.cifs.c
> index 1923913..d41ca6a 100644
> --- a/mount.cifs.c
> +++ b/mount.cifs.c
> @@ -350,13 +350,13 @@ set_password(struct parsed_mount_info *parsed_info, const char *src,
>         unsigned int i = 0, j = 0;
>
>         while (src[i]) {
> -               if (src[i] == ',')
> -                       dst[j++] = ',';
> -               dst[j++] = src[i++];
> -               if (j > pass_length) {
> +               if (j + 2 >= pass_length) {
>                         fprintf(stderr, "Converted password too long!\n");
>                         return EX_USAGE;
>                 }
> +               if (src[i] == ',')
> +                       dst[j++] = ',';
> +               dst[j++] = src[i++];
>         }
>         dst[j] = '\0';
>         if (is_pass2)
> --
> 2.51.0
>


-- 
Thanks,

Steve

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] mount.cifs: fix buffer overrun in set_password
  2026-03-31 23:56 ` Steve French
@ 2026-04-01  0:58   ` David Disseldorp
  2026-04-01  2:03     ` Steve French
  0 siblings, 1 reply; 8+ messages in thread
From: David Disseldorp @ 2026-04-01  0:58 UTC (permalink / raw)
  To: Steve French; +Cc: linux-cifs, Bruno Bierbaumer

On Tue, 31 Mar 2026 18:56:05 -0500, Steve French wrote:

> added RB from Henrique and updated
> git.samba.org/data/git/cifs-utils.git and
> https://github.com/smfrench/smb3-utils for-next

Thanks Steve. FWIW, the reviewed-by tag has an incorrect email address:
  Reviewed-by: Henrique Carvalho <[2]henrique.carvalho@suse.com>
Should be
  Reviewed-by: Henrique Carvalho <henrique.carvalho@suse.com>

I'll close the corresponding PR at
https://github.com/smfrench/smb3-utils/pull/16

Cheers, David

> On Mon, Mar 30, 2026 at 7:10 PM David Disseldorp <ddiss@suse.de> wrote:
> >
> > The existing (j > pass_length) check is insufficient to avoid dst buffer
> > overrun into the start of the adjacent struct parsed_mount_info field.
> > Check for overrun before writing to dst, and account for comma-expansion
> > and null-termination.
> >
> > Bug: https://bugzilla.samba.org/show_bug.cgi?id=16044
> >
> > Reported-by: Bruno Bierbaumer <bruno@bierbaumer.net>
> > Signed-off-by: David Disseldorp <ddiss@suse.de>
> > ---
> >  mount.cifs.c | 8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/mount.cifs.c b/mount.cifs.c
> > index 1923913..d41ca6a 100644
> > --- a/mount.cifs.c
> > +++ b/mount.cifs.c
> > @@ -350,13 +350,13 @@ set_password(struct parsed_mount_info *parsed_info, const char *src,
> >         unsigned int i = 0, j = 0;
> >
> >         while (src[i]) {
> > -               if (src[i] == ',')
> > -                       dst[j++] = ',';
> > -               dst[j++] = src[i++];
> > -               if (j > pass_length) {
> > +               if (j + 2 >= pass_length) {
> >                         fprintf(stderr, "Converted password too long!\n");
> >                         return EX_USAGE;
> >                 }
> > +               if (src[i] == ',')
> > +                       dst[j++] = ',';
> > +               dst[j++] = src[i++];
> >         }
> >         dst[j] = '\0';
> >         if (is_pass2)
> > --
> > 2.51.0
> >  
> 
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] mount.cifs: fix buffer overrun in set_password
  2026-04-01  0:58   ` David Disseldorp
@ 2026-04-01  2:03     ` Steve French
  0 siblings, 0 replies; 8+ messages in thread
From: Steve French @ 2026-04-01  2:03 UTC (permalink / raw)
  To: David Disseldorp; +Cc: linux-cifs, Bruno Bierbaumer

Good catch.  Fixed the RB tag

On Tue, Mar 31, 2026 at 7:58 PM David Disseldorp <ddiss@suse.de> wrote:
>
> On Tue, 31 Mar 2026 18:56:05 -0500, Steve French wrote:
>
> > added RB from Henrique and updated
> > git.samba.org/data/git/cifs-utils.git and
> > https://github.com/smfrench/smb3-utils for-next
>
> Thanks Steve. FWIW, the reviewed-by tag has an incorrect email address:
>   Reviewed-by: Henrique Carvalho <[2]henrique.carvalho@suse.com>
> Should be
>   Reviewed-by: Henrique Carvalho <henrique.carvalho@suse.com>
>
> I'll close the corresponding PR at
> https://github.com/smfrench/smb3-utils/pull/16
>
> Cheers, David
>
> > On Mon, Mar 30, 2026 at 7:10 PM David Disseldorp <ddiss@suse.de> wrote:
> > >
> > > The existing (j > pass_length) check is insufficient to avoid dst buffer
> > > overrun into the start of the adjacent struct parsed_mount_info field.
> > > Check for overrun before writing to dst, and account for comma-expansion
> > > and null-termination.
> > >
> > > Bug: https://bugzilla.samba.org/show_bug.cgi?id=16044
> > >
> > > Reported-by: Bruno Bierbaumer <bruno@bierbaumer.net>
> > > Signed-off-by: David Disseldorp <ddiss@suse.de>
> > > ---
> > >  mount.cifs.c | 8 ++++----
> > >  1 file changed, 4 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/mount.cifs.c b/mount.cifs.c
> > > index 1923913..d41ca6a 100644
> > > --- a/mount.cifs.c
> > > +++ b/mount.cifs.c
> > > @@ -350,13 +350,13 @@ set_password(struct parsed_mount_info *parsed_info, const char *src,
> > >         unsigned int i = 0, j = 0;
> > >
> > >         while (src[i]) {
> > > -               if (src[i] == ',')
> > > -                       dst[j++] = ',';
> > > -               dst[j++] = src[i++];
> > > -               if (j > pass_length) {
> > > +               if (j + 2 >= pass_length) {
> > >                         fprintf(stderr, "Converted password too long!\n");
> > >                         return EX_USAGE;
> > >                 }
> > > +               if (src[i] == ',')
> > > +                       dst[j++] = ',';
> > > +               dst[j++] = src[i++];
> > >         }
> > >         dst[j] = '\0';
> > >         if (is_pass2)
> > > --
> > > 2.51.0
> > >
> >
> >
>


-- 
Thanks,

Steve

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] mount.cifs: fix buffer overrun in set_password
  2026-03-31  0:09 [PATCH] mount.cifs: fix buffer overrun in set_password David Disseldorp
  2026-03-31 17:44 ` Henrique Carvalho
  2026-03-31 23:56 ` Steve French
@ 2026-04-01 13:40 ` Enzo Matsumiya
  2026-04-01 15:24   ` Henrique Carvalho
  2 siblings, 1 reply; 8+ messages in thread
From: Enzo Matsumiya @ 2026-04-01 13:40 UTC (permalink / raw)
  To: David Disseldorp; +Cc: linux-cifs, Steve French, Bruno Bierbaumer

Hi Dave,

On 03/31, David Disseldorp wrote:
>The existing (j > pass_length) check is insufficient to avoid dst buffer
>overrun into the start of the adjacent struct parsed_mount_info field.
>Check for overrun before writing to dst, and account for comma-expansion
>and null-termination.
>
>Bug: https://bugzilla.samba.org/show_bug.cgi?id=16044
>
>Reported-by: Bruno Bierbaumer <bruno@bierbaumer.net>
>Signed-off-by: David Disseldorp <ddiss@suse.de>
>---
> mount.cifs.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
>diff --git a/mount.cifs.c b/mount.cifs.c
>index 1923913..d41ca6a 100644
>--- a/mount.cifs.c
>+++ b/mount.cifs.c
>@@ -350,13 +350,13 @@ set_password(struct parsed_mount_info *parsed_info, const char *src,
> 	unsigned int i = 0, j = 0;
>
> 	while (src[i]) {
>-		if (src[i] == ',')
>-			dst[j++] = ',';
>-		dst[j++] = src[i++];
>-		if (j > pass_length) {
>+		if (j + 2 >= pass_length) {

There is the overrun bug, yes, but unconditionally accounting for comma
expansion here will crop the password if it has at least 1 comma and
(unparsed) length == MOUNT_PASSWD_SIZE, e.g.:

(password here is <511 * 'a'> + ',')

# echo -e "username=administrator\npassword=$(printf 'a%.0s' {1..511})," > /tmp/creds
# ./mount.cifs -o credentials=/tmp/creds //w25.vm.test/test /mnt/test
Converted password too long!
error 1 (Operation not permitted) opening credential file /tmp/creds


Maybe password/password2 could be malloc'd with size
"strlen(src) + <number of commas in src>" and bounds checked against that?
Just a thought.


Cheers,

Enzo

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] mount.cifs: fix buffer overrun in set_password
  2026-04-01 13:40 ` Enzo Matsumiya
@ 2026-04-01 15:24   ` Henrique Carvalho
  2026-04-02  1:23     ` David Disseldorp
  0 siblings, 1 reply; 8+ messages in thread
From: Henrique Carvalho @ 2026-04-01 15:24 UTC (permalink / raw)
  To: Enzo Matsumiya
  Cc: David Disseldorp, linux-cifs, Steve French, Bruno Bierbaumer

On Wed, Apr 01, 2026 at 10:40:41AM -0300, Enzo Matsumiya wrote:
> Hi Dave,
> 
> On 03/31, David Disseldorp wrote:
> > The existing (j > pass_length) check is insufficient to avoid dst buffer
> > overrun into the start of the adjacent struct parsed_mount_info field.
> > Check for overrun before writing to dst, and account for comma-expansion
> > and null-termination.
> > 
> > Bug: https://bugzilla.samba.org/show_bug.cgi?id=16044
> > 
> > Reported-by: Bruno Bierbaumer <bruno@bierbaumer.net>
> > Signed-off-by: David Disseldorp <ddiss@suse.de>
> > ---
> > mount.cifs.c | 8 ++++----
> > 1 file changed, 4 insertions(+), 4 deletions(-)
> > 
> > diff --git a/mount.cifs.c b/mount.cifs.c
> > index 1923913..d41ca6a 100644
> > --- a/mount.cifs.c
> > +++ b/mount.cifs.c
> > @@ -350,13 +350,13 @@ set_password(struct parsed_mount_info *parsed_info, const char *src,
> > 	unsigned int i = 0, j = 0;
> > 
> > 	while (src[i]) {
> > -		if (src[i] == ',')
> > -			dst[j++] = ',';
> > -		dst[j++] = src[i++];
> > -		if (j > pass_length) {
> > +		if (j + 2 >= pass_length) {
> 
> There is the overrun bug, yes, but unconditionally accounting for comma
> expansion here will crop the password if it has at least 1 comma and
> (unparsed) length == MOUNT_PASSWD_SIZE, e.g.:
> 
> (password here is <511 * 'a'> + ',')
> 
> # echo -e "username=administrator\npassword=$(printf 'a%.0s' {1..511})," > /tmp/creds
> # ./mount.cifs -o credentials=/tmp/creds //w25.vm.test/test /mnt/test
> Converted password too long!
> error 1 (Operation not permitted) opening credential file /tmp/creds
> 
> 
> Maybe password/password2 could be malloc'd with size
> "strlen(src) + <number of commas in src>" and bounds checked against that?
> Just a thought.
> 

Maybe we could have buffers double the size, but that would represent a
behavior change. Passwords containing commas were never guaranteed to
fit in current MOUNT_PASSWD_SIZE sized buffers.

I believe this would be a separate chage.

> 
> Cheers,
> 
> Enzo
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] mount.cifs: fix buffer overrun in set_password
  2026-04-01 15:24   ` Henrique Carvalho
@ 2026-04-02  1:23     ` David Disseldorp
  0 siblings, 0 replies; 8+ messages in thread
From: David Disseldorp @ 2026-04-02  1:23 UTC (permalink / raw)
  To: Henrique Carvalho
  Cc: Enzo Matsumiya, linux-cifs, Steve French, Bruno Bierbaumer

Thanks for the feedback, Enzo and Henrique...

On Wed, 1 Apr 2026 12:24:37 -0300, Henrique Carvalho wrote:

> On Wed, Apr 01, 2026 at 10:40:41AM -0300, Enzo Matsumiya wrote:
> > Hi Dave,
> > 
> > On 03/31, David Disseldorp wrote:  
> > > The existing (j > pass_length) check is insufficient to avoid dst buffer
> > > overrun into the start of the adjacent struct parsed_mount_info field.
> > > Check for overrun before writing to dst, and account for comma-expansion
> > > and null-termination.
> > > 
> > > Bug: https://bugzilla.samba.org/show_bug.cgi?id=16044
> > > 
> > > Reported-by: Bruno Bierbaumer <bruno@bierbaumer.net>
> > > Signed-off-by: David Disseldorp <ddiss@suse.de>
> > > ---
> > > mount.cifs.c | 8 ++++----
> > > 1 file changed, 4 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/mount.cifs.c b/mount.cifs.c
> > > index 1923913..d41ca6a 100644
> > > --- a/mount.cifs.c
> > > +++ b/mount.cifs.c
> > > @@ -350,13 +350,13 @@ set_password(struct parsed_mount_info *parsed_info, const char *src,
> > > 	unsigned int i = 0, j = 0;
> > > 
> > > 	while (src[i]) {
> > > -		if (src[i] == ',')
> > > -			dst[j++] = ',';
> > > -		dst[j++] = src[i++];
> > > -		if (j > pass_length) {
> > > +		if (j + 2 >= pass_length) {  
> > 
> > There is the overrun bug, yes, but unconditionally accounting for comma
> > expansion here will crop the password if it has at least 1 comma and
> > (unparsed) length == MOUNT_PASSWD_SIZE, e.g.:
> > 
> > (password here is <511 * 'a'> + ',')
> > 
> > # echo -e "username=administrator\npassword=$(printf 'a%.0s' {1..511})," > /tmp/creds
> > # ./mount.cifs -o credentials=/tmp/creds //w25.vm.test/test /mnt/test
> > Converted password too long!
> > error 1 (Operation not permitted) opening credential file /tmp/creds

Yes, it's a valid point. I did consider it, but decided against it as:
- it makes the code slightly more complex, and adds more
  password-content based logic
- length restrictions are already opaque and confusing
  + "it broke when I changed password from 300x ':' to 300x ',' - why?"
- we're cropping the field any way (oversize pws were previously still
  passed to the kernel)

> > Maybe password/password2 could be malloc'd with size
> > "strlen(src) + <number of commas in src>" and bounds checked against that?
> > Just a thought.
> >   
> 
> Maybe we could have buffers double the size, but that would represent a
> behavior change. Passwords containing commas were never guaranteed to
> fit in current MOUNT_PASSWD_SIZE sized buffers.

These options would still leave us with password-content specific
behaviour, which seems fragile (open to side-channels attacks, etc).
Shouldn't the new mount API allow for the password to be passed though
to the kernel individually, and in-turn completely avoid comma escaping?

> I believe this would be a separate chage.

Agreed.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-04-02  1:23 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-31  0:09 [PATCH] mount.cifs: fix buffer overrun in set_password David Disseldorp
2026-03-31 17:44 ` Henrique Carvalho
2026-03-31 23:56 ` Steve French
2026-04-01  0:58   ` David Disseldorp
2026-04-01  2:03     ` Steve French
2026-04-01 13:40 ` Enzo Matsumiya
2026-04-01 15:24   ` Henrique Carvalho
2026-04-02  1:23     ` David Disseldorp

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox