Mercurial > hg > freeDiameter
diff libfdcore/sctp.c @ 691:78b665400097
Cleanup all pthread_cleanup_push / pop pairs so that pop is always called after push, or ASSERT(0) is some grave errors
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Thu, 20 Jan 2011 19:44:27 +0900 |
parents | 2e94ef0515d7 |
children | 4ffbc9f1e922 |
line wrap: on
line diff
--- a/libfdcore/sctp.c Thu Jan 20 15:38:12 2011 +0900 +++ b/libfdcore/sctp.c Thu Jan 20 19:44:27 2011 +0900 @@ -821,12 +821,12 @@ pthread_cleanup_push(fd_cleanup_socket, sock); /* Set the socket options */ - CHECK_FCT_DO( ret = fd_setsockopt_prebind(*sock), goto fail ); + CHECK_FCT_DO( ret = fd_setsockopt_prebind(*sock), goto out ); /* Create the array of addresses, add first the configured addresses, then the discovered, then the other ones */ - CHECK_FCT_DO( ret = add_addresses_from_list_mask(&sar.buf, &size, &count, family, htons(port), list, EP_FL_CONF, EP_FL_CONF ), goto fail ); - CHECK_FCT_DO( ret = add_addresses_from_list_mask(&sar.buf, &size, &count, family, htons(port), list, EP_FL_CONF | EP_FL_DISC, EP_FL_DISC ), goto fail ); - CHECK_FCT_DO( ret = add_addresses_from_list_mask(&sar.buf, &size, &count, family, htons(port), list, EP_FL_CONF | EP_FL_DISC, 0 ), goto fail ); + CHECK_FCT_DO( ret = add_addresses_from_list_mask(&sar.buf, &size, &count, family, htons(port), list, EP_FL_CONF, EP_FL_CONF ), goto out ); + CHECK_FCT_DO( ret = add_addresses_from_list_mask(&sar.buf, &size, &count, family, htons(port), list, EP_FL_CONF | EP_FL_DISC, EP_FL_DISC ), goto out ); + CHECK_FCT_DO( ret = add_addresses_from_list_mask(&sar.buf, &size, &count, family, htons(port), list, EP_FL_CONF | EP_FL_DISC, 0 ), goto out ); /* Try connecting */ if (TRACE_BOOL(FULL)) { @@ -865,26 +865,28 @@ } /* Some errors are expected, we log at different level */ TRACE_DEBUG( lvl, "sctp_connectx returned an error: %s", strerror(ret)); - goto fail; + goto out; } free(sar.buf); sar.buf = NULL; /* Set the remaining sockopts */ - CHECK_FCT_DO( ret = fd_setsockopt_postbind(*sock, 1), goto fail_deco ); - - /* Done! */ - pthread_cleanup_pop(0); - return 0; + CHECK_FCT_DO( ret = fd_setsockopt_postbind(*sock, 1), + { + CHECK_SYS_DO( shutdown(*sock, SHUT_RDWR), /* continue */ ); + } ); -fail_deco: - CHECK_SYS_DO( shutdown(*sock, SHUT_RDWR), /* continue */ ); -fail: - if (*sock > 0) { - CHECK_SYS_DO( close(*sock), /* continue */ ); - *sock = -1; +out: + ; + pthread_cleanup_pop(0); + + if (ret) { + if (*sock > 0) { + CHECK_SYS_DO( close(*sock), /* continue */ ); + *sock = -1; + } + free(sar.buf); } - free(sar.buf); return ret; }