diff mbox series

nfs_sysfs_link_rpc_client(): Replace strcpy with strscpy

Message ID 20241106024952.494718-1-danielyangkang@gmail.com (mailing list archive)
State New
Headers show
Series nfs_sysfs_link_rpc_client(): Replace strcpy with strscpy | expand

Commit Message

Daniel Yang Nov. 6, 2024, 2:49 a.m. UTC
The function strcpy is deprecated due to lack of bounds checking. The
recommended replacement is strscpy.

Signed-off-by: Daniel Yang <danielyangkang@gmail.com>
---
 fs/nfs/sysfs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Benjamin Coddington Nov. 6, 2024, 7:30 p.m. UTC | #1
On 5 Nov 2024, at 21:49, Daniel Yang wrote:

> The function strcpy is deprecated due to lack of bounds checking. The
> recommended replacement is strscpy.
>
> Signed-off-by: Daniel Yang <danielyangkang@gmail.com>

Reviewed-by: Benjamin Coddington <bcodding@redhat.com>

Ben
Roland Mainz Nov. 6, 2024, 8:20 p.m. UTC | #2
On Wed, Nov 6, 2024 at 3:49 AM Daniel Yang <danielyangkang@gmail.com> wrote:
>
> The function strcpy is deprecated due to lack of bounds checking. The
> recommended replacement is strscpy.
>
> Signed-off-by: Daniel Yang <danielyangkang@gmail.com>
> ---
>  fs/nfs/sysfs.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/nfs/sysfs.c b/fs/nfs/sysfs.c
> index bf378ecd5..f3d0b2ef9 100644
> --- a/fs/nfs/sysfs.c
> +++ b/fs/nfs/sysfs.c
> @@ -280,7 +280,7 @@ void nfs_sysfs_link_rpc_client(struct nfs_server *server,
>         char name[RPC_CLIENT_NAME_SIZE];
>         int ret;
>
> -       strcpy(name, clnt->cl_program->name);
> +       strscpy(name, clnt->cl_program->name);

How should the "bounds checking" work in this case if you only pass
two arguments ?
Per https://manpages.debian.org/testing/linux-manual-4.8/strscpy.9.en.html
|strscpy()| takes three arguments...

----

Bye,
Roland
Benjamin Coddington Nov. 6, 2024, 8:40 p.m. UTC | #3
On 6 Nov 2024, at 15:20, Roland Mainz wrote:

> On Wed, Nov 6, 2024 at 3:49 AM Daniel Yang <danielyangkang@gmail.com> wrote:
>>
>> The function strcpy is deprecated due to lack of bounds checking. The
>> recommended replacement is strscpy.
>>
>> Signed-off-by: Daniel Yang <danielyangkang@gmail.com>
>> ---
>>  fs/nfs/sysfs.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/fs/nfs/sysfs.c b/fs/nfs/sysfs.c
>> index bf378ecd5..f3d0b2ef9 100644
>> --- a/fs/nfs/sysfs.c
>> +++ b/fs/nfs/sysfs.c
>> @@ -280,7 +280,7 @@ void nfs_sysfs_link_rpc_client(struct nfs_server *server,
>>         char name[RPC_CLIENT_NAME_SIZE];
>>         int ret;
>>
>> -       strcpy(name, clnt->cl_program->name);
>> +       strscpy(name, clnt->cl_program->name);
>
> How should the "bounds checking" work in this case if you only pass
> two arguments ?

The linux kernel strscpy() checks the sizeof the destination.

Ben
Sebastian Feld Nov. 9, 2024, 11:11 a.m. UTC | #4
On Wed, Nov 6, 2024 at 9:40 PM Benjamin Coddington <bcodding@redhat.com> wrote:
>
> On 6 Nov 2024, at 15:20, Roland Mainz wrote:
>
> > On Wed, Nov 6, 2024 at 3:49 AM Daniel Yang <danielyangkang@gmail.com> wrote:
> >>
> >> The function strcpy is deprecated due to lack of bounds checking. The
> >> recommended replacement is strscpy.
> >>
> >> Signed-off-by: Daniel Yang <danielyangkang@gmail.com>
> >> ---
> >>  fs/nfs/sysfs.c | 2 +-
> >>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/fs/nfs/sysfs.c b/fs/nfs/sysfs.c
> >> index bf378ecd5..f3d0b2ef9 100644
> >> --- a/fs/nfs/sysfs.c
> >> +++ b/fs/nfs/sysfs.c
> >> @@ -280,7 +280,7 @@ void nfs_sysfs_link_rpc_client(struct nfs_server *server,
> >>         char name[RPC_CLIENT_NAME_SIZE];
> >>         int ret;
> >>
> >> -       strcpy(name, clnt->cl_program->name);
> >> +       strscpy(name, clnt->cl_program->name);
> >
> > How should the "bounds checking" work in this case if you only pass
> > two arguments ?
>
> The linux kernel strscpy() checks the sizeof the destination.

Then the kernel strscpy() should be renamed accordingly, and not
confuse people. Suggested name would be kstrscpy().
Otherwise this would disqualify strscpy() ever from being adopted as a
POSIX standard, as there are two - kernel and glibc - conflicting
implementations

Sebi
Benjamin Coddington Nov. 9, 2024, 11:28 a.m. UTC | #5
On 9 Nov 2024, at 6:11, Sebastian Feld wrote:

> On Wed, Nov 6, 2024 at 9:40 PM Benjamin Coddington <bcodding@redhat.com> wrote:
>>
>> On 6 Nov 2024, at 15:20, Roland Mainz wrote:
>>
>>> On Wed, Nov 6, 2024 at 3:49 AM Daniel Yang <danielyangkang@gmail.com> wrote:
>>>>
>>>> The function strcpy is deprecated due to lack of bounds checking. The
>>>> recommended replacement is strscpy.
>>>>
>>>> Signed-off-by: Daniel Yang <danielyangkang@gmail.com>
>>>> ---
>>>>  fs/nfs/sysfs.c | 2 +-
>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/fs/nfs/sysfs.c b/fs/nfs/sysfs.c
>>>> index bf378ecd5..f3d0b2ef9 100644
>>>> --- a/fs/nfs/sysfs.c
>>>> +++ b/fs/nfs/sysfs.c
>>>> @@ -280,7 +280,7 @@ void nfs_sysfs_link_rpc_client(struct nfs_server *server,
>>>>         char name[RPC_CLIENT_NAME_SIZE];
>>>>         int ret;
>>>>
>>>> -       strcpy(name, clnt->cl_program->name);
>>>> +       strscpy(name, clnt->cl_program->name);
>>>
>>> How should the "bounds checking" work in this case if you only pass
>>> two arguments ?
>>
>> The linux kernel strscpy() checks the sizeof the destination.
>
> Then the kernel strscpy() should be renamed accordingly, and not
> confuse people. Suggested name would be kstrscpy().
> Otherwise this would disqualify strscpy() ever from being adopted as a
> POSIX standard, as there are two - kernel and glibc - conflicting
> implementations

I should have said the linux kernel strscpy() can accept only two args if
the destination is a statically-defined array.  Most uses are the three arg
version.

Ben
Theodore Ts'o Nov. 9, 2024, 12:01 p.m. UTC | #6
On Sat, Nov 09, 2024 at 12:11:02PM +0100, Sebastian Feld wrote:
> > > How should the "bounds checking" work in this case if you only pass
> > > two arguments ?
> >
> > The linux kernel strscpy() checks the sizeof the destination.
> 
> Then the kernel strscpy() should be renamed accordingly, and not
> confuse people. Suggested name would be kstrscpy().
> Otherwise this would disqualify strscpy() ever from being adopted as a
> POSIX standard, as there are two - kernel and glibc - conflicting
> implementations

If POSIX decided that this meant they couldn't adopt strscpy(), that
is ANSI / ISO's problem, not ours.  Note that strscpy() supports the 3
argument version of glibc, and POSIX has always been willing to
standardize a subset of a particullar interface.

Otherwise, any Legacy Unix system which added some one or more flags
to some particular interface could potentially disqualify anything
with the same name of that interface from ever being standardized,
which is (a) stupid, and (b) not what has been done in historical
practice.

					- Ted
diff mbox series

Patch

diff --git a/fs/nfs/sysfs.c b/fs/nfs/sysfs.c
index bf378ecd5..f3d0b2ef9 100644
--- a/fs/nfs/sysfs.c
+++ b/fs/nfs/sysfs.c
@@ -280,7 +280,7 @@  void nfs_sysfs_link_rpc_client(struct nfs_server *server,
 	char name[RPC_CLIENT_NAME_SIZE];
 	int ret;
 
-	strcpy(name, clnt->cl_program->name);
+	strscpy(name, clnt->cl_program->name);
 	strcat(name, uniq ? uniq : "");
 	strcat(name, "_client");