From fe34a7e20e03026984b5c6b4dca5fd41205f7fc6 Mon Sep 17 00:00:00 2001 From: Jan Janak Date: Fri, 15 Feb 2019 20:40:21 -0500 Subject: [PATCH 1/2] Avoid crash in case a chat room has no members. The imc module may encouter chat rooms that, for one reason or another, have no members. In that case, we cannot use the URI of the first member as the owner URI. This happens, for example, when the destroy function fails to save chat room members into the database. --- src/modules/imc/imc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/imc/imc.c b/src/modules/imc/imc.c index e670ea7e0db..9f930cce5c4 100644 --- a/src/modules/imc/imc.c +++ b/src/modules/imc/imc.c @@ -716,6 +716,7 @@ static void imc_rpc_list_rooms(rpc_t* rpc, void* ctx) int i; imc_room_p irp = NULL; void *vh; + static str unknown = STR_STATIC_INIT(""); for(i=0; istruct_add(vh, "SdS", "room", &irp->uri, "members", irp->nr_of_members, - "owner", &irp->members->uri); + "owner", (irp->nr_of_members > 0) ? &irp->members->uri : &unknown); irp = irp->next; } From 3dd0d5e8515d38d5db2cd6e822b4e247cacde2c7 Mon Sep 17 00:00:00 2001 From: Jan Janak Date: Fri, 15 Feb 2019 21:19:29 -0500 Subject: [PATCH 2/2] When storing data in database, use replace instead of insert. The insert statement would fail with an index violation if the database already contains a matching record. That would happen, for example, if some of the records being saved in mod_destroy were re-loaded from the database on server start. --- src/modules/imc/imc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/imc/imc.c b/src/modules/imc/imc.c index 9f930cce5c4..e9c88a294ad 100644 --- a/src/modules/imc/imc.c +++ b/src/modules/imc/imc.c @@ -674,9 +674,9 @@ static void destroy(void) return; } - if(imc_dbf.insert(imc_db, rq_cols, rq_vals, 3)<0) + if(imc_dbf.replace(imc_db, rq_cols, rq_vals, 3, 2, 0)<0) { - LM_ERR("failed to insert into table imc_rooms\n"); + LM_ERR("failed to replace into table imc_rooms\n"); return; } LM_DBG("room %d %.*s\n", i, irp->name.len, irp->name.s); @@ -694,9 +694,9 @@ static void destroy(void) return; } - if(imc_dbf.insert(imc_db, mq_cols, mq_vals, 4)<0) + if(imc_dbf.replace(imc_db, mq_cols, mq_vals, 4, 2, 0)<0) { - LM_ERR("failed to insert into table imc_rooms\n"); + LM_ERR("failed to replace into table imc_rooms\n"); return; } member = member->next;