Attention is currently required from: flichtenheld, plaisthos.
Hello plaisthos, flichtenheld,
I'd like you to do a code review.
Please visit
http://gerrit.openvpn.net/c/openvpn/+/433?usp=email
to review the following change.
Change subject: io_work: pass event_arg object to event handler in case of
socket event
......................................................................
io_work: pass event_arg object to event handler in case of socket event
In order to allow the code to work with multiple listening sockets
it is essential to allow the generic multi_io event handler
to distinguish between the various socket objects.
This can be achieved by passing an event_arg object that contains
a pointer to the link_socket.
This code path is used on clients as well as UDP servers.
Change-Id: I5899081c69bf1aa654d20e607fcdbd589140d474
Signed-off-by: Antonio Quartulli <[email protected]>
---
M src/openvpn/event.h
M src/openvpn/forward.c
M src/openvpn/mtcp.c
3 files changed, 30 insertions(+), 5 deletions(-)
git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/33/433/1
diff --git a/src/openvpn/event.h b/src/openvpn/event.h
index 0b1f63d..f04318f 100644
--- a/src/openvpn/event.h
+++ b/src/openvpn/event.h
@@ -82,6 +82,12 @@
#define EVENT_METHOD_US_TIMEOUT (1<<0)
#define EVENT_METHOD_FAST (1<<1)
+/*
+ * The following constant is used as boundary between integer value
+ * and real addresses when passing arguments to event handlers as (void *)
+ */
+#define MULTI_N ((void *)16) /* upper bound on MTCP_x */
+
#ifdef _WIN32
typedef const struct rw_handle *event_t;
diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c
index 9cc5c6b..9700c6c 100644
--- a/src/openvpn/forward.c
+++ b/src/openvpn/forward.c
@@ -2164,7 +2164,8 @@
/*
* Configure event wait based on socket, tuntap flags.
*/
- socket_set(c->c2.link_socket, c->c2.event_set, socket, (void
*)&socket_shift, NULL);
+ socket_set(c->c2.link_socket, c->c2.event_set, socket,
+ &c->c2.link_socket->ev_arg, NULL);
tun_set(c->c1.tuntap, c->c2.event_set, tuntap, (void *)tun_shift, NULL);
#if defined(TARGET_LINUX) || defined(TARGET_FREEBSD)
if (socket & EVENT_READ && c->c2.did_open_tun)
@@ -2227,7 +2228,27 @@
for (i = 0; i < status; ++i)
{
const struct event_set_return *e = &esr[i];
- c->c2.event_set_status |= ((e->rwflags & 3) <<
(uintptr_t)e->arg);
+ uintptr_t shift;
+
+ if (e->arg >= MULTI_N)
+ {
+ struct event_arg *ev_arg = (struct event_arg *)e->arg;
+ if (ev_arg->type != EVENT_ARG_LINK_SOCKET)
+ {
+ c->c2.event_set_status = ES_ERROR;
+ msg(D_LINK_ERRORS,
+ "io_work: non socket event delivered");
+ return;
+ }
+
+ shift = socket_shift;
+ }
+ else
+ {
+ shift = (uintptr_t)e->arg;
+ }
+
+ c->c2.event_set_status |= ((e->rwflags & 3) << shift);
}
}
else if (status == 0)
diff --git a/src/openvpn/mtcp.c b/src/openvpn/mtcp.c
index de1d24f..3772acf 100644
--- a/src/openvpn/mtcp.c
+++ b/src/openvpn/mtcp.c
@@ -61,8 +61,6 @@
#define MTCP_FILE_CLOSE_WRITE ((void *)5)
#define MTCP_DCO ((void *)6)
-#define MTCP_N ((void *)16) /* upper bound on MTCP_x */
-
struct ta_iow_flags
{
unsigned int flags;
@@ -696,7 +694,7 @@
struct event_arg *ev_arg = (struct event_arg *)e->arg;
/* incoming data for instance or listening socket? */
- if (e->arg >= MTCP_N)
+ if (e->arg >= MULTI_N)
{
switch (ev_arg->type)
{
--
To view, visit http://gerrit.openvpn.net/c/openvpn/+/433?usp=email
To unsubscribe, or for help writing mail filters, visit
http://gerrit.openvpn.net/settings
Gerrit-Project: openvpn
Gerrit-Branch: master
Gerrit-Change-Id: I5899081c69bf1aa654d20e607fcdbd589140d474
Gerrit-Change-Number: 433
Gerrit-PatchSet: 1
Gerrit-Owner: ordex <[email protected]>
Gerrit-Reviewer: flichtenheld <[email protected]>
Gerrit-Reviewer: plaisthos <[email protected]>
Gerrit-CC: openvpn-devel <[email protected]>
Gerrit-Attention: plaisthos <[email protected]>
Gerrit-Attention: flichtenheld <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
Openvpn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel