From: Julia Lawall <hidden> Date: 2016-10-15 17:50:00
I haven't checked the entire context, but it could be useful to look at
line 1251.
julia
---------- Forwarded message ----------
Date: Sun, 16 Oct 2016 01:34:18 +0800
From: kbuild test robot <redacted>
To: kbuild@01.org
Cc: Julia Lawall <redacted>
Subject: [net:master 10/15] net/ipv6/addrconf.c:1251:14-30: WARNING: Unsigned
expression compared with zero: tmp_prefered_lft < 0
CC: kbuild-all@01.org
CC: netdev@vger.kernel.org
TO: Jiri Bohac <redacted>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git master
head: 9e55d0f95460a067def5400fa5eee5dabb0fc5a5
commit: 76506a986dc31394fd1f2741db037d29c7e57843 [10/15] IPv6: fix DESYNC_FACTOR
:::::: branch date: 21 hours ago
:::::: commit date: 27 hours ago
quoted
net/ipv6/addrconf.c:1251:14-30: WARNING: Unsigned expression compared with zero: tmp_prefered_lft < 0
Commit 76506a986dc31394fd1f2741db037d29c7e57843 (IPv6: fix
DESYNC_FACTOR) introduced a buggy check for underflow of
tmp_prefered_lft. tmp_prefered_lft is unsigned, so the condition
is always false.
Signed-off-by: Jiri Bohac <redacted>
Reported-by: Julia Lawall <redacted>
Fixes: 76506a986dc3 ("IPv6: fix DESYNC_FACTOR")
@@ -1248,7 +1248,7 @@ static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *itmp_prefered_lft=idev->cnf.temp_prefered_lft+age-idev->desync_factor;/* guard against underflow in case of concurrent updates to cnf */-if(unlikely(tmp_prefered_lft<0))+if(unlikely((long)tmp_prefered_lft<0))tmp_prefered_lft=0;tmp_prefered_lft=min_t(__u32,ifp->prefered_lft,tmp_prefered_lft);tmp_plen=ifp->prefix_len;
Commit 76506a986dc31394fd1f2741db037d29c7e57843 (IPv6: fix
DESYNC_FACTOR) introduced a buggy check for underflow of
tmp_prefered_lft. tmp_prefered_lft is unsigned, so the condition
is always false.
Signed-off-by: Jiri Bohac <redacted>
Reported-by: Julia Lawall <redacted>
Fixes: 76506a986dc3 ("IPv6: fix DESYNC_FACTOR")
Does the check make any sense at all? I'd say just remove it.
The check for an underflow of tmp_prefered_lft is always false
because tmp_prefered_lft is unsigned.
The intention of the check was to guard against racing with an
update of the temp_prefered_lft sysctl, potentially resulting in
an underflow and a very large preferred lifetime. However, the
result of the check in such a situation would be not creating the
temporary address at all, which might be an even worse outcome
than the bogus lifetime.
Drop the faulty check.
Signed-off-by: Jiri Bohac <redacted>
Reported-by: Julia Lawall <redacted>
Fixes: 76506a986dc3 ("IPv6: fix DESYNC_FACTOR")
@@ -1247,9 +1247,6 @@ static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *iidev->cnf.temp_valid_lft+age);tmp_prefered_lft=idev->cnf.temp_prefered_lft+age-idev->desync_factor;-/* guard against underflow in case of concurrent updates to cnf */-if(unlikely(tmp_prefered_lft<0))-tmp_prefered_lft=0;tmp_prefered_lft=min_t(__u32,ifp->prefered_lft,tmp_prefered_lft);tmp_plen=ifp->prefix_len;tmp_tstamp=ifp->tstamp;
Hi,
On Tue, Oct 18, 2016 at 02:25:25PM -0400, David Miller wrote:
Does the check make any sense at all? I'd say just remove it.
The purpose was to guard against the user updating the
temp_prefered_lft sysctl after this:
max_desync_factor = min_t(__u32,
idev->cnf.max_desync_factor,
idev->cnf.temp_prefered_lft - regen_advance);
but before this:
tmp_prefered_lft = idev->cnf.temp_prefered_lft + age -
idev->desync_factor;
With enough bad luck, tmp_prefered_lft could underflow and the resulting
preferred lifetime could be almost infinity.
On the other hand, with this check, this situation will result
with the temporary address not being created at all, which might
be even worse. So if you prefer it, just drop the check.
Patch in a follow-up e-mail.
Thanks,
--
Jiri Bohac [off-list ref]
SUSE Labs, SUSE CZ
The purpose was to guard against the user updating the
temp_prefered_lft sysctl after this:
max_desync_factor = min_t(__u32,
idev->cnf.max_desync_factor,
idev->cnf.temp_prefered_lft - regen_advance);
but before this:
tmp_prefered_lft = idev->cnf.temp_prefered_lft + age -
idev->desync_factor;
That's a different problem.
Read the sysctl values of interest into local variables using
READ_ONCE() before the calculations, that way the situation your
describe is impossible.
The check for an underflow of tmp_prefered_lft is always false
because tmp_prefered_lft is unsigned. The intention of the check
was to guard against racing with an update of the
temp_prefered_lft sysctl, potentially resulting in an underflow.
As suggested by David Miller, the best way to prevent the race is
by reading the sysctl variable using READ_ONCE.
Signed-off-by: Jiri Bohac <redacted>
Reported-by: Julia Lawall <redacted>
Fixes: 76506a986dc3 ("IPv6: fix DESYNC_FACTOR")
@@ -1228,9 +1229,10 @@ static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *i/* recalculate max_desync_factor each time and update*idev->desync_factorifit'slarger*/+cnf_temp_preferred_lft=READ_ONCE(idev->cnf.temp_prefered_lft);max_desync_factor=min_t(__u32,idev->cnf.max_desync_factor,-idev->cnf.temp_prefered_lft-regen_advance);+cnf_temp_preferred_lft-regen_advance);if(unlikely(idev->desync_factor>max_desync_factor)){if(max_desync_factor>0){
@@ -1245,11 +1247,8 @@ static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *itmp_valid_lft=min_t(__u32,ifp->valid_lft,idev->cnf.temp_valid_lft+age);-tmp_prefered_lft=idev->cnf.temp_prefered_lft+age-+tmp_prefered_lft=cnf_temp_preferred_lft+age-idev->desync_factor;-/* guard against underflow in case of concurrent updates to cnf */-if(unlikely(tmp_prefered_lft<0))-tmp_prefered_lft=0;tmp_prefered_lft=min_t(__u32,ifp->prefered_lft,tmp_prefered_lft);tmp_plen=ifp->prefix_len;tmp_tstamp=ifp->tstamp;
The check for an underflow of tmp_prefered_lft is always false
because tmp_prefered_lft is unsigned. The intention of the check
was to guard against racing with an update of the
temp_prefered_lft sysctl, potentially resulting in an underflow.
As suggested by David Miller, the best way to prevent the race is
by reading the sysctl variable using READ_ONCE.
Signed-off-by: Jiri Bohac <redacted>
Reported-by: Julia Lawall <redacted>
Fixes: 76506a986dc3 ("IPv6: fix DESYNC_FACTOR")