changeset 1388:61e693afccc6

rt_rewrite: improve locking
author Thomas Klausner <tk@giga.or.at>
date Tue, 15 Oct 2019 16:26:03 +0200
parents d70f5f6cb306
children de90cf7f381e
files extensions/rt_rewrite/rt_rewrite.c
diffstat 1 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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 */
"Welcome to our mercurial repository"