From 80b1780d92d619ae3c49f548e5816c0d25312da6 Mon Sep 17 00:00:00 2001 From: vemax78 Date: Wed, 24 Dec 2014 13:31:24 +0100 Subject: [PATCH] Add critical section on netlink send message --- src/ac/ac_kmod.c | 43 ++++++++++++++++++++++++++----------------- src/ac/ac_kmod.h | 1 + 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/ac/ac_kmod.c b/src/ac/ac_kmod.c index 6d2ecfc..74f36fa 100644 --- a/src/ac/ac_kmod.c +++ b/src/ac/ac_kmod.c @@ -142,28 +142,31 @@ static int ac_kmod_send_and_recv(struct nl_sock* nl, struct nl_cb* nl_cb, struct return -1; } + /* */ + capwap_lock_enter(&g_ac.kmodhandle.msglock); + /* Complete send message */ result = nl_send_auto_complete(nl, msg); - if (result < 0) { - nl_cb_put(cb); - return -1; - } - - /* Customize message callback */ - nl_cb_err(cb, NL_CB_CUSTOM, ac_kmod_error_handler, &result); - nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, ac_kmod_finish_handler, &result); - nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ac_kmod_ack_handler, &result); - - if (valid_cb) { - nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, valid_cb, data); - } - - result = 1; - while (result > 0) { - nl_recvmsgs(nl, cb); + if (result >= 0) { + /* Customize message callback */ + nl_cb_err(cb, NL_CB_CUSTOM, ac_kmod_error_handler, &result); + nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, ac_kmod_finish_handler, &result); + nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ac_kmod_ack_handler, &result); + + if (valid_cb) { + nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, valid_cb, data); + } + + result = 1; + while (result > 0) { + nl_recvmsgs(nl, cb); + } } + /* */ + capwap_lock_exit(&g_ac.kmodhandle.msglock); nl_cb_put(cb); + return result; } @@ -623,6 +626,9 @@ int ac_kmod_deauthorize_station(struct capwap_sessionid_element* sessionid, cons int ac_kmod_init(void) { int result; + /* */ + capwap_lock_init(&g_ac.kmodhandle.msglock); + /* Configure netlink callback */ g_ac.kmodhandle.nl_cb = nl_cb_alloc(NL_CB_DEFAULT); if (!g_ac.kmodhandle.nl_cb) { @@ -693,6 +699,9 @@ void ac_kmod_free(void) { nl_cb_put(g_ac.kmodhandle.nlmsg_cb); } + /* */ + capwap_lock_destroy(&g_ac.kmodhandle.msglock); + /* */ memset(&g_ac.kmodhandle, 0, sizeof(struct ac_kmod_handle)); } diff --git a/src/ac/ac_kmod.h b/src/ac/ac_kmod.h index be10df7..c933ee8 100644 --- a/src/ac/ac_kmod.h +++ b/src/ac/ac_kmod.h @@ -24,6 +24,7 @@ struct ac_kmod_handle { int nlsmartcapwap_id; /* Send message */ + capwap_lock_t msglock; struct nl_sock* nlmsg; struct nl_cb* nlmsg_cb; };