# HG changeset patch # User Sebastien Decugis # Date 1385132862 -3600 # Node ID c9a160b815ea4076ecef093cc8c788a296aa4635 # Parent 2c09e25451881834795889ed4d10d8faa4cba0e2 Fix issue with anscb in the p_sr expiry mechanism. Thanks Guangming for the report. diff -r 2c09e2545188 -r c9a160b815ea include/freeDiameter/libfdproto.h --- 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 */ /* diff -r 2c09e2545188 -r c9a160b815ea libfdcore/p_sr.c --- 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); diff -r 2c09e2545188 -r c9a160b815ea libfdproto/messages.c --- 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 ) {