diff mbox series

SUNRPC: Fix -Wformat-truncation warning

Message ID 20240814093853.48657-1-kunwu.chan@linux.dev (mailing list archive)
State New
Headers show
Series SUNRPC: Fix -Wformat-truncation warning | expand

Commit Message

Kunwu Chan Aug. 14, 2024, 9:38 a.m. UTC
From: Kunwu Chan <chentao@kylinos.cn>

Increase size of the servername array to avoid truncated output warning.

net/sunrpc/clnt.c:582:75: error:‘%s’ directive output may be truncated
writing up to 107 bytes into a region of size 48
[-Werror=format-truncation=]
  582 |                   snprintf(servername, sizeof(servername), "%s",
      |                                                             ^~

net/sunrpc/clnt.c:582:33: note:‘snprintf’ output
between 1 and 108 bytes into a destination of size 48
  582 |                     snprintf(servername, sizeof(servername), "%s",
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  583 |                                          sun->sun_path);

Signed-off-by: Kunwu Chan <chentao@kylinos.cn>
---
 net/sunrpc/clnt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

NeilBrown Aug. 14, 2024, 10:28 a.m. UTC | #1
On Wed, 14 Aug 2024, kunwu.chan@linux.dev wrote:
> From: Kunwu Chan <chentao@kylinos.cn>
> 
> Increase size of the servername array to avoid truncated output warning.
> 
> net/sunrpc/clnt.c:582:75: error:‘%s’ directive output may be truncated
> writing up to 107 bytes into a region of size 48
> [-Werror=format-truncation=]
>   582 |                   snprintf(servername, sizeof(servername), "%s",
>       |                                                             ^~
> 
> net/sunrpc/clnt.c:582:33: note:‘snprintf’ output
> between 1 and 108 bytes into a destination of size 48
>   582 |                     snprintf(servername, sizeof(servername), "%s",
>       |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>   583 |                                          sun->sun_path);
> 
> Signed-off-by: Kunwu Chan <chentao@kylinos.cn>
> ---
>  net/sunrpc/clnt.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
> index 09f29a95f2bc..874085f3ed50 100644
> --- a/net/sunrpc/clnt.c
> +++ b/net/sunrpc/clnt.c
> @@ -546,7 +546,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
>  		.connect_timeout = args->connect_timeout,
>  		.reconnect_timeout = args->reconnect_timeout,
>  	};
> -	char servername[48];
> +	char servername[108];

If we choose this approach to removing the warning, then we should use
UNIX_PATH_MAX rather than 108.

However the longest server name copied in here will in practice be
   /var/run/rpcbind.sock

so the extra 60 bytes on the stack is wasted ...  maybe that doesn't
matter.

The string is only used by xprt_create_transport() which requires it to
be less than RPC_MAXNETNAMELEN - which is 256.
So maybe that would be a better value to use for the array size ....  if
we assume that stack space isn't a problem.

What ever number we use, I'd rather it was a defined constant, and not
an apparently arbitrary number.

Thanks,
NeilBrown


>  	struct rpc_clnt *clnt;
>  	int i;
>  
> -- 
> 2.40.1
> 
>
Kunwu Chan Aug. 15, 2024, 8:30 a.m. UTC | #2
Thanks for your reply.

On 2024/8/14 18:28, NeilBrown wrote:
> On Wed, 14 Aug 2024, kunwu.chan@linux.dev wrote:
>> From: Kunwu Chan <chentao@kylinos.cn>
>>
>> Increase size of the servername array to avoid truncated output warning.
>>
>> net/sunrpc/clnt.c:582:75: error:‘%s’ directive output may be truncated
>> writing up to 107 bytes into a region of size 48
>> [-Werror=format-truncation=]
>>    582 |                   snprintf(servername, sizeof(servername), "%s",
>>        |                                                             ^~
>>
>> net/sunrpc/clnt.c:582:33: note:‘snprintf’ output
>> between 1 and 108 bytes into a destination of size 48
>>    582 |                     snprintf(servername, sizeof(servername), "%s",
>>        |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>    583 |                                          sun->sun_path);
>>
>> Signed-off-by: Kunwu Chan <chentao@kylinos.cn>
>> ---
>>   net/sunrpc/clnt.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
>> index 09f29a95f2bc..874085f3ed50 100644
>> --- a/net/sunrpc/clnt.c
>> +++ b/net/sunrpc/clnt.c
>> @@ -546,7 +546,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
>>   		.connect_timeout = args->connect_timeout,
>>   		.reconnect_timeout = args->reconnect_timeout,
>>   	};
>> -	char servername[48];
>> +	char servername[108];
> If we choose this approach to removing the warning, then we should use
> UNIX_PATH_MAX rather than 108.
My negligence.
>
> However the longest server name copied in here will in practice be
>     /var/run/rpcbind.sock
>
> so the extra 60 bytes on the stack is wasted ...  maybe that doesn't
> matter.
I'm thinking  about use a dynamic space alloc method like kasprintf to 
avoid space waste.
> The string is only used by xprt_create_transport() which requires it to
> be less than RPC_MAXNETNAMELEN - which is 256.
> So maybe that would be a better value to use for the array size ....  if
> we assume that stack space isn't a problem.

Thank you for the detailed explanation. I read the 
xprt_create_transport,  the RPC_MAXNETNAMELEN

is only use to xprt_create_transport .

> What ever number we use, I'd rather it was a defined constant, and not
> an apparently arbitrary number.

Whether we could check the sun->sun_path length before using snprintf?  
The array size should smaller

than  the minimum of sun->sun_path and RPC_MAXNETNAMELEN.

Or use the dynamic space allocate method to save space.

>
> Thanks,
> NeilBrown
>
>
>>   	struct rpc_clnt *clnt;
>>   	int i;
>>   
>> -- 
>> 2.40.1
>>
>>
NeilBrown Aug. 15, 2024, 11:39 a.m. UTC | #3
On Thu, 15 Aug 2024, Kunwu Chan wrote:
> Thanks for your reply.
> 
> On 2024/8/14 18:28, NeilBrown wrote:
> > On Wed, 14 Aug 2024, kunwu.chan@linux.dev wrote:
> >> From: Kunwu Chan <chentao@kylinos.cn>
> >>
> >> Increase size of the servername array to avoid truncated output warning.
> >>
> >> net/sunrpc/clnt.c:582:75: error:‘%s’ directive output may be truncated
> >> writing up to 107 bytes into a region of size 48
> >> [-Werror=format-truncation=]
> >>    582 |                   snprintf(servername, sizeof(servername), "%s",
> >>        |                                                             ^~
> >>
> >> net/sunrpc/clnt.c:582:33: note:‘snprintf’ output
> >> between 1 and 108 bytes into a destination of size 48
> >>    582 |                     snprintf(servername, sizeof(servername), "%s",
> >>        |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >>    583 |                                          sun->sun_path);
> >>
> >> Signed-off-by: Kunwu Chan <chentao@kylinos.cn>
> >> ---
> >>   net/sunrpc/clnt.c | 2 +-
> >>   1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
> >> index 09f29a95f2bc..874085f3ed50 100644
> >> --- a/net/sunrpc/clnt.c
> >> +++ b/net/sunrpc/clnt.c
> >> @@ -546,7 +546,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
> >>   		.connect_timeout = args->connect_timeout,
> >>   		.reconnect_timeout = args->reconnect_timeout,
> >>   	};
> >> -	char servername[48];
> >> +	char servername[108];
> > If we choose this approach to removing the warning, then we should use
> > UNIX_PATH_MAX rather than 108.
> My negligence.
> >
> > However the longest server name copied in here will in practice be
> >     /var/run/rpcbind.sock
> >
> > so the extra 60 bytes on the stack is wasted ...  maybe that doesn't
> > matter.
> I'm thinking  about use a dynamic space alloc method like kasprintf to 
> avoid space waste.
> > The string is only used by xprt_create_transport() which requires it to
> > be less than RPC_MAXNETNAMELEN - which is 256.
> > So maybe that would be a better value to use for the array size ....  if
> > we assume that stack space isn't a problem.
> 
> Thank you for the detailed explanation. I read the 
> xprt_create_transport,  the RPC_MAXNETNAMELEN
> 
> is only use to xprt_create_transport .
> 
> > What ever number we use, I'd rather it was a defined constant, and not
> > an apparently arbitrary number.
> 
> Whether we could check the sun->sun_path length before using snprintf?  
> The array size should smaller
> 
> than  the minimum of sun->sun_path and RPC_MAXNETNAMELEN.
> 
> Or use the dynamic space allocate method to save space.

I think that dynamically allocating space is not a good idea.  It means
you have to handle failure which is just a waste of code.

I'd suggest simply changing the array to RPC_MAXNETNAMELEN.

NeilBrown



> 
> >
> > Thanks,
> > NeilBrown
> >
> >
> >>   	struct rpc_clnt *clnt;
> >>   	int i;
> >>   
> >> -- 
> >> 2.40.1
> >>
> >>
> -- 
> Thanks,
>    Kunwu.Chan
> 
>
Kunwu Chan Aug. 16, 2024, 1:52 a.m. UTC | #4
Thanks for your reply.

On 2024/8/15 19:39, NeilBrown wrote:
> On Thu, 15 Aug 2024, Kunwu Chan wrote:
>> Thanks for your reply.
>>
>> On 2024/8/14 18:28, NeilBrown wrote:
>>> On Wed, 14 Aug 2024, kunwu.chan@linux.dev wrote:
>>>> From: Kunwu Chan <chentao@kylinos.cn>
>>>>
>>>> Increase size of the servername array to avoid truncated output warning.
>>>>
>>>> net/sunrpc/clnt.c:582:75: error:‘%s’ directive output may be truncated
>>>> writing up to 107 bytes into a region of size 48
>>>> [-Werror=format-truncation=]
>>>>     582 |                   snprintf(servername, sizeof(servername), "%s",
>>>>         |                                                             ^~
>>>>
>>>> net/sunrpc/clnt.c:582:33: note:‘snprintf’ output
>>>> between 1 and 108 bytes into a destination of size 48
>>>>     582 |                     snprintf(servername, sizeof(servername), "%s",
>>>>         |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>     583 |                                          sun->sun_path);
>>>>
>>>> Signed-off-by: Kunwu Chan <chentao@kylinos.cn>
>>>> ---
>>>>    net/sunrpc/clnt.c | 2 +-
>>>>    1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
>>>> index 09f29a95f2bc..874085f3ed50 100644
>>>> --- a/net/sunrpc/clnt.c
>>>> +++ b/net/sunrpc/clnt.c
>>>> @@ -546,7 +546,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
>>>>    		.connect_timeout = args->connect_timeout,
>>>>    		.reconnect_timeout = args->reconnect_timeout,
>>>>    	};
>>>> -	char servername[48];
>>>> +	char servername[108];
>>> If we choose this approach to removing the warning, then we should use
>>> UNIX_PATH_MAX rather than 108.
>> My negligence.
>>> However the longest server name copied in here will in practice be
>>>      /var/run/rpcbind.sock
>>>
>>> so the extra 60 bytes on the stack is wasted ...  maybe that doesn't
>>> matter.
>> I'm thinking  about use a dynamic space alloc method like kasprintf to
>> avoid space waste.
>>> The string is only used by xprt_create_transport() which requires it to
>>> be less than RPC_MAXNETNAMELEN - which is 256.
>>> So maybe that would be a better value to use for the array size ....  if
>>> we assume that stack space isn't a problem.
>> Thank you for the detailed explanation. I read the
>> xprt_create_transport,  the RPC_MAXNETNAMELEN
>>
>> is only use to xprt_create_transport .
>>
>>> What ever number we use, I'd rather it was a defined constant, and not
>>> an apparently arbitrary number.
>> Whether we could check the sun->sun_path length before using snprintf?
>> The array size should smaller
>>
>> than  the minimum of sun->sun_path and RPC_MAXNETNAMELEN.
>>
>> Or use the dynamic space allocate method to save space.
> I think that dynamically allocating space is not a good idea.  It means
> you have to handle failure which is just a waste of code.
>
> I'd suggest simply changing the array to RPC_MAXNETNAMELEN.
I'll follow your suggestion and change it in v2.
>
> NeilBrown
>
>
>
>>> Thanks,
>>> NeilBrown
>>>
>>>
>>>>    	struct rpc_clnt *clnt;
>>>>    	int i;
>>>>    
>>>> -- 
>>>> 2.40.1
>>>>
>>>>
>> -- 
>> Thanks,
>>     Kunwu.Chan
>>
>>
Andrew Lunn Aug. 16, 2024, 10:01 p.m. UTC | #5
On Wed, Aug 14, 2024 at 05:38:53PM +0800, kunwu.chan@linux.dev wrote:
> From: Kunwu Chan <chentao@kylinos.cn>
> 
> Increase size of the servername array to avoid truncated output warning.
> 
> net/sunrpc/clnt.c:582:75: error:‘%s’ directive output may be truncated
> writing up to 107 bytes into a region of size 48
> [-Werror=format-truncation=]
>   582 |                   snprintf(servername, sizeof(servername), "%s",
>       |                                                             ^~
> 
> net/sunrpc/clnt.c:582:33: note:‘snprintf’ output
> between 1 and 108 bytes into a destination of size 48
>   582 |                     snprintf(servername, sizeof(servername), "%s",
>       |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>   583 |                                          sun->sun_path);

I think this has come up before, but i could be mis-remembering.
Please could you do a search for the discussion. The fact it is not
solved suggests to me it is not so simple to fix. Maybe there is some
protocol implications here.

       Andrew
NeilBrown Aug. 16, 2024, 11:07 p.m. UTC | #6
On Sat, 17 Aug 2024, Andrew Lunn wrote:
> On Wed, Aug 14, 2024 at 05:38:53PM +0800, kunwu.chan@linux.dev wrote:
> > From: Kunwu Chan <chentao@kylinos.cn>
> > 
> > Increase size of the servername array to avoid truncated output warning.
> > 
> > net/sunrpc/clnt.c:582:75: error:‘%s’ directive output may be truncated
> > writing up to 107 bytes into a region of size 48
> > [-Werror=format-truncation=]
> >   582 |                   snprintf(servername, sizeof(servername), "%s",
> >       |                                                             ^~
> > 
> > net/sunrpc/clnt.c:582:33: note:‘snprintf’ output
> > between 1 and 108 bytes into a destination of size 48
> >   582 |                     snprintf(servername, sizeof(servername), "%s",
> >       |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >   583 |                                          sun->sun_path);
> 
> I think this has come up before, but i could be mis-remembering.
> Please could you do a search for the discussion. The fact it is not
> solved suggests to me it is not so simple to fix. Maybe there is some
> protocol implications here.
> 
>        Andrew
> 

All I could find was 

 https://lore.kernel.org/all/1648103566-15528-1-git-send-email-baihaowen@meizu.com/

which essentially followed the same path as this conversation.  The
patch was resubmitted using UNIX_PATH_MAX but never responded to by the
relevant maintainers.

There are no protocol implications.  This string is only used for
informational messages.

NeilBrown
diff mbox series

Patch

diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 09f29a95f2bc..874085f3ed50 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -546,7 +546,7 @@  struct rpc_clnt *rpc_create(struct rpc_create_args *args)
 		.connect_timeout = args->connect_timeout,
 		.reconnect_timeout = args->reconnect_timeout,
 	};
-	char servername[48];
+	char servername[108];
 	struct rpc_clnt *clnt;
 	int i;