The problem seen was that in a mixed endian environment that had to retransmit messages, the message would be received with the msg_count fields already swapped.
To resolve the problem a local variable is used to store the swapped value. Signed-off-by: John Thompson <[email protected]> --- exec/totempg.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/exec/totempg.c b/exec/totempg.c index fe111b1..fc2c15a 100644 --- a/exec/totempg.c +++ b/exec/totempg.c @@ -640,10 +640,12 @@ static void totempg_deliver_fn ( mcast = (struct totempg_mcast *)msg; if (endian_conversion_required) { - mcast->msg_count = swab16 (mcast->msg_count); + msg_count = swab16 (mcast->msg_count); + } + else { + msg_count = mcast->msg_count; } - msg_count = mcast->msg_count; datasize = sizeof (struct totempg_mcast) + msg_count * sizeof (unsigned short); @@ -652,7 +654,7 @@ static void totempg_deliver_fn ( msg_lens = (unsigned short *) (header + sizeof (struct totempg_mcast)); if (endian_conversion_required) { - for (i = 0; i < mcast->msg_count; i++) { + for (i = 0; i < msg_count; i++) { msg_lens[i] = swab16 (msg_lens[i]); } } @@ -666,7 +668,7 @@ static void totempg_deliver_fn ( * then adjust the assembly buffer so we can add the rest of the * fragment when it arrives. */ - msg_count = mcast->fragmented ? mcast->msg_count - 1 : mcast->msg_count; + msg_count = mcast->fragmented ? msg_count - 1 : msg_count; continuation = mcast->continuation; iov_delv.iov_base = (void *)&assembly->data[0]; iov_delv.iov_len = assembly->index + msg_lens[0]; @@ -724,7 +726,7 @@ static void totempg_deliver_fn ( /* * Message is fragmented, keep around assembly list */ - if (mcast->msg_count > 1) { + if (msg_count > 1) { memmove (&assembly->data[0], &assembly->data[assembly->index], msg_lens[msg_count]); -- 1.7.9.5
_______________________________________________ discuss mailing list [email protected] http://lists.corosync.org/mailman/listinfo/discuss
