mirror of https://github.com/sipwise/kamailio.git
* __dialog_created() -> get_dialog_data() -> creates dlg callbacks for __dialog_sendpublish() __dialog_sendpublish() can be executed by two different process and if we use refresh_pubruri_avps_flag shared memory can change in between Change-Id: Id81b66209c27a900033f557cfa175ca3067aa34cchanges/29/41329/2
parent
ac3631e7de
commit
63132f0500
@ -0,0 +1,107 @@
|
|||||||
|
From: Victor Seva <vseva@sipwise.com>
|
||||||
|
Date: Tue, 30 Jun 2020 09:27:58 +0200
|
||||||
|
Subject: pua_dialoginfo: use lock when use_puburi_avps is set
|
||||||
|
|
||||||
|
---
|
||||||
|
src/modules/pua_dialoginfo/pua_dialoginfo.c | 21 ++++++++++++++++-----
|
||||||
|
src/modules/pua_dialoginfo/pua_dialoginfo.h | 2 ++
|
||||||
|
2 files changed, 18 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/modules/pua_dialoginfo/pua_dialoginfo.c b/src/modules/pua_dialoginfo/pua_dialoginfo.c
|
||||||
|
index c70ea02..f027f63 100644
|
||||||
|
--- a/src/modules/pua_dialoginfo/pua_dialoginfo.c
|
||||||
|
+++ b/src/modules/pua_dialoginfo/pua_dialoginfo.c
|
||||||
|
@@ -338,6 +338,7 @@ __dialog_sendpublish(struct dlg_cell *dlg, int type, struct dlg_cb_params *_para
|
||||||
|
if(use_pubruri_avps && (refresh_pubruri_avps_flag > -1
|
||||||
|
|| (request->flags & (1<<refresh_pubruri_avps_flag))))
|
||||||
|
{
|
||||||
|
+ lock_get(&dlginfo->lock);
|
||||||
|
refresh_pubruri_avps(dlginfo, &uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -494,6 +495,11 @@ __dialog_sendpublish(struct dlg_cell *dlg, int type, struct dlg_cb_params *_para
|
||||||
|
send_publish_flag==-1?1:0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ if(use_pubruri_avps && (refresh_pubruri_avps_flag > -1
|
||||||
|
+ || (request->flags & (1<<refresh_pubruri_avps_flag))))
|
||||||
|
+ {
|
||||||
|
+ lock_release(&dlginfo->lock);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -566,7 +572,11 @@ struct dlginfo_cell* get_dialog_data(struct dlg_cell *dlg, int type)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memset( dlginfo, 0, len);
|
||||||
|
-
|
||||||
|
+ if(use_pubruri_avps && lock_init(&dlginfo->lock) == 0) {
|
||||||
|
+ LM_ERR("cannot init the lock\n");
|
||||||
|
+ free_dlginfo_cell(dlginfo);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
/* copy from dlg structure to dlginfo structure */
|
||||||
|
dlginfo->lifetime = override_lifetime ? override_lifetime : dlg->lifetime;
|
||||||
|
dlginfo->from_uri.s = (char*)dlginfo + sizeof(struct dlginfo_cell);
|
||||||
|
@@ -714,25 +724,28 @@ __dialog_created(struct dlg_cell *dlg, int type, struct dlg_cb_params *_params)
|
||||||
|
dlginfo=get_dialog_data(dlg, type);
|
||||||
|
if(dlginfo==NULL)
|
||||||
|
return;
|
||||||
|
-
|
||||||
|
if (disable_caller_publish_flag == -1 || !(request && (request->flags
|
||||||
|
& (1<<disable_caller_publish_flag))))
|
||||||
|
{
|
||||||
|
+ if(use_pubruri_avps) lock_get(&dlginfo->lock);
|
||||||
|
dialog_publish_multi("Trying", dlginfo->pubruris_caller,
|
||||||
|
&(dlg->from_uri),
|
||||||
|
(include_req_uri)?&(dlg->req_uri):&(dlg->to_uri),
|
||||||
|
&(dlg->callid), 1, dlginfo->lifetime,
|
||||||
|
0, 0, 0, 0, (send_publish_flag==-1)?1:0);
|
||||||
|
+ if(use_pubruri_avps) lock_release(&dlginfo->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (callee_trying && (disable_callee_publish_flag == -1 || !(request
|
||||||
|
&& (request->flags & (1<<disable_callee_publish_flag)))))
|
||||||
|
{
|
||||||
|
+ if(use_pubruri_avps) lock_get(&dlginfo->lock);
|
||||||
|
dialog_publish_multi("Trying", dlginfo->pubruris_callee,
|
||||||
|
(include_req_uri)?&(dlg->req_uri):&(dlg->to_uri),
|
||||||
|
&(dlg->from_uri),
|
||||||
|
&(dlg->callid), 0, dlginfo->lifetime,
|
||||||
|
0, 0, 0, 0, (send_publish_flag==-1)?1:0);
|
||||||
|
+ if(use_pubruri_avps) lock_release(&dlginfo->lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -856,9 +869,7 @@ void free_dlginfo_cell(void *param) {
|
||||||
|
free_str_list_all(cell->pubruris_caller);
|
||||||
|
free_str_list_all(cell->pubruris_callee);
|
||||||
|
|
||||||
|
- /*if (cell->to_tag) {
|
||||||
|
- shm_free(cell->to_tag);
|
||||||
|
- }*/
|
||||||
|
+ if(use_pubruri_avps) lock_destroy(cell->lock);
|
||||||
|
shm_free(param);
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/modules/pua_dialoginfo/pua_dialoginfo.h b/src/modules/pua_dialoginfo/pua_dialoginfo.h
|
||||||
|
index 01fc876..8289669 100644
|
||||||
|
--- a/src/modules/pua_dialoginfo/pua_dialoginfo.h
|
||||||
|
+++ b/src/modules/pua_dialoginfo/pua_dialoginfo.h
|
||||||
|
@@ -23,6 +23,7 @@
|
||||||
|
|
||||||
|
#ifndef _PUA_DLGINFO_H
|
||||||
|
#define _PUA_DLGINFO_H
|
||||||
|
+#include "../../core/locking.h"
|
||||||
|
#include "../pua/pua_bind.h"
|
||||||
|
|
||||||
|
extern send_publish_t pua_send_publish;
|
||||||
|
@@ -35,6 +36,7 @@ void dialog_publish_multi(char *state, struct str_list* ruris, str *entity, str
|
||||||
|
* dlg_cell during the callback (as this could create a race condition
|
||||||
|
* if the dlg_cell gets meanwhile deleted) */
|
||||||
|
struct dlginfo_cell {
|
||||||
|
+ gen_lock_t lock;
|
||||||
|
str from_uri;
|
||||||
|
str to_uri;
|
||||||
|
str callid;
|
||||||
Loading…
Reference in new issue