From 68f14a8acaba3b629edbe647adf0a9f857e8290f Mon Sep 17 00:00:00 2001 From: vemax78 Date: Thu, 21 Nov 2013 22:03:05 +0100 Subject: [PATCH] Notify event request atomic block of memory --- src/ac/ac_backend.c | 26 +++++++++++++++++--------- src/ac/ac_backend.h | 3 ++- src/ac/ac_session.c | 10 ++++------ 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/ac/ac_backend.c b/src/ac/ac_backend.c index 96d701a..c030754 100644 --- a/src/ac/ac_backend.c +++ b/src/ac/ac_backend.c @@ -87,18 +87,26 @@ static void ac_backend_parsing_resetwtp_event(const char* eventid, struct json_o jsondata = json_object_object_get(jsonimage, "Data"); if (jsonvendor && jsondata && (json_object_get_type(jsonvendor) == json_type_int) && (json_object_get_type(jsondata) == json_type_string)) { - struct ac_notify_reset_t reset; + const char* name = json_object_get_string(jsondata); + if (name && *name) { + int length; + struct ac_notify_reset_t* reset; - /* */ - memset(&reset, 0, sizeof(struct ac_notify_reset_t)); - reset.startupimage.vendor = (uint32_t)json_object_get_int(jsonvendor); - reset.startupimage.name = (uint8_t*)capwap_duplicate_string(json_object_get_string(jsondata)); + /* Notification data */ + length = sizeof(struct ac_notify_reset_t) + strlen(name) + 1; + reset = (struct ac_notify_reset_t*)capwap_alloc(length); - /* */ - capwap_logging_debug("Receive reset request for WTP %s", session->wtpid); + /* */ + reset->vendor = (uint32_t)json_object_get_int(jsonvendor); + strcpy((char*)reset->name, name); - /* Notify Action */ - ac_session_send_action(session, AC_SESSION_ACTION_RESET_WTP, 0, (void*)&reset, sizeof(struct ac_notify_reset_t)); + /* Notify Action */ + capwap_logging_debug("Receive reset request for WTP %s", session->wtpid); + ac_session_send_action(session, AC_SESSION_ACTION_RESET_WTP, 0, (void*)reset, length); + + /* */ + capwap_free(reset); + } } } diff --git a/src/ac/ac_backend.h b/src/ac/ac_backend.h index a9de1dd..0d39cc6 100644 --- a/src/ac/ac_backend.h +++ b/src/ac/ac_backend.h @@ -6,7 +6,8 @@ /* Reset notification */ struct ac_notify_reset_t { - struct capwap_imageidentifier_element startupimage; + uint32_t vendor; + uint8_t name[0]; }; /* */ diff --git a/src/ac/ac_session.c b/src/ac/ac_session.c index d40c862..17dd03d 100644 --- a/src/ac/ac_session.c +++ b/src/ac/ac_session.c @@ -14,15 +14,13 @@ static int ac_session_action_execute(struct ac_session_t* session, struct ac_ses switch (action->action) { case AC_SESSION_ACTION_RESET_WTP: { + struct capwap_imageidentifier_element imageidentifier; struct ac_notify_reset_t* reset = (struct ac_notify_reset_t*)action->data; /* Send reset command */ - ac_session_reset(session, &reset->startupimage); - - /* Free resource */ - if (reset->startupimage.name) { - capwap_free(reset->startupimage.name); - } + imageidentifier.vendor = reset->vendor; + imageidentifier.name = reset->name; + ac_session_reset(session, &imageidentifier); break; }