# HG changeset patch # User Thomas Klausner # Date 1571149563 -7200 # Node ID 61e693afccc68422b7c4c6c868453d3cea760eba # Parent d70f5f6cb30612543ac7ee7f73a1abe30a788c49 rt_rewrite: improve locking diff -r d70f5f6cb306 -r 61e693afccc6 extensions/rt_rewrite/rt_rewrite.c --- a/extensions/rt_rewrite/rt_rewrite.c Tue Oct 15 16:25:47 2019 +0200 +++ b/extensions/rt_rewrite/rt_rewrite.c Tue Oct 15 16:26:03 2019 +0200 @@ -391,26 +391,42 @@ return 0; } + if (pthread_rwlock_wrlock(&rt_rewrite_lock) != 0) { + fd_log_error("%s: locking failed, aborting message rewrite", MODULE_NAME); + return errno; + } + if ((store=store_new()) == NULL) { fd_log_error("%s: malloc failure"); + pthread_rwlock_unlock(&rt_rewrite_lock); return ENOMEM; } if ((ret = fd_msg_parse_dict(*msg, fd_g_config->cnf_dict, NULL)) != 0) { fd_log_notice("%s: error parsing message", MODULE_NAME); free(store); + pthread_rwlock_unlock(&rt_rewrite_lock); return ret; } if ((ret=fd_msg_browse(*msg, MSG_BRW_FIRST_CHILD, &avp, NULL)) != 0) { fd_log_notice("internal error: message has no child"); free(store); + pthread_rwlock_unlock(&rt_rewrite_lock); return ret; } if (replace_avps(*msg, avp, avp_match_start->children, store) != 0) { fd_log_error("%s: replace AVP function failed", MODULE_NAME); store_free(store); + pthread_rwlock_unlock(&rt_rewrite_lock); return -1; } - return store_apply(*msg, &store); + ret = store_apply(*msg, &store); + + if (pthread_rwlock_unlock(&rt_rewrite_lock) != 0) { + fd_log_error("%s: unlocking failed, returning error", MODULE_NAME); + return errno; + } + + return ret; } /* entry point */