Re: [bug report] netfilter: load nf_log_syslog on enabling nf_conntrack_log_invalid

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Aug 04, 2025 at 05:57:09PM +0800, Lance Yang wrote:
> 
> 
> On 2025/8/4 17:24, Dan Carpenter wrote:
> > On Mon, Aug 04, 2025 at 05:05:32PM +0800, Lance Yang wrote:
> > > 
> > > 
> > > On 2025/8/4 16:21, Dan Carpenter wrote:
> > > > Hello Lance Yang,
> > > > 
> > > > Commit e89a68046687 ("netfilter: load nf_log_syslog on enabling
> > > > nf_conntrack_log_invalid") from May 26, 2025 (linux-next), leads to
> > > > the following Smatch static checker warning:
> > > > 
> > > > 	net/netfilter/nf_conntrack_standalone.c:575 nf_conntrack_log_invalid_sysctl()
> > > > 	warn: missing error code? 'ret'
> > > 
> > > Thanks for pointing this out!
> > > 
> > > > 
> > > > net/netfilter/nf_conntrack_standalone.c
> > > >       559 static int
> > > >       560 nf_conntrack_log_invalid_sysctl(const struct ctl_table *table, int write,
> > > >       561                                 void *buffer, size_t *lenp, loff_t *ppos)
> > > >       562 {
> > > >       563         int ret, i;
> > > >       564
> > > >       565         ret = proc_dou8vec_minmax(table, write, buffer, lenp, ppos);
> > > >       566         if (ret < 0 || !write)
> > > >       567                 return ret;
> > > >       568
> > > >       569         if (*(u8 *)table->data == 0)
> > > >       570                 return ret;
> > > > 
> > > > return 0?
> > > 
> > > That's a good question. proc_dou8vec_minmax() returns 0 on a successful
> > > write. So when a user writes '0' to disable the feature, ret is already 0.
> > > Returning it is the correct behavior to signal success.
> > > 
> > > > 
> > > >       571
> > > >       572         /* Load nf_log_syslog only if no logger is currently registered */
> > > >       573         for (i = 0; i < NFPROTO_NUMPROTO; i++) {
> > > >       574                 if (nf_log_is_registered(i))
> > > > --> 575                         return ret;
> > > > 
> > > > This feels like it should be return -EBUSY?  Or potentially return 0.
> > > 
> > > We simply return ret (which is 0) to signal success, as no further action
> > > (like loading the nf_log_syslog module) is needed.
> > > 
> > > > 
> > > >       576         }
> > > >       577         request_module("%s", "nf_log_syslog");
> > > >       578
> > > >       579         return ret;
> > > > 
> > > > return 0.
> > > 
> > > It's 0 as well.
> > > 
> > > Emm... do you know a way to make the Smatch static checker happy?
> > > 
> > 
> > Returning 0 would make the code so much more clear.  Readers probably
> 
> Yep, I see your point ;)
> 
> > assume that proc_dou8vec_minmax() returns positive values on success
> 
> IIUC, proc_dou8vec_minmax only returns 0 for success or a negative
> error code, so there's no positive value case here ...
> 
> > and that's why we are returning ret.  I know that I had to check.
> > 
> 
> It should make the code clearer and also make the Smatch checker happy:
> 
> 	ret = proc_dou8vec_minmax(table, write, buffer, lenp, ppos);
> 	- if (ret < 0 || !write)
> 	+ if (ret != 0 || !write)
> 		return ret;
> 
> By checking for "ret != 0", it becomes explicit that ret can only be
> zero after that. wdyt?

The ret check there should either be the way you wrote it or:

	if (ret || !write)

either one is fine.  Adding a "!= 0" is not really idiomatic because
ret is not a number, it's an error code.

If you have the cross function database, then Smatch knows that ret
can't be positive...  I build with the DB on my desktop but the cross
function DB doesn't scale well enough to be usable by the zero-day bot
so I see this warning on my desktop but the zero-day bot will not
print a warning.

regards,
dan carpenter





[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux