Skip to content

Commit

Permalink
netfilter: xt_recent: fix stack overread in compat code
Browse files Browse the repository at this point in the history
Related-to: commit 325fb5b

The compat path suffers from a similar problem. It only uses a __be32
when all of the recent code uses, and expects, an nf_inet_addr
everywhere. As a result, addresses stored by xt_recents were
filled with whatever other stuff was on the stack following the be32.

Signed-off-by: Jan Engelhardt <jengelh@medozas.de>

With a minor compile fix from Roman.

Reported-and-tested-by: Roman Hoog Antink <rha@open.ch>
Signed-off-by: Patrick McHardy <kaber@trash.net>
  • Loading branch information
Jan Engelhardt authored and Patrick McHardy committed Apr 24, 2009
1 parent 71951b6 commit 37e55cf
Showing 1 changed file with 4 additions and 5 deletions.
9 changes: 4 additions & 5 deletions net/netfilter/xt_recent.c
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ static ssize_t recent_old_proc_write(struct file *file,
struct recent_table *t = pde->data;
struct recent_entry *e;
char buf[sizeof("+255.255.255.255")], *c = buf;
__be32 addr;
union nf_inet_addr addr = {};
int add;

if (size > sizeof(buf))
Expand Down Expand Up @@ -506,14 +506,13 @@ static ssize_t recent_old_proc_write(struct file *file,
add = 1;
break;
}
addr = in_aton(c);
addr.ip = in_aton(c);

spin_lock_bh(&recent_lock);
e = recent_entry_lookup(t, (const void *)&addr, NFPROTO_IPV4, 0);
e = recent_entry_lookup(t, &addr, NFPROTO_IPV4, 0);
if (e == NULL) {
if (add)
recent_entry_init(t, (const void *)&addr,
NFPROTO_IPV4, 0);
recent_entry_init(t, &addr, NFPROTO_IPV4, 0);
} else {
if (add)
recent_entry_update(t, e);
Expand Down

0 comments on commit 37e55cf

Please sign in to comment.