On Wednesday 17 April 2013 16:47:29 Fabio M. Di Nitto wrote:
> On 4/17/2013 3:52 PM, José Orlando Pereira wrote:
> > The large stack size in cpg_dispatch, resulting from the
> > message buffer, is causing a segmentation fault in environments
> > with a constrained stack size, namely, when calling into
> > cpg_dispatch from Java using JNI (i.e. for
> > http://github.com/jopereira/jgcs/tree/master/jgcs-corosync).
> 
> style: char *dispatch_buf = NULL;
> 
> if (dispatch_buf == NULL) {
>     .... return appropriate error ....
> }
> 
> and you will need to repeat this patch for all libraries.

Please find revised patch below. Note that I have not tested other libs, as I am
using just CPG. But I checked that there are no early returns that would leak.

Regards,
 
-- 
Jose Orlando Pereira

diff --git a/lib/cfg.c b/lib/cfg.c
index d594324..2a1f236 100644
--- a/lib/cfg.c
+++ b/lib/cfg.c
@@ -153,7 +153,7 @@ corosync_cfg_dispatch (
        struct res_lib_cfg_testshutdown *res_lib_cfg_testshutdown;
        corosync_cfg_callbacks_t callbacks;
        struct qb_ipc_response_header *dispatch_data;
-       char dispatch_buf[IPC_DISPATCH_SIZE];
+       char* dispatch_buf = NULL;
 
        error = hdb_error_to_cs (hdb_handle_get (&cfg_hdb, cfg_handle,
                (void *)&cfg_inst));
@@ -169,6 +169,11 @@ corosync_cfg_dispatch (
                timeout = 0;
        }
 
+       dispatch_buf = malloc(IPC_DISPATCH_SIZE);
+       if (dispatch_buf == NULL) {
+               return CS_ERR_NO_MEMORY;
+       }
+
        dispatch_data = (struct qb_ipc_response_header *)dispatch_buf;
        do {
                error = qb_to_cs_error (qb_ipcc_event_recv (
@@ -241,6 +246,7 @@ corosync_cfg_dispatch (
 error_put:
        (void)hdb_handle_put (&cfg_hdb, cfg_handle);
 error_nounlock:
+       free(dispatch_buf);
        return (error);
 }
 
diff --git a/lib/cmap.c b/lib/cmap.c
index 8a5bed0..e4f2bd3 100644
--- a/lib/cmap.c
+++ b/lib/cmap.c
@@ -193,7 +193,7 @@ cs_error_t cmap_dispatch (
        int cont = 1; /* always continue do loop except when set to 0 */
        struct cmap_inst *cmap_inst;
        struct qb_ipc_response_header *dispatch_data;
-       char dispatch_buf[IPC_DISPATCH_SIZE];
+       char* dispatch_buf = NULL;
        struct res_lib_cmap_notify_callback *res_lib_cmap_notify_callback;
        struct cmap_track_inst *cmap_track_inst;
        struct cmap_notify_value old_val;
@@ -212,6 +212,11 @@ cs_error_t cmap_dispatch (
                timeout = 0;
        }
 
+       dispatch_buf = malloc(IPC_DISPATCH_SIZE);
+       if (dispatch_buf == NULL) {
+               return CS_ERR_NO_MEMORY;
+       }
+
        dispatch_data = (struct qb_ipc_response_header *)dispatch_buf;
        do {
                error = qb_to_cs_error(qb_ipcc_event_recv (
@@ -303,6 +308,7 @@ cs_error_t cmap_dispatch (
 
 error_put:
        (void)hdb_handle_put (&cmap_handle_t_db, handle);
+       free(dispatch_buf);
 
        return (error);
 }
diff --git a/lib/cpg.c b/lib/cpg.c
index b96df4e..4b2c46a 100644
--- a/lib/cpg.c
+++ b/lib/cpg.c
@@ -346,7 +346,7 @@ cs_error_t cpg_dispatch (
        struct cpg_ring_id ring_id;
        uint32_t totem_member_list[CPG_MEMBERS_MAX];
        int32_t errno_res;
-       char dispatch_buf[IPC_DISPATCH_SIZE];
+       char* dispatch_buf = NULL;
 
        error = hdb_error_to_cs (hdb_handle_get (&cpg_handle_t_db, handle, 
(void *)&cpg_inst));
        if (error != CS_OK) {
@@ -361,6 +361,11 @@ cs_error_t cpg_dispatch (
                timeout = 0;
        }
 
+       dispatch_buf = malloc(IPC_DISPATCH_SIZE);
+       if (dispatch_buf == NULL) {
+               return CS_ERR_NO_MEMORY;
+       }
+
        dispatch_data = (struct qb_ipc_response_header *)dispatch_buf;
        do {
                errno_res = qb_ipcc_event_recv (
@@ -504,6 +509,7 @@ cs_error_t cpg_dispatch (
 
 error_put:
        hdb_handle_put (&cpg_handle_t_db, handle);
+       free(dispatch_buf);
        return (error);
 }
 
diff --git a/lib/quorum.c b/lib/quorum.c
index 92748da..12e2eae 100644
--- a/lib/quorum.c
+++ b/lib/quorum.c
@@ -358,7 +358,7 @@ cs_error_t quorum_dispatch (
        struct quorum_inst *quorum_inst;
        quorum_callbacks_t callbacks;
        struct qb_ipc_response_header *dispatch_data;
-       char dispatch_buf[IPC_DISPATCH_SIZE];
+       char* dispatch_buf = NULL;
        struct res_lib_quorum_notification *res_lib_quorum_notification;
 
        if (dispatch_types != CS_DISPATCH_ONE &&
@@ -383,6 +383,11 @@ cs_error_t quorum_dispatch (
                timeout = 0;
        }
 
+       dispatch_buf = malloc(IPC_DISPATCH_SIZE);
+       if (dispatch_buf == NULL) {
+               return CS_ERR_NO_MEMORY;
+       }
+
        dispatch_data = (struct qb_ipc_response_header *)dispatch_buf;
        do {
                error = qb_to_cs_error (qb_ipcc_event_recv (
@@ -459,5 +464,6 @@ cs_error_t quorum_dispatch (
 
 error_put:
        (void)hdb_handle_put (&quorum_handle_t_db, handle);
+       free(dispatch_buf);
        return (error);
 }
diff --git a/lib/votequorum.c b/lib/votequorum.c
index 56ac517..79d1f16 100644
--- a/lib/votequorum.c
+++ b/lib/votequorum.c
@@ -437,7 +437,7 @@ cs_error_t votequorum_dispatch (
        struct qb_ipc_response_header *dispatch_data;
        struct res_lib_votequorum_notification *res_lib_votequorum_notification;
        struct res_lib_votequorum_expectedvotes_notification 
*res_lib_votequorum_expectedvotes_notification;
-       char dispatch_buf[IPC_DISPATCH_SIZE];
+       char* dispatch_buf = NULL;
 
        if (dispatch_types != CS_DISPATCH_ONE &&
                dispatch_types != CS_DISPATCH_ALL &&
@@ -461,6 +461,11 @@ cs_error_t votequorum_dispatch (
                timeout = 0;
        }
 
+       dispatch_buf = malloc(IPC_DISPATCH_SIZE);
+       if (dispatch_buf == NULL) {
+               return CS_ERR_NO_MEMORY;
+       }
+
        dispatch_data = (struct qb_ipc_response_header *)dispatch_buf;
        do {
                error = qb_to_cs_error (qb_ipcc_event_recv (
@@ -551,6 +556,7 @@ cs_error_t votequorum_dispatch (
 
 error_put:
        hdb_handle_put (&votequorum_handle_t_db, handle);
+       free(dispatch_buf);
        return (error);
 }

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
discuss mailing list
[email protected]
http://lists.corosync.org/mailman/listinfo/discuss

Reply via email to