Commit a04c0e2c authored by David S. Miller's avatar David S. Miller

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf

Pablo Neira Ayuso says:

====================
The following patchset contains two patches:

* fix the IRC NAT helper which was broken when adding (incomplete) IPv6
  support, from Daniel Borkmann.

* Refine the previous bugtrap that Jesper added to catch problems for the
  usage of the sequence adjustment extension in IPVs in Dec 16th, it may
  spam messages in case of finding a real bug.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 732256b9 f2661adc
...@@ -37,7 +37,7 @@ int nf_ct_seqadj_set(struct nf_conn *ct, enum ip_conntrack_info ctinfo, ...@@ -37,7 +37,7 @@ int nf_ct_seqadj_set(struct nf_conn *ct, enum ip_conntrack_info ctinfo,
return 0; return 0;
if (unlikely(!seqadj)) { if (unlikely(!seqadj)) {
WARN(1, "Wrong seqadj usage, missing nfct_seqadj_ext_add()\n"); WARN_ONCE(1, "Missing nfct_seqadj_ext_add() setup call\n");
return 0; return 0;
} }
......
...@@ -34,10 +34,14 @@ static unsigned int help(struct sk_buff *skb, ...@@ -34,10 +34,14 @@ static unsigned int help(struct sk_buff *skb,
struct nf_conntrack_expect *exp) struct nf_conntrack_expect *exp)
{ {
char buffer[sizeof("4294967296 65635")]; char buffer[sizeof("4294967296 65635")];
struct nf_conn *ct = exp->master;
union nf_inet_addr newaddr;
u_int16_t port; u_int16_t port;
unsigned int ret; unsigned int ret;
/* Reply comes from server. */ /* Reply comes from server. */
newaddr = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3;
exp->saved_proto.tcp.port = exp->tuple.dst.u.tcp.port; exp->saved_proto.tcp.port = exp->tuple.dst.u.tcp.port;
exp->dir = IP_CT_DIR_REPLY; exp->dir = IP_CT_DIR_REPLY;
exp->expectfn = nf_nat_follow_master; exp->expectfn = nf_nat_follow_master;
...@@ -57,17 +61,35 @@ static unsigned int help(struct sk_buff *skb, ...@@ -57,17 +61,35 @@ static unsigned int help(struct sk_buff *skb,
} }
if (port == 0) { if (port == 0) {
nf_ct_helper_log(skb, exp->master, "all ports in use"); nf_ct_helper_log(skb, ct, "all ports in use");
return NF_DROP; return NF_DROP;
} }
ret = nf_nat_mangle_tcp_packet(skb, exp->master, ctinfo, /* strlen("\1DCC CHAT chat AAAAAAAA P\1\n")=27
protoff, matchoff, matchlen, buffer, * strlen("\1DCC SCHAT chat AAAAAAAA P\1\n")=28
strlen(buffer)); * strlen("\1DCC SEND F AAAAAAAA P S\1\n")=26
* strlen("\1DCC MOVE F AAAAAAAA P S\1\n")=26
* strlen("\1DCC TSEND F AAAAAAAA P S\1\n")=27
*
* AAAAAAAAA: bound addr (1.0.0.0==16777216, min 8 digits,
* 255.255.255.255==4294967296, 10 digits)
* P: bound port (min 1 d, max 5d (65635))
* F: filename (min 1 d )
* S: size (min 1 d )
* 0x01, \n: terminators
*/
/* AAA = "us", ie. where server normally talks to. */
snprintf(buffer, sizeof(buffer), "%u %u", ntohl(newaddr.ip), port);
pr_debug("nf_nat_irc: inserting '%s' == %pI4, port %u\n",
buffer, &newaddr.ip, port);
ret = nf_nat_mangle_tcp_packet(skb, ct, ctinfo, protoff, matchoff,
matchlen, buffer, strlen(buffer));
if (ret != NF_ACCEPT) { if (ret != NF_ACCEPT) {
nf_ct_helper_log(skb, exp->master, "cannot mangle packet"); nf_ct_helper_log(skb, ct, "cannot mangle packet");
nf_ct_unexpect_related(exp); nf_ct_unexpect_related(exp);
} }
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment