changeset 1248:c9a160b815ea

Fix issue with anscb in the p_sr expiry mechanism. Thanks Guangming for the report.
author Sebastien Decugis <sdecugis@freediameter.net>
date Fri, 22 Nov 2013 16:07:42 +0100
parents 2c09e2545188
children 4ad4d614acfa
files include/freeDiameter/libfdproto.h libfdcore/p_sr.c libfdproto/messages.c
diffstat 3 files changed, 25 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/include/freeDiameter/libfdproto.h	Tue Nov 12 16:16:15 2013 +0800
+++ b/include/freeDiameter/libfdproto.h	Fri Nov 22 16:07:42 2013 +0100
@@ -2488,6 +2488,7 @@
  */
 int fd_msg_anscb_associate( struct msg * msg, void ( *anscb)(void *, struct msg **), void  * data, void (*expirecb)(void *, DiamId_t, size_t, struct msg **), const struct timespec *timeout );
 int fd_msg_anscb_get( struct msg * msg, void (**anscb)(void *, struct msg **), void (**expirecb)(void *, DiamId_t, size_t, struct msg **), void ** data );
+int fd_msg_anscb_reset(struct msg * msg, int clear_anscb, int clear_expirecb);
 struct timespec *fd_msg_anscb_gettimeout( struct msg * msg ); /* returns NULL or a valid non-0 timespec */
 
 /*
--- a/libfdcore/p_sr.c	Tue Nov 12 16:16:15 2013 +0800
+++ b/libfdcore/p_sr.c	Fri Nov 22 16:07:42 2013 +0100
@@ -116,7 +116,6 @@
 		struct msg * request;
 		struct fd_peer * sentto;
 		void (*expirecb)(void *, DiamId_t, size_t, struct msg **);
-		void (*anscb)(void *, struct msg **);
 		void * data;
 		int no_error;
 
@@ -176,11 +175,11 @@
 
 		
 		/* Retrieve callback in the message */
-		CHECK_FCT_DO( fd_msg_anscb_get( request, &anscb, &expirecb, &data ), break);
+		CHECK_FCT_DO( fd_msg_anscb_get( request, NULL, &expirecb, &data ), break);
 		ASSERT(expirecb);
 	
 		/* Clean up this expirecb from the message */
-		CHECK_FCT_DO( fd_msg_anscb_associate( request, anscb, data, NULL, NULL ), break);
+		CHECK_FCT_DO( fd_msg_anscb_reset( request, 0, 1 ), break);
 
 		/* Call it */
 		(*expirecb)(data, sentto->p_hdr.info.pi_diamid, sentto->p_hdr.info.pi_diamidlen, &request);
--- a/libfdproto/messages.c	Tue Nov 12 16:16:15 2013 +0800
+++ b/libfdproto/messages.c	Fri Nov 22 16:07:42 2013 +0100
@@ -1266,7 +1266,28 @@
 	}
 	
 	return 0;
-}	
+}
+
+/* Remove a callback */
+int fd_msg_anscb_reset(struct msg * msg, int clear_anscb, int clear_expirecb) 
+{
+	TRACE_ENTRY("%p %d %d", msg, clear_anscb, clear_expirecb);
+	
+	/* Check the parameters */
+	CHECK_PARAMS( CHECK_MSG(msg) );
+	
+	if (clear_anscb) {
+		msg->msg_cb.anscb = NULL;
+		msg->msg_cb.data = NULL;
+	}
+	if (clear_expirecb) {
+		msg->msg_cb.expirecb = NULL;
+		memset(&msg->msg_cb.timeout, 0, sizeof(struct timespec));
+	}
+	
+	return 0;
+}
+
 
 int fd_msg_anscb_get( struct msg * msg, void (**anscb)(void *, struct msg **), void (**expirecb)(void *, DiamId_t, size_t, struct msg **), void ** data )
 {
"Welcome to our mercurial repository"