[PATCH 1/3] lib/sys_info: handle sys_info_mask==0 case

Feng Tang posted 3 patches 1 month, 2 weeks ago
There is a newer version of this series
[PATCH 1/3] lib/sys_info: handle sys_info_mask==0 case
Posted by Feng Tang 1 month, 2 weeks ago
It is a normal case that bitmask parameter is 0, so pre-initialize the
names[] to null string to cover this case.

Also remove the superfluous "+1" in names[sizeof(sys_info_avail) + 1],
which is needed for 'strlen()', but not for 'sizeof()'.

Suggested-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Feng Tang <feng.tang@linux.alibaba.com>
---
 lib/sys_info.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/lib/sys_info.c b/lib/sys_info.c
index 5bf503fd7ec1..b2df148971ba 100644
--- a/lib/sys_info.c
+++ b/lib/sys_info.c
@@ -55,7 +55,7 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 					  void *buffer, size_t *lenp,
 					  loff_t *ppos)
 {
-	char names[sizeof(sys_info_avail) + 1];
+	char names[sizeof(sys_info_avail)];
 	struct ctl_table table;
 	unsigned long *si_bits_global;
 
@@ -81,6 +81,9 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
 		char *delim = "";
 		int i, len = 0;
 
+		/* *si_bits_glabl could be 0 */
+		names[0] = '\0';
+
 		for (i = 0; i < ARRAY_SIZE(si_names); i++) {
 			if (*si_bits_global & si_names[i].bit) {
 				len += scnprintf(names + len, sizeof(names) - len,
-- 
2.43.5
Re: [PATCH 1/3] lib/sys_info: handle sys_info_mask==0 case
Posted by Petr Mladek 1 month, 2 weeks ago
On Fri 2025-08-15 15:14:26, Feng Tang wrote:
> It is a normal case that bitmask parameter is 0, so pre-initialize the
> names[] to null string to cover this case.
> 
> Also remove the superfluous "+1" in names[sizeof(sys_info_avail) + 1],
> which is needed for 'strlen()', but not for 'sizeof()'.
> 
> --- a/lib/sys_info.c
> +++ b/lib/sys_info.c
> @@ -55,7 +55,7 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
>  					  void *buffer, size_t *lenp,
>  					  loff_t *ppos)
>  {
> -	char names[sizeof(sys_info_avail) + 1];
> +	char names[sizeof(sys_info_avail)];
>  	struct ctl_table table;
>  	unsigned long *si_bits_global;
>  
> @@ -81,6 +81,9 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
>  		char *delim = "";
>  		int i, len = 0;
>  
> +		/* *si_bits_glabl could be 0 */

s/si_bits_glabl/si_bits_global/

But I would personally remove the comment completely. IMHO, the
purpose is quite obvious. But I do not resist on it.

> +		names[0] = '\0';
> +
>  		for (i = 0; i < ARRAY_SIZE(si_names); i++) {
>  			if (*si_bits_global & si_names[i].bit) {
>  				len += scnprintf(names + len, sizeof(names) - len,

Otherwise, it looks good to me:

Reviewed-by: Petr Mladek <pmladek@suse.com>

Best Regards,
Petr
Re: [PATCH 1/3] lib/sys_info: handle sys_info_mask==0 case
Posted by Feng Tang 1 month, 1 week ago
On Tue, Aug 19, 2025 at 10:34:14AM +0200, Petr Mladek wrote:
> On Fri 2025-08-15 15:14:26, Feng Tang wrote:
> > It is a normal case that bitmask parameter is 0, so pre-initialize the
> > names[] to null string to cover this case.
> > 
> > Also remove the superfluous "+1" in names[sizeof(sys_info_avail) + 1],
> > which is needed for 'strlen()', but not for 'sizeof()'.
> > 
> > --- a/lib/sys_info.c
> > +++ b/lib/sys_info.c
> > @@ -55,7 +55,7 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
> >  					  void *buffer, size_t *lenp,
> >  					  loff_t *ppos)
> >  {
> > -	char names[sizeof(sys_info_avail) + 1];
> > +	char names[sizeof(sys_info_avail)];
> >  	struct ctl_table table;
> >  	unsigned long *si_bits_global;
> >  
> > @@ -81,6 +81,9 @@ int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
> >  		char *delim = "";
> >  		int i, len = 0;
> >  
> > +		/* *si_bits_glabl could be 0 */
> 
> s/si_bits_glabl/si_bits_global/
> 
> But I would personally remove the comment completely. IMHO, the
> purpose is quite obvious. But I do not resist on it.

Will remove.

> 
> > +		names[0] = '\0';
> > +
> >  		for (i = 0; i < ARRAY_SIZE(si_names); i++) {
> >  			if (*si_bits_global & si_names[i].bit) {
> >  				len += scnprintf(names + len, sizeof(names) - len,
> 
> Otherwise, it looks good to me:
> 
> Reviewed-by: Petr Mladek <pmladek@suse.com>

Thank you! will resend a v2 patchset. 

- Feng

> 
> Best Regards,
> Petr