]> git.itanic.dy.fi Git - linux-stable/commitdiff
netfilter: nf_conntrack_sip: fix ct_sip_walk_headers
authorIgor Ryzhov <iryzhov@nfware.com>
Wed, 5 Jun 2019 09:32:40 +0000 (12:32 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 28 Sep 2022 08:56:50 +0000 (10:56 +0200)
[ Upstream commit 39aebedeaaa95757f5c1f2ddb5f43fdddbf478ca ]

ct_sip_next_header and ct_sip_get_header return an absolute
value of matchoff, not a shift from current dataoff.
So dataoff should be assigned matchoff, not incremented by it.

This issue can be seen in the scenario when there are multiple
Contact headers and the first one is using a hostname and other headers
use IP addresses. In this case, ct_sip_walk_headers will work as follows:

The first ct_sip_get_header call to will find the first Contact header
but will return -1 as the header uses a hostname. But matchoff will
be changed to the offset of this header. After that, dataoff should be
set to matchoff, so that the next ct_sip_get_header call find the next
Contact header. But instead of assigning dataoff to matchoff, it is
incremented by it, which is not correct, as matchoff is an absolute
value of the offset. So on the next call to the ct_sip_get_header,
dataoff will be incorrect, and the next Contact header may not be
found at all.

Fixes: 05e3ced297fe ("[NETFILTER]: nf_conntrack_sip: introduce SIP-URI parsing helper")
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/netfilter/nf_conntrack_sip.c

index 4dbb5bad4363ba9f67fea15160bb7b0b88ae9c38..3b4c9407d6f260b06551b9d1f53b0e15f9d04fc0 100644 (file)
@@ -471,7 +471,7 @@ static int ct_sip_walk_headers(const struct nf_conn *ct, const char *dptr,
                                return ret;
                        if (ret == 0)
                                break;
-                       dataoff += *matchoff;
+                       dataoff = *matchoff;
                }
                *in_header = 0;
        }
@@ -483,7 +483,7 @@ static int ct_sip_walk_headers(const struct nf_conn *ct, const char *dptr,
                        break;
                if (ret == 0)
                        return ret;
-               dataoff += *matchoff;
+               dataoff = *matchoff;
        }
 
        if (in_header)