linux-hardening.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] ocfs2: Replace strlcpy with strscpy
@ 2023-08-30 21:54 Azeem Shaikh
  2023-08-30 21:54 ` [PATCH 1/2] ocfs2: Replace module_param_call with module_param_cb Azeem Shaikh
  2023-08-30 21:54 ` [PATCH 2/2] ocfs2: Replace strlcpy with strscpy Azeem Shaikh
  0 siblings, 2 replies; 8+ messages in thread
From: Azeem Shaikh @ 2023-08-30 21:54 UTC (permalink / raw)
  To: Mark Fasheh, Joel Becker, Joseph Qi
  Cc: linux-hardening, Azeem Shaikh, ocfs2-devel, linux-kernel,
	Christian Brauner, Dave Chinner, Jeff Layton

Hi,

The main patch this series is targeting is [PATCH 2] which replaces
strlcpy() call with strscpy(). However, while I was tinkering through
the code I noticed that `module_param_call` is marked obsolete and
`module_param_cb` is preferred instead. So I have included [PATCH 1]
which does that.

A crucial thing in [PATCH 2] I would like to bring to reviewer's
attention is that it changes behavior for the case where
sizeof(@buffer) < DLMFS_CAPABILITIES. Currently, this is silently ignored
but with the current change it returns -errno.

Thanks,
Azeem

Azeem Shaikh (2):
  Replace module_param_call with module_param_cb
  Replace strlcpy with strscpy

 fs/ocfs2/dlmfs/dlmfs.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

--
2.42.0.283.g2d96d420d3-goog


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

* [PATCH 1/2] ocfs2: Replace module_param_call with module_param_cb
  2023-08-30 21:54 [PATCH 0/2] ocfs2: Replace strlcpy with strscpy Azeem Shaikh
@ 2023-08-30 21:54 ` Azeem Shaikh
  2023-08-30 23:00   ` Kees Cook
  2023-08-30 21:54 ` [PATCH 2/2] ocfs2: Replace strlcpy with strscpy Azeem Shaikh
  1 sibling, 1 reply; 8+ messages in thread
From: Azeem Shaikh @ 2023-08-30 21:54 UTC (permalink / raw)
  To: Mark Fasheh, Joel Becker, Joseph Qi
  Cc: linux-hardening, Azeem Shaikh, ocfs2-devel, linux-kernel,
	Christian Brauner, Dave Chinner, Jeff Layton

module_param_call has been marked obsolete [1], so replacing its usage with
module_param_cb instead.

[1] https://elixir.bootlin.com/linux/v6.5/source/include/linux/moduleparam.h#L296

Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com>
---
 fs/ocfs2/dlmfs/dlmfs.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
index 81265123ce6c..33e529de93b2 100644
--- a/fs/ocfs2/dlmfs/dlmfs.c
+++ b/fs/ocfs2/dlmfs/dlmfs.c
@@ -83,8 +83,11 @@ static int param_get_dlmfs_capabilities(char *buffer,
 	return strlcpy(buffer, DLMFS_CAPABILITIES,
 		       strlen(DLMFS_CAPABILITIES) + 1);
 }
-module_param_call(capabilities, param_set_dlmfs_capabilities,
-		  param_get_dlmfs_capabilities, NULL, 0444);
+static const struct kernel_param_ops dlmfs_capabilities_ops = {
+	.set = param_set_dlmfs_capabilities,
+	.get = param_get_dlmfs_capabilities,
+};
+module_param_cb(capabilities, &dlmfs_capabilities_ops, NULL, 0444);
 MODULE_PARM_DESC(capabilities, DLMFS_CAPABILITIES);


--
2.42.0.283.g2d96d420d3-goog


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

* [PATCH 2/2] ocfs2: Replace strlcpy with strscpy
  2023-08-30 21:54 [PATCH 0/2] ocfs2: Replace strlcpy with strscpy Azeem Shaikh
  2023-08-30 21:54 ` [PATCH 1/2] ocfs2: Replace module_param_call with module_param_cb Azeem Shaikh
@ 2023-08-30 21:54 ` Azeem Shaikh
  2023-08-30 22:17   ` Justin Stitt
  2023-08-30 23:06   ` Kees Cook
  1 sibling, 2 replies; 8+ messages in thread
From: Azeem Shaikh @ 2023-08-30 21:54 UTC (permalink / raw)
  To: Mark Fasheh, Joel Becker, Joseph Qi
  Cc: linux-hardening, Azeem Shaikh, ocfs2-devel, linux-kernel,
	Christian Brauner, Dave Chinner, Jeff Layton

strlcpy() reads the entire source buffer first.
This read may exceed the destination size limit.
This is both inefficient and can lead to linear read
overflows if a source string is not NUL-terminated [1].
In an effort to remove strlcpy() completely [2], replace
strlcpy() here with strscpy().

Direct replacement is assumed to be safe here since
it's ok for `kernel_param_ops.get()` to return -errno [3].
This changes the behavior such that instead of silently ignoring the
case when sizeof(@buffer) < DLMFS_CAPABILITIES, we now return error.

[1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy
[2] https://github.com/KSPP/linux/issues/89
[3] https://elixir.bootlin.com/linux/v6.5/source/include/linux/moduleparam.h#L52

Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com>
---
 fs/ocfs2/dlmfs/dlmfs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
index 33e529de93b2..b001eccdd2f3 100644
--- a/fs/ocfs2/dlmfs/dlmfs.c
+++ b/fs/ocfs2/dlmfs/dlmfs.c
@@ -80,7 +80,7 @@ static int param_set_dlmfs_capabilities(const char *val,
 static int param_get_dlmfs_capabilities(char *buffer,
 					const struct kernel_param *kp)
 {
-	return strlcpy(buffer, DLMFS_CAPABILITIES,
+	return strscpy(buffer, DLMFS_CAPABILITIES,
 		       strlen(DLMFS_CAPABILITIES) + 1);
 }
 static const struct kernel_param_ops dlmfs_capabilities_ops = {
--
2.42.0.283.g2d96d420d3-goog


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

* Re: [PATCH 2/2] ocfs2: Replace strlcpy with strscpy
  2023-08-30 21:54 ` [PATCH 2/2] ocfs2: Replace strlcpy with strscpy Azeem Shaikh
@ 2023-08-30 22:17   ` Justin Stitt
  2023-08-30 23:06   ` Kees Cook
  1 sibling, 0 replies; 8+ messages in thread
From: Justin Stitt @ 2023-08-30 22:17 UTC (permalink / raw)
  To: Azeem Shaikh
  Cc: Mark Fasheh, Joel Becker, Joseph Qi, linux-hardening,
	ocfs2-devel, linux-kernel, Christian Brauner, Dave Chinner,
	Jeff Layton

On Wed, Aug 30, 2023 at 09:54:26PM +0000, Azeem Shaikh wrote:
> strlcpy() reads the entire source buffer first.
> This read may exceed the destination size limit.
> This is both inefficient and can lead to linear read
> overflows if a source string is not NUL-terminated [1].
> In an effort to remove strlcpy() completely [2], replace
> strlcpy() here with strscpy().
>
> Direct replacement is assumed to be safe here since
> it's ok for `kernel_param_ops.get()` to return -errno [3].
> This changes the behavior such that instead of silently ignoring the
> case when sizeof(@buffer) < DLMFS_CAPABILITIES, we now return error.

Not super familiar with the semantics of `kernel_param_ops.get()` but do
note that strscpy can only return -E2BIG and not -ERRNO specifically. Is
this still OK?

>
> [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy
> [2] https://github.com/KSPP/linux/issues/89
> [3] https://elixir.bootlin.com/linux/v6.5/source/include/linux/moduleparam.h#L52
>
> Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com>
> ---
>  fs/ocfs2/dlmfs/dlmfs.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
> index 33e529de93b2..b001eccdd2f3 100644
> --- a/fs/ocfs2/dlmfs/dlmfs.c
> +++ b/fs/ocfs2/dlmfs/dlmfs.c
> @@ -80,7 +80,7 @@ static int param_set_dlmfs_capabilities(const char *val,
>  static int param_get_dlmfs_capabilities(char *buffer,
>  					const struct kernel_param *kp)
>  {
> -	return strlcpy(buffer, DLMFS_CAPABILITIES,
> +	return strscpy(buffer, DLMFS_CAPABILITIES,
>  		       strlen(DLMFS_CAPABILITIES) + 1);
>  }
>  static const struct kernel_param_ops dlmfs_capabilities_ops = {
> --
> 2.42.0.283.g2d96d420d3-goog
>

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

* Re: [PATCH 1/2] ocfs2: Replace module_param_call with module_param_cb
  2023-08-30 21:54 ` [PATCH 1/2] ocfs2: Replace module_param_call with module_param_cb Azeem Shaikh
@ 2023-08-30 23:00   ` Kees Cook
  0 siblings, 0 replies; 8+ messages in thread
From: Kees Cook @ 2023-08-30 23:00 UTC (permalink / raw)
  To: Azeem Shaikh
  Cc: Mark Fasheh, Joel Becker, Joseph Qi, linux-hardening,
	ocfs2-devel, linux-kernel, Christian Brauner, Dave Chinner,
	Jeff Layton

On Wed, Aug 30, 2023 at 09:54:25PM +0000, Azeem Shaikh wrote:
> module_param_call has been marked obsolete [1], so replacing its usage with
> module_param_cb instead.
> 
> [1] https://elixir.bootlin.com/linux/v6.5/source/include/linux/moduleparam.h#L296
> 
> Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com>
> ---
>  fs/ocfs2/dlmfs/dlmfs.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
> index 81265123ce6c..33e529de93b2 100644
> --- a/fs/ocfs2/dlmfs/dlmfs.c
> +++ b/fs/ocfs2/dlmfs/dlmfs.c
> @@ -83,8 +83,11 @@ static int param_get_dlmfs_capabilities(char *buffer,
>  	return strlcpy(buffer, DLMFS_CAPABILITIES,
>  		       strlen(DLMFS_CAPABILITIES) + 1);
>  }
> -module_param_call(capabilities, param_set_dlmfs_capabilities,
> -		  param_get_dlmfs_capabilities, NULL, 0444);
> +static const struct kernel_param_ops dlmfs_capabilities_ops = {
> +	.set = param_set_dlmfs_capabilities,
> +	.get = param_get_dlmfs_capabilities,
> +};
> +module_param_cb(capabilities, &dlmfs_capabilities_ops, NULL, 0444);
>  MODULE_PARM_DESC(capabilities, DLMFS_CAPABILITIES);

Oh, hm. Yeah, that's not good documentation. It was originally added in
9bbb9e5a33109b2832e2e63dcc7a132924ab374b, but that was doing some
casting and other things during the conversion to an ops structure.

I cleaned up all the last of those back in 2017, and I should have
dropped the "Obsolete" comment:
ece1996a21eeb344b49200e627c6660111009c10
b2f270e8747387335d80428c576118e7d87f69cc

The resulting patch you sent ends up literally open coding what it
already does...

#define module_param_call(name, _set, _get, arg, perm)                  \
        static const struct kernel_param_ops __param_ops_##name =       \
                { .flags = 0, .set = _set, .get = _get };               \
        __module_param_call(MODULE_PARAM_PREFIX,                        \
                            name, &__param_ops_##name, arg, perm, -1, 0)

#define module_param_cb(name, ops, arg, perm)                                 \
        __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1, 0)

Looking at usage, it's still common:

$ git grep '^module_param_call(' | wc -l
54
$ git grep '^module_param_cb(' | wc -l
93

And the users of module_param_cb() appear to be almost universally
open-coding the result. Only a few initialize struct members that aren't
.get and .set:

$ git grep -B6 ^module_param_cb

I'd say drop this patch and instead patch moduleparam.h to not say it's
deprecated. :P

-Kees

-- 
Kees Cook

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

* Re: [PATCH 2/2] ocfs2: Replace strlcpy with strscpy
  2023-08-30 21:54 ` [PATCH 2/2] ocfs2: Replace strlcpy with strscpy Azeem Shaikh
  2023-08-30 22:17   ` Justin Stitt
@ 2023-08-30 23:06   ` Kees Cook
  2023-08-31 19:28     ` Azeem Shaikh
  1 sibling, 1 reply; 8+ messages in thread
From: Kees Cook @ 2023-08-30 23:06 UTC (permalink / raw)
  To: Azeem Shaikh
  Cc: Mark Fasheh, Joel Becker, Joseph Qi, linux-hardening,
	ocfs2-devel, linux-kernel, Christian Brauner, Dave Chinner,
	Jeff Layton

On Wed, Aug 30, 2023 at 09:54:26PM +0000, Azeem Shaikh wrote:
> strlcpy() reads the entire source buffer first.
> This read may exceed the destination size limit.
> This is both inefficient and can lead to linear read
> overflows if a source string is not NUL-terminated [1].
> In an effort to remove strlcpy() completely [2], replace
> strlcpy() here with strscpy().
> 
> Direct replacement is assumed to be safe here since
> it's ok for `kernel_param_ops.get()` to return -errno [3].
> This changes the behavior such that instead of silently ignoring the
> case when sizeof(@buffer) < DLMFS_CAPABILITIES, we now return error.
> 
> [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy
> [2] https://github.com/KSPP/linux/issues/89
> [3] https://elixir.bootlin.com/linux/v6.5/source/include/linux/moduleparam.h#L52
> 
> Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com>
> ---
>  fs/ocfs2/dlmfs/dlmfs.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
> index 33e529de93b2..b001eccdd2f3 100644
> --- a/fs/ocfs2/dlmfs/dlmfs.c
> +++ b/fs/ocfs2/dlmfs/dlmfs.c
> @@ -80,7 +80,7 @@ static int param_set_dlmfs_capabilities(const char *val,
>  static int param_get_dlmfs_capabilities(char *buffer,
>  					const struct kernel_param *kp)
>  {
> -	return strlcpy(buffer, DLMFS_CAPABILITIES,
> +	return strscpy(buffer, DLMFS_CAPABILITIES,
>  		       strlen(DLMFS_CAPABILITIES) + 1);
>  }

This is another case of "accidentally correct".


param->get() is hooked here, in the sysfs "show" callback:

static ssize_t param_attr_show(struct module_attribute *mattr,
                               struct module_kobject *mk, char *buf)
{
        int count;
        struct param_attribute *attribute = to_param_attr(mattr);

        if (!attribute->param->ops->get)
                return -EPERM;

        kernel_param_lock(mk->mod);
        count = attribute->param->ops->get(buf, attribute->param);
        kernel_param_unlock(mk->mod);
        return count;
}

Meaning ultimately this will show up here, if I'm reading names right:
/sys/module/ocfs/parameters/dlmfs_capabilities

Anyway, the "count" being returned would be quite bad if
DLMFS_CAPABILITIES were dynamic and larger than PAGE_SIZE (the size of
the sysfs buffer).

For this case, I would say replace strlcpy with sysfs_emit:

	return sysfs_emit(buffer, DLMFS_CAPABILITIES);

(Also, ew, existing code doesn't include a trailing "\n". Oh well.)

-Kees

-- 
Kees Cook

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

* Re: [PATCH 2/2] ocfs2: Replace strlcpy with strscpy
  2023-08-30 23:06   ` Kees Cook
@ 2023-08-31 19:28     ` Azeem Shaikh
  2023-08-31 21:04       ` Kees Cook
  0 siblings, 1 reply; 8+ messages in thread
From: Azeem Shaikh @ 2023-08-31 19:28 UTC (permalink / raw)
  To: Kees Cook
  Cc: Mark Fasheh, Joel Becker, Joseph Qi, linux-hardening,
	ocfs2-devel, linux-kernel, Christian Brauner, Dave Chinner,
	Jeff Layton

On Wed, Aug 30, 2023 at 7:06 PM Kees Cook <keescook@chromium.org> wrote:
>
> On Wed, Aug 30, 2023 at 09:54:26PM +0000, Azeem Shaikh wrote:
> > strlcpy() reads the entire source buffer first.
> > This read may exceed the destination size limit.
> > This is both inefficient and can lead to linear read
> > overflows if a source string is not NUL-terminated [1].
> > In an effort to remove strlcpy() completely [2], replace
> > strlcpy() here with strscpy().
> >
> > Direct replacement is assumed to be safe here since
> > it's ok for `kernel_param_ops.get()` to return -errno [3].
> > This changes the behavior such that instead of silently ignoring the
> > case when sizeof(@buffer) < DLMFS_CAPABILITIES, we now return error.
> >
> > [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy
> > [2] https://github.com/KSPP/linux/issues/89
> > [3] https://elixir.bootlin.com/linux/v6.5/source/include/linux/moduleparam.h#L52
> >
> > Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com>
> > ---
> >  fs/ocfs2/dlmfs/dlmfs.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
> > index 33e529de93b2..b001eccdd2f3 100644
> > --- a/fs/ocfs2/dlmfs/dlmfs.c
> > +++ b/fs/ocfs2/dlmfs/dlmfs.c
> > @@ -80,7 +80,7 @@ static int param_set_dlmfs_capabilities(const char *val,
> >  static int param_get_dlmfs_capabilities(char *buffer,
> >                                       const struct kernel_param *kp)
> >  {
> > -     return strlcpy(buffer, DLMFS_CAPABILITIES,
> > +     return strscpy(buffer, DLMFS_CAPABILITIES,
> >                      strlen(DLMFS_CAPABILITIES) + 1);
> >  }
>
> This is another case of "accidentally correct".
>
>
> param->get() is hooked here, in the sysfs "show" callback:
>
> static ssize_t param_attr_show(struct module_attribute *mattr,
>                                struct module_kobject *mk, char *buf)
> {
>         int count;
>         struct param_attribute *attribute = to_param_attr(mattr);
>
>         if (!attribute->param->ops->get)
>                 return -EPERM;
>
>         kernel_param_lock(mk->mod);
>         count = attribute->param->ops->get(buf, attribute->param);
>         kernel_param_unlock(mk->mod);
>         return count;
> }
>
> Meaning ultimately this will show up here, if I'm reading names right:
> /sys/module/ocfs/parameters/dlmfs_capabilities
>
> Anyway, the "count" being returned would be quite bad if
> DLMFS_CAPABILITIES were dynamic and larger than PAGE_SIZE (the size of
> the sysfs buffer).
>
> For this case, I would say replace strlcpy with sysfs_emit:
>
>         return sysfs_emit(buffer, DLMFS_CAPABILITIES);
>

Thanks, sending out a v2 for this. Out of curiosity - why sysfs_emit?
Is it because DLMFS_CAPABILITIES is a hard-coded string?

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

* Re: [PATCH 2/2] ocfs2: Replace strlcpy with strscpy
  2023-08-31 19:28     ` Azeem Shaikh
@ 2023-08-31 21:04       ` Kees Cook
  0 siblings, 0 replies; 8+ messages in thread
From: Kees Cook @ 2023-08-31 21:04 UTC (permalink / raw)
  To: Azeem Shaikh
  Cc: Mark Fasheh, Joel Becker, Joseph Qi, linux-hardening,
	ocfs2-devel, linux-kernel, Christian Brauner, Dave Chinner,
	Jeff Layton

On Thu, Aug 31, 2023 at 03:28:32PM -0400, Azeem Shaikh wrote:
> On Wed, Aug 30, 2023 at 7:06 PM Kees Cook <keescook@chromium.org> wrote:
> >
> > On Wed, Aug 30, 2023 at 09:54:26PM +0000, Azeem Shaikh wrote:
> > > strlcpy() reads the entire source buffer first.
> > > This read may exceed the destination size limit.
> > > This is both inefficient and can lead to linear read
> > > overflows if a source string is not NUL-terminated [1].
> > > In an effort to remove strlcpy() completely [2], replace
> > > strlcpy() here with strscpy().
> > >
> > > Direct replacement is assumed to be safe here since
> > > it's ok for `kernel_param_ops.get()` to return -errno [3].
> > > This changes the behavior such that instead of silently ignoring the
> > > case when sizeof(@buffer) < DLMFS_CAPABILITIES, we now return error.
> > >
> > > [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy
> > > [2] https://github.com/KSPP/linux/issues/89
> > > [3] https://elixir.bootlin.com/linux/v6.5/source/include/linux/moduleparam.h#L52
> > >
> > > Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com>
> > > ---
> > >  fs/ocfs2/dlmfs/dlmfs.c | 2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
> > > index 33e529de93b2..b001eccdd2f3 100644
> > > --- a/fs/ocfs2/dlmfs/dlmfs.c
> > > +++ b/fs/ocfs2/dlmfs/dlmfs.c
> > > @@ -80,7 +80,7 @@ static int param_set_dlmfs_capabilities(const char *val,
> > >  static int param_get_dlmfs_capabilities(char *buffer,
> > >                                       const struct kernel_param *kp)
> > >  {
> > > -     return strlcpy(buffer, DLMFS_CAPABILITIES,
> > > +     return strscpy(buffer, DLMFS_CAPABILITIES,
> > >                      strlen(DLMFS_CAPABILITIES) + 1);
> > >  }
> >
> > This is another case of "accidentally correct".
> >
> >
> > param->get() is hooked here, in the sysfs "show" callback:
> >
> > static ssize_t param_attr_show(struct module_attribute *mattr,
> >                                struct module_kobject *mk, char *buf)
> > {
> >         int count;
> >         struct param_attribute *attribute = to_param_attr(mattr);
> >
> >         if (!attribute->param->ops->get)
> >                 return -EPERM;
> >
> >         kernel_param_lock(mk->mod);
> >         count = attribute->param->ops->get(buf, attribute->param);
> >         kernel_param_unlock(mk->mod);
> >         return count;
> > }
> >
> > Meaning ultimately this will show up here, if I'm reading names right:
> > /sys/module/ocfs/parameters/dlmfs_capabilities
> >
> > Anyway, the "count" being returned would be quite bad if
> > DLMFS_CAPABILITIES were dynamic and larger than PAGE_SIZE (the size of
> > the sysfs buffer).
> >
> > For this case, I would say replace strlcpy with sysfs_emit:
> >
> >         return sysfs_emit(buffer, DLMFS_CAPABILITIES);
> >
> 
> Thanks, sending out a v2 for this. Out of curiosity - why sysfs_emit?
> Is it because DLMFS_CAPABILITIES is a hard-coded string?

It's basically that sysfs_emit() Does The Right Thing for these
callbacks: it tracks the offset of the buffer and checks for buffer
overflow. (All the sysfs callback work on a page-aligned page-sized
buffer, and the API lacks any length info -- it's "understood" to be
page-sized.) So, since this is doing a string copy into what is
ultimately a sysfs buffer, it's best to use sysfs_emit().

-- 
Kees Cook

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

end of thread, other threads:[~2023-08-31 21:04 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-30 21:54 [PATCH 0/2] ocfs2: Replace strlcpy with strscpy Azeem Shaikh
2023-08-30 21:54 ` [PATCH 1/2] ocfs2: Replace module_param_call with module_param_cb Azeem Shaikh
2023-08-30 23:00   ` Kees Cook
2023-08-30 21:54 ` [PATCH 2/2] ocfs2: Replace strlcpy with strscpy Azeem Shaikh
2023-08-30 22:17   ` Justin Stitt
2023-08-30 23:06   ` Kees Cook
2023-08-31 19:28     ` Azeem Shaikh
2023-08-31 21:04       ` Kees Cook

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).