All of lore.kernel.org
 help / color / mirror / Atom feed
From: Adam Nielsen <a.nielsen@shikadi.net>
To: Patrick McHardy <kaber@trash.net>
Cc: Jan Engelhardt <jengelh@medozas.de>,
	Netfilter Developer Mailing List
	<netfilter-devel@vger.kernel.org>
Subject: [PATCH] Add refcounts to LED target
Date: Sun, 29 Nov 2009 11:43:17 +1000	[thread overview]
Message-ID: <4B11D1B5.2060306@shikadi.net> (raw)
In-Reply-To: <4AF43916.5010408@trash.net>

[-- Attachment #1: Type: text/plain, Size: 930 bytes --]

>>> Just wondering whether there's still hope for this issue to get fixed.
>>>
>>> I haven't added the LED extension to iptables yet, so if there's no
>>> interest in fixing this, we can remove the LED target again.

Sorry again it has taken me so long to get around to this, but hopefully the 
attached patch is acceptable.  It fixes the issue for me, however I would just 
like to confirm one thing will work as expected.

I am relying on the xt_tgchk_param passed to the .checkentry function being 
zero'd out the first time.  One of the members is a pointer which becomes 
valid when the LED trigger is created, and I'm assuming if that pointer is 
NULL then the LED trigger hasn't yet been created.  Providing that iptables 
sets this field to NULL before the first call, and leaves it unchanged when 
replacing rules/tables then it will work fine.

The patch is against the latest git version of nf-next-2.6.

Thanks,
Adam.

[-- Attachment #2: led_target_refcount.patch --]
[-- Type: text/plain, Size: 3585 bytes --]

Add reference counting to the netfilter LED target, to fix errors when
multiple rules point to the same target ("LED trigger already exists").

Signed-off-by: Adam Nielsen <a.nielsen@shikadi.net>

---

diff --git a/net/netfilter/xt_LED.c b/net/netfilter/xt_LED.c
index 8ff7843..1877d6b 100644
--- a/net/netfilter/xt_LED.c
+++ b/net/netfilter/xt_LED.c
@@ -37,6 +37,7 @@ MODULE_DESCRIPTION("Xtables: trigger LED devices on packet match");
  * points to.
  */
 struct xt_led_info_internal {
+	atomic_t refcount;
 	struct led_trigger netfilter_led_trigger;
 	struct timer_list timer;
 };
@@ -83,43 +84,52 @@ static void led_timeout_callback(unsigned long data)
 static bool led_tg_check(const struct xt_tgchk_param *par)
 {
 	struct xt_led_info *ledinfo = par->targinfo;
-	struct xt_led_info_internal *ledinternal;
+	struct xt_led_info_internal *ledinternal = ledinfo->internal_data;
 	int err;
 
-	if (ledinfo->id[0] == '\0') {
-		printk(KERN_ERR KBUILD_MODNAME ": No 'id' parameter given.\n");
-		return false;
-	}
-
-	ledinternal = kzalloc(sizeof(struct xt_led_info_internal), GFP_KERNEL);
-	if (!ledinternal) {
-		printk(KERN_CRIT KBUILD_MODNAME ": out of memory\n");
-		return false;
-	}
-
-	ledinternal->netfilter_led_trigger.name = ledinfo->id;
-
-	err = led_trigger_register(&ledinternal->netfilter_led_trigger);
-	if (err) {
-		printk(KERN_CRIT KBUILD_MODNAME
-			": led_trigger_register() failed\n");
-		if (err == -EEXIST)
-			printk(KERN_ERR KBUILD_MODNAME
-				": Trigger name is already in use.\n");
-		goto exit_alloc;
+	if (ledinternal) {
+		/* Rule already exists */
+		atomic_inc(&ledinternal->refcount);
+	} else {
+		/* New rule, check everything is OK */
+		if (ledinfo->id[0] == '\0') {
+			printk(KERN_ERR KBUILD_MODNAME ": No 'id' parameter given.\n");
+			return false;
+		}
+
+		ledinternal = kzalloc(sizeof(struct xt_led_info_internal), GFP_KERNEL);
+		if (!ledinternal) {
+			printk(KERN_CRIT KBUILD_MODNAME ": out of memory\n");
+			return false;
+		}
+
+		ledinternal->netfilter_led_trigger.name = ledinfo->id;
+
+		err = led_trigger_register(&ledinternal->netfilter_led_trigger);
+		if (err) {
+			printk(KERN_CRIT KBUILD_MODNAME
+				": led_trigger_register() failed\n");
+			if (err == -EEXIST)
+				printk(KERN_ERR KBUILD_MODNAME
+					": Trigger name is already in use.\n");
+			goto exit_alloc;
+		}
+
+		/* See if we need to set up a timer */
+		if (ledinfo->delay > 0)
+			setup_timer(&ledinternal->timer, led_timeout_callback,
+						(unsigned long)ledinfo);
+
+		atomic_set(&ledinternal->refcount, 1);
+
+		ledinfo->internal_data = ledinternal;
 	}
 
-	/* See if we need to set up a timer */
-	if (ledinfo->delay > 0)
-		setup_timer(&ledinternal->timer, led_timeout_callback,
-			    (unsigned long)ledinfo);
-
-	ledinfo->internal_data = ledinternal;
-
 	return true;
 
 exit_alloc:
 	kfree(ledinternal);
+	ledinfo->internal_data = NULL;
 
 	return false;
 }
@@ -129,11 +139,14 @@ static void led_tg_destroy(const struct xt_tgdtor_param *par)
 	const struct xt_led_info *ledinfo = par->targinfo;
 	struct xt_led_info_internal *ledinternal = ledinfo->internal_data;
 
-	if (ledinfo->delay > 0)
-		del_timer_sync(&ledinternal->timer);
+	if (atomic_dec_and_test(&ledinternal->refcount)) {
+		/* No more rules use this LED trigger, so remove it */
+		if (ledinfo->delay > 0)
+			del_timer_sync(&ledinternal->timer);
 
-	led_trigger_unregister(&ledinternal->netfilter_led_trigger);
-	kfree(ledinternal);
+		led_trigger_unregister(&ledinternal->netfilter_led_trigger);
+		kfree(ledinternal);
+	}
 }
 
 static struct xt_target led_tg_reg __read_mostly = {

  reply	other threads:[~2009-11-29  1:43 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-24  1:46 Avoiding multiple calls to xt_target.checkentry Adam Nielsen
2009-05-24  7:34 ` Jan Engelhardt
2009-05-27 23:07   ` Adam Nielsen
2009-05-28 21:06     ` Jan Engelhardt
2009-06-03  9:25     ` Patrick McHardy
2009-06-03 11:03       ` Adam Nielsen
2009-11-05 15:00         ` Patrick McHardy
2009-11-05 18:40           ` Jan Engelhardt
2009-11-05 18:43             ` Patrick McHardy
2009-11-05 22:04           ` Adam Nielsen
2009-11-06 14:56             ` Patrick McHardy
2009-11-29  1:43               ` Adam Nielsen [this message]
2009-11-29 10:12                 ` [PATCH] Add refcounts to LED target Jan Engelhardt
2009-11-29 11:33                   ` Adam Nielsen
2009-11-29 15:49                     ` Jan Engelhardt
2009-12-01 10:05                       ` Patrick McHardy
2009-12-06 10:09                         ` Adam Nielsen
2009-12-06 13:24                           ` Patrick McHardy
2010-03-25 14:01                             ` Patrick McHardy
2010-03-25 14:05                               ` Jan Engelhardt
2010-03-25 14:08                                 ` Patrick McHardy
2010-03-27  4:05                                   ` Adam Nielsen
2010-03-27 11:15                                     ` Jan Engelhardt
2010-03-27 11:39                                       ` Adam Nielsen
2010-03-27 11:55                                         ` Jan Engelhardt
2010-03-28  1:25                                           ` [PATCH v2] " Adam Nielsen
2010-04-04 11:30                                             ` Jan Engelhardt
2010-04-07 16:15                                               ` Patrick McHardy
2010-04-08  3:03                                                 ` [PATCH v3] " Adam Nielsen
2010-04-08 11:33                                                   ` Patrick McHardy
2010-04-08 12:45                                                     ` Jan Engelhardt
2010-04-08 12:57                                                       ` Patrick McHardy
2010-04-08 23:06                                                         ` [PATCH v4] " Adam Nielsen
2010-04-09 14:52                                                           ` Patrick McHardy
2010-04-08 21:07                                                   ` [PATCH v3] " Florian Westphal
2010-04-08 22:45                                                     ` Adam Nielsen
2010-03-27 18:42                                     ` [PATCH] " Jan Engelhardt
2010-03-28  1:58                                       ` Adam Nielsen
2010-04-04 11:59                                         ` Jan Engelhardt
2010-04-08  3:15                                           ` input-layer LEDs as LED-class devices (was: Add refcounts to LED target) Adam Nielsen
2010-04-08  8:03                                             ` Jan Engelhardt

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=4B11D1B5.2060306@shikadi.net \
    --to=a.nielsen@shikadi.net \
    --cc=jengelh@medozas.de \
    --cc=kaber@trash.net \
    --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.