diff --git a/daemon/redis.c b/daemon/redis.c index ac1085471..9079ed98b 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -231,24 +231,26 @@ void onRedisNotification(redisAsyncContext *actx, void *reply, void *privdata) { return; } + mutex_lock(&r->lock); + r = cm->conf.redis_read_notify; redisReply *rr = (redisReply*)reply; if (reply == NULL || rr->type != REDIS_REPLY_ARRAY) - return; + goto err; for (int j = 0; j < rr->elements; j++) { rlog(LOG_INFO, "Redis-Notify: %u) %s\n", j, rr->element[j]->str); } if (rr->elements != 4) - return; + goto err; char *pch = strstr(rr->element[2]->str, "notifier-"); if (pch == NULL) { rlog(LOG_ERROR,"Redis-Notifier: The substring 'notifier-' has not been found in the redis notification !\n"); - return; + goto err; } @@ -260,7 +262,7 @@ void onRedisNotification(redisAsyncContext *actx, void *reply, void *privdata) { ++pdbstr; ++p; if (pdbstr-db_str>15) { rlog(LOG_ERROR, "Could not extract keyspace db from notification."); - return; + goto err; } } dbno = r->db = atoi(db_str); @@ -271,7 +273,7 @@ void onRedisNotification(redisAsyncContext *actx, void *reply, void *privdata) { rlog(LOG_ERR, "Redis error: %s", r->ctx->errstr); redisFree(r->ctx); r->ctx = NULL; - return; + goto err; } pch += strlen("notifier-"); @@ -285,13 +287,13 @@ void onRedisNotification(redisAsyncContext *actx, void *reply, void *privdata) { if (c && c->redis_call_responsible) { rlog(LOG_DEBUG,"I am responsible for that call so I ignore redis notifications."); - return; + goto err; } if (strncmp(rr->element[3]->str,"sadd",4)==0) { if (c) { rlog(LOG_INFO, "Redis-Notifier: Call already exists with this callid:%s\n", rr->element[2]->str); - return; + goto err; } redis_restore_call(r, cm, rr->element[2]); @@ -306,6 +308,8 @@ void onRedisNotification(redisAsyncContext *actx, void *reply, void *privdata) { call_destroy(c); } +err: + mutex_unlock(&r->lock); } void redis_notify_event_base_loopbreak(struct callmaster *cm) {