Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > media > main-src > by-pkgid > e536fc0c6270ec1d92a0fd41bb1f8360 > files > 31

rgmanager-2.0.52-28.el5_8.2.src.rpm

From 92c3ba0359d38829318d3d6d93d32c1baee06c03 Mon Sep 17 00:00:00 2001
From: Lon Hohberger <lhh@redhat.com>
Date: Tue, 6 Oct 2009 16:00:47 -0400
Subject: [PATCH] rgmanager: Fix multiple event processing w/ EVENT_USER

We were trying to send responses to each event, which
could cause a crash.

Resolves: bz527239

Signed-off-by: Lon Hohberger <lhh@redhat.com>
---
 rgmanager/src/daemons/slang_event.c |   15 ++++++++-------
 1 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/rgmanager/src/daemons/slang_event.c b/rgmanager/src/daemons/slang_event.c
index d410a40..8a5493c 100644
--- a/rgmanager/src/daemons/slang_event.c
+++ b/rgmanager/src/daemons/slang_event.c
@@ -1155,7 +1155,7 @@ S_service_event(const char *file, const char *script, char *name,
 
 int
 S_user_event(const char *file, const char *script, char *name,
-	     int request, int arg1, int arg2, int target, msgctx_t *ctx)
+	     int request, int arg1, int arg2, int target, msgctx_t **ctx)
 {
 	int ret = RG_SUCCESS;
 
@@ -1179,20 +1179,21 @@ S_user_event(const char *file, const char *script, char *name,
 
 	/* XXX Send response code to caller - that 0 should be the
 	   new service owner, if there is one  */
-	if (ctx) {
+	if (*ctx) {
 		if (_user_return > 0) {
 			/* sl_start_service() squashes return code and
 			   node ID into one value.  <0 = error, >0 =
 			   success, return-value == node id running
 			   service */
-			send_ret(ctx, name, 0, request, _user_return);
+			send_ret(*ctx, name, 0, request, _user_return);
 		} else {
 			/* return value < 0 ... pass directly back;
 			   don't transpose */
-			send_ret(ctx, name, _user_return, request, 0);
+			send_ret(*ctx, name, _user_return, request, 0);
 		}
-		msg_close(ctx);
-		msg_free_ctx(ctx);
+		msg_close(*ctx);
+		msg_free_ctx(*ctx);
+		*ctx = NULL;
 	}
 	_user_return = 0;
 	return ret;
@@ -1232,7 +1233,7 @@ slang_do_script(event_t *pattern, event_t *ev)
 				ev->ev.user.u_arg1,
 				ev->ev.user.u_arg2,
 				ev->ev.user.u_target,
-				ev->ev.user.u_ctx);
+				&ev->ev.user.u_ctx);
 		break;
 	default:
 		break;
-- 
1.6.2.5