Re: [libnetfilter_log] fix bug in race condition of calling nflog_open from different threads at same time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch file in the required format has been attached to the email.

Thanks, Evgen

вт, 30 квіт. 2024 р. о 13:54 Phil Sutter <phil@xxxxxx> пише:
>
> Evgen,
>
> On Tue, Apr 30, 2024 at 01:18:29PM +0300, Evgen Bendyak wrote:
> > This patch addresses a bug that occurs when the nflog_open function is
> > called concurrently from different threads within an application. The
> > function nflog_open internally invokes nflog_open_nfnl. Within this
> > function, a static global variable pkt_cb (static struct nfnl_callback
> > pkt_cb) is used. This variable is assigned a pointer to a newly
> > created structure (pkt_cb.data = h;) and is passed to
> > nfnl_callback_register. The issue arises with concurrent execution of
> > pkt_cb.data = h;, as only one of the simultaneously created
> > nflog_handle structures is retained due to the callback function.
> > Subsequently, the callback function __nflog_rcv_pkt is invoked for all
> > the nflog_open structures, but only references one of them.
> > Consequently, the callbacks registered by the end-user of the library
> > through nflog_callback_register fail to trigger in sessions where the
> > incorrect reference was recorded.
> > This patch corrects this behavior by creating the structure locally on
> > the stack for each call to nflog_open_nfnl. Since the
> > nfnl_callback_register function simply copies the data into its
> > internal structures, there is no need to retain pkt_cb beyond this
> > point.
>
> Patch looks sane, but I fear formatting won't do. Are you able to turn
> this into a git commit and use git-format-patch/git-send-email to submit
> it?
>
> Thanks, Phil
From e62369954dcb7315b738346cc5ebff89cbe3bf56 Mon Sep 17 00:00:00 2001
From: Evgenii Bendyak <jman.box@xxxxxxxxx>
Date: Tue, 30 Apr 2024 16:51:53 +0300
Subject: [PATCH] fix bug in race condition of calling nflog_open from
 different threads at same time

---
 src/libnetfilter_log.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/src/libnetfilter_log.c b/src/libnetfilter_log.c
index cb09384..339c961 100644
--- a/src/libnetfilter_log.c
+++ b/src/libnetfilter_log.c
@@ -161,11 +161,6 @@ static int __nflog_rcv_pkt(struct nlmsghdr *nlh, struct nfattr *nfa[],
 	return gh->cb(gh, nfmsg, &nfldata, gh->data);
 }
 
-static struct nfnl_callback pkt_cb = {
-	.call 		= &__nflog_rcv_pkt,
-	.attr_count 	= NFULA_MAX,
-};
-
 /* public interface */
 
 struct nfnl_handle *nflog_nfnlh(struct nflog_handle *h)
@@ -255,6 +250,10 @@ struct nflog_handle *nflog_open_nfnl(struct nfnl_handle *nfnlh)
 {
 	struct nflog_handle *h;
 	int err;
+	struct nfnl_callback pkt_cb = {
+		.call 		= &__nflog_rcv_pkt,
+		.attr_count 	= NFULA_MAX,
+	};
 
 	h = calloc(1, sizeof(*h));
 	if (!h)
-- 
2.25.1


[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux