From 8eeeccbf00362dce5ed9fee91c231b34201d8785 Mon Sep 17 00:00:00 2001 From: Jan Friesse Date: Thu, 20 Aug 2009 10:50:11 +0000 Subject: [PATCH] Handle NULL callbacks in cpg, evs and confdb lib Attached patches handle NULL callbacks in *_initialize and *_dispatch. Handling is same as in quorum service. Now, when callback is NULL -> no memcpy -> instance callbacks will have all items set to NULL and in *_dispatch function is not called. It changes cfg so now we are using continue instead of exit. git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2392 fd59a12c-fef9-0310-b244-a6a79926bd2f --- lib/cfg.c | 8 +++++--- lib/confdb.c | 16 +++++++++++++++- lib/cpg.c | 12 +++++++++++- lib/evs.c | 12 +++++++++++- 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/lib/cfg.c b/lib/cfg.c index 4be08223..b0380421 100644 --- a/lib/cfg.c +++ b/lib/cfg.c @@ -202,10 +202,12 @@ corosync_cfg_dispatch ( */ switch (dispatch_data->id) { case MESSAGE_RES_CFG_TESTSHUTDOWN: - if (callbacks.corosync_cfg_shutdown_callback) { - res_lib_cfg_testshutdown = (struct res_lib_cfg_testshutdown *)dispatch_data; - callbacks.corosync_cfg_shutdown_callback(cfg_handle, res_lib_cfg_testshutdown->flags); + if (callbacks.corosync_cfg_shutdown_callback == NULL) { + continue; } + + res_lib_cfg_testshutdown = (struct res_lib_cfg_testshutdown *)dispatch_data; + callbacks.corosync_cfg_shutdown_callback(cfg_handle, res_lib_cfg_testshutdown->flags); break; default: coroipcc_dispatch_put (cfg_instance->handle); diff --git a/lib/confdb.c b/lib/confdb.c index 8402f32e..b197717d 100644 --- a/lib/confdb.c +++ b/lib/confdb.c @@ -158,7 +158,9 @@ cs_error_t confdb_initialize ( if (error != CS_OK) goto error_put_destroy; - memcpy (&confdb_inst->callbacks, callbacks, sizeof (confdb_callbacks_t)); + if (callbacks) { + memcpy (&confdb_inst->callbacks, callbacks, sizeof (confdb_callbacks_t)); + } list_init (&confdb_inst->object_find_head); list_init (&confdb_inst->object_iter_head); @@ -336,6 +338,10 @@ cs_error_t confdb_dispatch ( */ switch (dispatch_data->id) { case MESSAGE_RES_CONFDB_KEY_CHANGE_CALLBACK: + if (callbacks.confdb_key_change_notify_fn == NULL) { + continue; + } + res_key_changed_pt = (struct res_lib_confdb_key_change_callback *)dispatch_data; callbacks.confdb_key_change_notify_fn(handle, @@ -351,6 +357,10 @@ cs_error_t confdb_dispatch ( break; case MESSAGE_RES_CONFDB_OBJECT_CREATE_CALLBACK: + if (callbacks.confdb_object_create_change_notify_fn == NULL) { + continue; + } + res_object_created_pt = (struct res_lib_confdb_object_create_callback *)dispatch_data; callbacks.confdb_object_create_change_notify_fn(handle, @@ -361,6 +371,10 @@ cs_error_t confdb_dispatch ( break; case MESSAGE_RES_CONFDB_OBJECT_DESTROY_CALLBACK: + if (callbacks.confdb_object_delete_change_notify_fn == NULL) { + continue; + } + res_object_destroyed_pt = (struct res_lib_confdb_object_destroy_callback *)dispatch_data; callbacks.confdb_object_delete_change_notify_fn(handle, diff --git a/lib/cpg.c b/lib/cpg.c index 3f8df6c6..f78ad911 100644 --- a/lib/cpg.c +++ b/lib/cpg.c @@ -101,7 +101,9 @@ cs_error_t cpg_initialize ( goto error_put_destroy; } - memcpy (&cpg_inst->callbacks, callbacks, sizeof (cpg_callbacks_t)); + if (callbacks) { + memcpy (&cpg_inst->callbacks, callbacks, sizeof (cpg_callbacks_t)); + } hdb_handle_put (&cpg_handle_t_db, *handle); @@ -268,6 +270,10 @@ cs_error_t cpg_dispatch ( */ switch (dispatch_data->id) { case MESSAGE_RES_CPG_DELIVER_CALLBACK: + if (callbacks.cpg_deliver_fn == NULL) { + continue; + } + res_cpg_deliver_callback = (struct res_lib_cpg_deliver_callback *)dispatch_data; marshall_from_mar_cpg_name_t ( @@ -283,6 +289,10 @@ cs_error_t cpg_dispatch ( break; case MESSAGE_RES_CPG_CONFCHG_CALLBACK: + if (callbacks.cpg_confchg_fn == NULL) { + continue; + } + res_cpg_confchg_callback = (struct res_lib_cpg_confchg_callback *)dispatch_data; for (i = 0; i < res_cpg_confchg_callback->member_list_entries; i++) { diff --git a/lib/evs.c b/lib/evs.c index 6bf14489..0f04cbcd 100644 --- a/lib/evs.c +++ b/lib/evs.c @@ -116,7 +116,9 @@ evs_error_t evs_initialize ( goto error_put_destroy; } - memcpy (&evs_inst->callbacks, callbacks, sizeof (evs_callbacks_t)); + if (callbacks) { + memcpy (&evs_inst->callbacks, callbacks, sizeof (evs_callbacks_t)); + } hdb_handle_put (&evs_handle_t_db, *handle); @@ -277,6 +279,10 @@ evs_error_t evs_dispatch ( */ switch (dispatch_data->id) { case MESSAGE_RES_EVS_DELIVER_CALLBACK: + if (callbacks.evs_deliver_fn == NULL) { + continue; + } + res_evs_deliver_callback = (struct res_evs_deliver_callback *)dispatch_data; callbacks.evs_deliver_fn ( handle, @@ -286,6 +292,10 @@ evs_error_t evs_dispatch ( break; case MESSAGE_RES_EVS_CONFCHG_CALLBACK: + if (callbacks.evs_confchg_fn == NULL) { + continue; + } + res_evs_confchg_callback = (struct res_evs_confchg_callback *)dispatch_data; callbacks.evs_confchg_fn ( handle,