From: Florian Westphal <fw@strlen.de>
To: netfilter-devel@vger.kernel.org
Cc: Florian Westphal <fw@strlen.de>
Subject: [PATCH 2/7] netfilter: ebtables: split copy_everything_to_user into two functions
Date: Mon, 15 Feb 2010 22:05:34 +0100 [thread overview]
Message-ID: <1266267939-7736-3-git-send-email-fw@strlen.de> (raw)
In-Reply-To: <1266267939-7736-1-git-send-email-fw@strlen.de>
once CONFIG_COMPAT support is added to ebtables, the new
copy_counters_to_user function can be called instead of duplicating
code.
Also remove last use of MEMPRINT, as requested by Bart De Schuymer.
Signed-off-by: Florian Westphal <fw@strlen.de>
---
net/bridge/netfilter/ebtables.c | 69 +++++++++++++++++++++------------------
1 files changed, 37 insertions(+), 32 deletions(-)
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
index 60b70a6..8f3529a 100644
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -33,11 +33,6 @@
#define BUGPRINT(format, args...) printk("kernel msg: ebtables bug: please "\
"report to author: "format, ## args)
/* #define BUGPRINT(format, args...) */
-#define MEMPRINT(format, args...) printk("kernel msg: ebtables "\
- ": out of memory: "format, ## args)
-/* #define MEMPRINT(format, args...) */
-
-
/*
* Each cpu has its own set of counters, so there is no need for write_lock in
@@ -1262,10 +1257,8 @@ static int update_counters(struct net *net, const void __user *user,
if (hlp.num_counters == 0)
return -EINVAL;
- if (!(tmp = vmalloc(hlp.num_counters * sizeof(*tmp)))) {
- MEMPRINT("Update_counters && nomemory\n");
+ if (!(tmp = vmalloc(hlp.num_counters * sizeof(*tmp))))
return -ENOMEM;
- }
t = find_table_lock(net, hlp.name, &ret, &ebt_mutex);
if (!t)
@@ -1344,14 +1337,45 @@ ebt_make_names(struct ebt_entry *e, const char *base, char __user *ubase)
return 0;
}
+static int copy_counters_to_user(struct ebt_table *t, const struct ebt_counter *oldcounters,
+ void __user *user, unsigned int num_counters,
+ unsigned int nentries)
+{
+ struct ebt_counter *counterstmp;
+ int ret = 0;
+
+ /* userspace might not need the counters */
+ if (num_counters == 0)
+ return 0;
+
+ if (num_counters != nentries) {
+ BUGPRINT("Num_counters wrong\n");
+ return -EINVAL;
+ }
+
+ counterstmp = vmalloc(nentries * sizeof(*counterstmp));
+ if (!counterstmp)
+ return -ENOMEM;
+
+ write_lock_bh(&t->lock);
+ get_counters(oldcounters, counterstmp, nentries);
+ write_unlock_bh(&t->lock);
+
+ if (copy_to_user(user, counterstmp,
+ nentries * sizeof(struct ebt_counter)))
+ ret = -EFAULT;
+ vfree(counterstmp);
+ return ret;
+}
+
/* called with ebt_mutex locked */
static int copy_everything_to_user(struct ebt_table *t, void __user *user,
const int *len, int cmd)
{
struct ebt_replace tmp;
- struct ebt_counter *counterstmp;
const struct ebt_counter *oldcounters;
unsigned int entries_size, nentries;
+ int ret;
char *entries;
if (cmd == EBT_SO_GET_ENTRIES) {
@@ -1387,29 +1411,10 @@ static int copy_everything_to_user(struct ebt_table *t, void __user *user,
return -EINVAL;
}
- /* userspace might not need the counters */
- if (tmp.num_counters) {
- if (tmp.num_counters != nentries) {
- BUGPRINT("Num_counters wrong\n");
- return -EINVAL;
- }
- counterstmp = vmalloc(nentries * sizeof(*counterstmp));
- if (!counterstmp) {
- MEMPRINT("Couldn't copy counters, out of memory\n");
- return -ENOMEM;
- }
- write_lock_bh(&t->lock);
- get_counters(oldcounters, counterstmp, nentries);
- write_unlock_bh(&t->lock);
-
- if (copy_to_user(tmp.counters, counterstmp,
- nentries * sizeof(struct ebt_counter))) {
- BUGPRINT("Couldn't copy counters to userspace\n");
- vfree(counterstmp);
- return -EFAULT;
- }
- vfree(counterstmp);
- }
+ ret = copy_counters_to_user(t, oldcounters, tmp.counters,
+ tmp.num_counters, nentries);
+ if (ret)
+ return ret;
if (copy_to_user(tmp.entries, entries, entries_size)) {
BUGPRINT("Couldn't copy entries to userspace\n");
--
1.6.4.4
next prev parent reply other threads:[~2010-02-15 21:06 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-15 21:05 [Patch v3] netfilter: ebtables: CONFIG_COMPAT support Florian Westphal
2010-02-15 21:05 ` [PATCH 1/7] netfilter: ebtables: split do_replace into two functions Florian Westphal
2010-02-15 21:05 ` Florian Westphal [this message]
2010-02-15 21:05 ` [PATCH 3/7] netfilter: ebtables: split update_counters " Florian Westphal
2010-02-15 21:05 ` [PATCH 4/7] netfilter: ebtables: add CONFIG_COMPAT support Florian Westphal
2010-02-15 21:05 ` [PATCH 5/7] netfilter: ebtables: try native set/getsockopt handlers, too Florian Westphal
2010-02-15 21:05 ` [PATCH 6/7] netfilter: ebt_limit: add CONFIG_COMPAT support Florian Westphal
2010-02-15 21:05 ` [PATCH 7/7] netfilter: ebtables: mark: " Florian Westphal
2010-02-16 14:39 ` [Patch v3] netfilter: ebtables: " Patrick McHardy
2010-02-16 14:41 ` Florian Westphal
-- strict thread matches above, loose matches on Subject: below --
2010-02-16 16:39 [PATCH v4] " Florian Westphal
2010-02-16 16:39 ` [PATCH 2/7] netfilter: ebtables: split copy_everything_to_user into two functions Florian Westphal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1266267939-7736-3-git-send-email-fw@strlen.de \
--to=fw@strlen.de \
--cc=netfilter-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.