This patch fixes the rolling upgrade issue from openais whitetank to
corosync 1.3. The problem is the length of the array 
cpg_exec_service[]/cpg_exec_engine[] is different in the two version.

In openais whitetank:

static struct openais_exec_handler cpg_exec_service[] =
{
        { /* 0 */
                .exec_handler_fn        = message_handler_req_exec_cpg_procjoin,
                .exec_endian_convert_fn = exec_cpg_procjoin_endian_convert
        },
        { /* 1 */
                .exec_handler_fn        = 
message_handler_req_exec_cpg_procleave,
                .exec_endian_convert_fn = exec_cpg_procjoin_endian_convert
        },
        { /* 2 */
                .exec_handler_fn        = message_handler_req_exec_cpg_joinlist,
                .exec_endian_convert_fn = exec_cpg_joinlist_endian_convert
        },
        { /* 3 */
                .exec_handler_fn        = message_handler_req_exec_cpg_mcast,
                .exec_endian_convert_fn = exec_cpg_mcast_endian_convert
        },
        { /* 4 */
                .exec_handler_fn        = message_handler_req_exec_cpg_downlist,
                .exec_endian_convert_fn = exec_cpg_downlist_endian_convert
        },
};

In corosync:

static struct corosync_exec_handler cpg_exec_engine[] =
{
        { /* 0 */
                .exec_handler_fn        = message_handler_req_exec_cpg_procjoin,
                .exec_endian_convert_fn = exec_cpg_procjoin_endian_convert
        },
        { /* 1 */
                .exec_handler_fn        = 
message_handler_req_exec_cpg_procleave,
                .exec_endian_convert_fn = exec_cpg_procjoin_endian_convert
        },
        { /* 2 */
                .exec_handler_fn        = message_handler_req_exec_cpg_joinlist,
                .exec_endian_convert_fn = exec_cpg_joinlist_endian_convert
        },      
        { /* 3 */
                .exec_handler_fn        = message_handler_req_exec_cpg_mcast,
                .exec_endian_convert_fn = exec_cpg_mcast_endian_convert
        },
        { /* 4 */
                .exec_handler_fn        = 
message_handler_req_exec_cpg_downlist_old,
                .exec_endian_convert_fn = exec_cpg_downlist_endian_convert_old
        },
        { /* 5 */
                .exec_handler_fn        = message_handler_req_exec_cpg_downlist,
                .exec_endian_convert_fn = exec_cpg_downlist_endian_convert
        },
};


So the "old" node (with openais whitetank) will get a NULL pointer
when it recevies the message from the "new" node (with corosync 1.3)
and then coredump.

Signed-off-by: Jiaju Zhang <jjzh...@suse.de>
---
Index: openais/exec/main.c
===================================================================
--- openais.orig/exec/main.c
+++ openais/exec/main.c
@@ -403,8 +403,9 @@ static void deliver_fn (
                        (header);
        }
 
-       ais_service[service]->exec_service[fn_id].exec_handler_fn
-               (header, nodeid);
+       if (ais_service[service]->exec_service[fn_id].exec_handler_fn)
+               ais_service[service]->exec_service[fn_id].exec_handler_fn
+                       (header, nodeid);
 
        serialize_mutex_unlock ();
 }
_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to