BACKPORT: FROMGIT: netfilter: conntrack: fix wrong ct->timeout value

(struct nf_conn)->timeout is an interval before the conntrack
confirmed.  After confirmed, it becomes a timestamp.

It is observed that timeout of an unconfirmed conntrack:
- Set by calling ctnetlink_change_timeout(). As a result,
  `nfct_time_stamp` was wrongly added to `ct->timeout` twice.
- Get by calling ctnetlink_dump_timeout(). As a result,
  `nfct_time_stamp` was wrongly subtracted.

Call Trace:
 <TASK>
 dump_stack_lvl
 ctnetlink_dump_timeout
 __ctnetlink_glue_build
 ctnetlink_glue_build
 __nfqnl_enqueue_packet
 nf_queue
 nf_hook_slow
 ip_mc_output
 ? __pfx_ip_finish_output
 ip_send_skb
 ? __pfx_dst_output
 udp_send_skb
 udp_sendmsg
 ? __pfx_ip_generic_getfrag
 sock_sendmsg

Separate the 2 cases in:
- Setting `ct->timeout` in __nf_ct_set_timeout().
- Getting `ct->timeout` in ctnetlink_dump_timeout().

Pablo appends:

Update ctnetlink to set up the timeout _after_ the IPS_CONFIRMED flag is
set on, otherwise conntrack creation via ctnetlink breaks.

Note that the problem described in this patch occurs since the
introduction of the nfnetlink_queue conntrack support, select a
sufficiently old Fixes: tag for -stable kernel to pick up this fix.

Fixes: a4b4766c3ceb ("netfilter: nfnetlink_queue: rename related to nfqueue attaching conntrack info")
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
(cherry picked from commit 73db1b8f2bb6725b7391e85aab41fdf592b3c0c1
 https://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git main)

Conflicts:
   include/net/netfilter/nf_conntrack_core.h
[ Move the part to ctnetlink_change_timeout() in
  net/netfilter/nf_conntrack_netlink.c. ]
   net/netfilter/nf_conntrack_netlink.c
[ Contextual conflict:
    - v4.14 didn't pick upstream commit 8b1836c4b643 ("netfilter:
      conntrack: clamp timeouts to INT_MAX").
    - v4.14 didn't pick upstream commit 802a7dc5cf1b ("netfilter:
      conntrack: annotate data-races around ct->timeout").
    - v4.14 has no __nf_ct_set_timeout().
]

BUG=b:215783130
TEST=conntrack -E | grep ssdp

Change-Id: I84a18962b53619a4809a5ceb0d265443b753041e
Signed-off-by: Tzung-Bi Shih <tzungbi@chromium.org>
Signed-off-by: Shiva Sai Kothapalli <kshivasai@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/4461335
Reviewed-by: Srinivasa Duvvuri <sduvvuri@google.com>
Reviewed-by: Raju Konduru <rkonduru@google.com>
Tested-by: SUBASISH BHATTA <subasish@google.com>
1 file changed