summaryrefslogtreecommitdiff
path: root/res/res_pjsip_pubsub.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2016-04-26 15:58:06 -0500
committerRichard Mudgett <rmudgett@digium.com>2016-04-28 17:02:08 -0500
commit8e1b663b874606defc2d3defdacc0ca77efc7092 (patch)
treece82c0bf6e83191518a5b7972213c00a8638b534 /res/res_pjsip_pubsub.c
parent057ed94048b591a74322bbdb152e65f567091518 (diff)
res_pjsip_pubsub.c: Fix body generator registration race.
Change-Id: Id8752073ef06472a2fd96080f4009fac42843e67
Diffstat (limited to 'res/res_pjsip_pubsub.c')
-rw-r--r--res/res_pjsip_pubsub.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c
index 141c2fcf4..97fe45a24 100644
--- a/res/res_pjsip_pubsub.c
+++ b/res/res_pjsip_pubsub.c
@@ -2541,20 +2541,28 @@ void ast_sip_unregister_subscription_handler(struct ast_sip_subscription_handler
AST_RWLIST_TRAVERSE_SAFE_END;
}
-static struct ast_sip_pubsub_body_generator *find_body_generator_type_subtype(const char *content_type,
- const char *content_subtype)
+static struct ast_sip_pubsub_body_generator *find_body_generator_type_subtype_nolock(const char *type, const char *subtype)
{
- struct ast_sip_pubsub_body_generator *iter;
- SCOPED_LOCK(lock, &body_generators, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK);
+ struct ast_sip_pubsub_body_generator *gen;
- AST_LIST_TRAVERSE(&body_generators, iter, list) {
- if (!strcmp(iter->type, content_type) &&
- !strcmp(iter->subtype, content_subtype)) {
+ AST_LIST_TRAVERSE(&body_generators, gen, list) {
+ if (!strcmp(gen->type, type)
+ && !strcmp(gen->subtype, subtype)) {
break;
}
- };
+ }
- return iter;
+ return gen;
+}
+
+static struct ast_sip_pubsub_body_generator *find_body_generator_type_subtype(const char *type, const char *subtype)
+{
+ struct ast_sip_pubsub_body_generator *gen;
+
+ AST_RWLIST_RDLOCK(&body_generators);
+ gen = find_body_generator_type_subtype_nolock(type, subtype);
+ AST_RWLIST_UNLOCK(&body_generators);
+ return gen;
}
static struct ast_sip_pubsub_body_generator *find_body_generator_accept(const char *accept)
@@ -3092,14 +3100,14 @@ int ast_sip_pubsub_register_body_generator(struct ast_sip_pubsub_body_generator
pj_str_t accept;
pj_size_t accept_len;
- existing = find_body_generator_type_subtype(generator->type, generator->subtype);
+ AST_RWLIST_WRLOCK(&body_generators);
+ existing = find_body_generator_type_subtype_nolock(generator->type, generator->subtype);
if (existing) {
- ast_log(LOG_WARNING, "Cannot register body generator of %s/%s."
- "One is already registered.\n", generator->type, generator->subtype);
+ AST_RWLIST_UNLOCK(&body_generators);
+ ast_log(LOG_WARNING, "A body generator for %s/%s is already registered.\n",
+ generator->type, generator->subtype);
return -1;
}
-
- AST_RWLIST_WRLOCK(&body_generators);
AST_LIST_INSERT_HEAD(&body_generators, generator, list);
AST_RWLIST_UNLOCK(&body_generators);