Skip to content

Commit

Permalink
sql_cacher: fix several possible deadlocks in case of errors
Browse files Browse the repository at this point in the history
Reported by Ben Newlin in #1760

(cherry picked from commit dea97be)
  • Loading branch information
rvlad-patrascu committed Jul 11, 2019
1 parent c203dde commit ef29dce
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions modules/sql_cacher/sql_cacher.c
Expand Up @@ -1009,6 +1009,11 @@ static mi_item_t *mi_reload(const mi_params_t *params, str *key)

if ((rld_vers = get_rld_vers_from_cache(db_hdls->c_entry, db_hdls)) < 0) {
LM_ERR("Unable to fetch reload version counter\n");
if (it)
lock_release(it->wait_sql_query);
else
lock_release(queries_lock);

return init_mi_error(500, MI_SSTR("ERROR Reloading key from SQL"
" database\n"));
}
Expand Down Expand Up @@ -1061,13 +1066,15 @@ static mi_item_t *mi_reload(const mi_params_t *params, str *key)
if (db_hdls->cdbf.add(db_hdls->cdbcon, &rld_vers_key, 1, 0, &rld_vers) < 0) {
LM_DBG("Failed to increment reload version integer from cachedb\n");
pkg_free(rld_vers_key.s);
lock_stop_write(db_hdls->c_entry->ref_lock);
return init_mi_error(500, MI_SSTR("ERROR Reloading SQL database"));
}

pkg_free(rld_vers_key.s);

if (load_entire_table(db_hdls->c_entry, db_hdls, rld_vers) < 0) {
LM_DBG("Failed to reload table\n");
lock_stop_write(db_hdls->c_entry->ref_lock);
return init_mi_error(500, MI_SSTR("ERROR Reloading SQL database"));
}

Expand Down Expand Up @@ -1757,6 +1764,7 @@ int pv_get_sql_cached_value(struct sip_msg *msg, pv_param_t *param, pv_value_t
} else {
if (cdb_res.len == 0 || !cdb_res.s) {
LM_ERR("Cache fetch result should not be empty\n");
lock_stop_read(pv_name->c_entry->ref_lock);
return pv_get_null(msg, param, res);
}

Expand Down

0 comments on commit ef29dce

Please sign in to comment.