From: Sean Bright Date: Thu, 24 Dec 2020 15:03:44 +0000 (-0500) Subject: app_voicemail: Prevent deadlocks when out of ODBC database connections X-Git-Tag: 16.16.0-rc1~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2b7af3eb27d07d3de86943f9025df343ee447e08;p=thirdparty%2Fasterisk.git app_voicemail: Prevent deadlocks when out of ODBC database connections ASTERISK-28992 #close Change-Id: Ia7d608924036139ee2520b840d077762d02668d0 --- diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index cbeeb4fe35..e554ee7124 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -3939,6 +3939,7 @@ static int retrieve_file(char *dir, int msgnum) char fn[PATH_MAX]; char full_fn[PATH_MAX]; char msgnums[80]; + char msg_id[MSG_ID_LEN] = ""; char *argv[] = { dir, msgnums }; struct generic_prepare_struct gps = { .sql = sql, .argc = 2, .argv = argv }; struct odbc_obj *obj; @@ -4043,10 +4044,10 @@ static int retrieve_file(char *dir, int msgnum) } else { res = SQLGetData(stmt, x + 1, SQL_CHAR, rowdata, sizeof(rowdata), NULL); if (res == SQL_NULL_DATA && !strcasecmp(coltitle, "msg_id")) { - char msg_id[MSG_ID_LEN]; + /* Generate msg_id now, but don't store it until we're done with this + connection */ generate_msg_id(msg_id); snprintf(rowdata, sizeof(rowdata), "%s", msg_id); - odbc_update_msg_id(dir, msgnum, msg_id); } else if (res == SQL_NULL_DATA && !strcasecmp(coltitle, "category")) { /* Ignore null column value for category */ ast_debug(3, "Ignoring null category column in ODBC voicemail retrieve_file.\n"); @@ -4072,6 +4073,13 @@ bail: ast_odbc_release_obj(obj); + /* If res_odbc is configured to only allow a single database connection, we + will deadlock if we try to do this before releasing the connection we + were just using. */ + if (!ast_strlen_zero(msg_id)) { + odbc_update_msg_id(dir, msgnum, msg_id); + } + return x - 1; }