Module: kamailio
Branch: master
Commit: 1db7dc4de6588131b4340390b5996141940b7ef0
URL:
https://github.com/kamailio/kamailio/commit/1db7dc4de6588131b4340390b599614…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2018-09-11T23:12:02+02:00
jsonrpcs: set global active context to delayed value for async commands
- GH #1640
---
Modified: src/modules/jsonrpcs/jsonrpcs_mod.c
---
Diff:
https://github.com/kamailio/kamailio/commit/1db7dc4de6588131b4340390b599614…
Patch:
https://github.com/kamailio/kamailio/commit/1db7dc4de6588131b4340390b599614…
---
diff --git a/src/modules/jsonrpcs/jsonrpcs_mod.c b/src/modules/jsonrpcs/jsonrpcs_mod.c
index 5c558c60c4..1fd737298a 100644
--- a/src/modules/jsonrpcs/jsonrpcs_mod.c
+++ b/src/modules/jsonrpcs/jsonrpcs_mod.c
@@ -120,7 +120,8 @@ extern int jsonrpc_dgram_destroy(void);
* being currently processed.
* @sa rpc_ctx
*/
-static jsonrpc_ctx_t _jsonrpc_ctx;
+static jsonrpc_ctx_t _jsonrpc_ctx_global;
+static jsonrpc_ctx_t *_jsonrpc_ctx_active = NULL;
static xhttp_api_t xhttp_api;
@@ -277,6 +278,7 @@ static int jsonrpc_delayed_reply_ctx_init(jsonrpc_ctx_t* ctx)
if (jsonrpc_init_reply(ctx) < 0)
return -1;
jsonrpc_reset_plain_reply(ctx->jrpl->free_fn);
+ _jsonrpc_ctx_active = ctx;
}
return 0;
}
@@ -773,10 +775,10 @@ static int jsonrpc_struct_add(srjson_t *jnode, char* fmt, ...)
}
isobject = (jnode->type==srjson_Object);
- ctx = &_jsonrpc_ctx;
- if(ctx->jrpl==NULL) {
- LM_ERR("reply object not initialized in rpl context - flags 0x%x\n",
- ctx->flags);
+ ctx = _jsonrpc_ctx_active;
+ if(ctx==NULL || ctx->jrpl==NULL) {
+ LM_ERR("reply object not initialized in rpl context %p - flags 0x%x\n",
+ ctx, (ctx)?ctx->flags:0);
return -1;
}
@@ -844,10 +846,10 @@ static int jsonrpc_array_add(srjson_t *jnode, char* fmt, ...)
return -1;
}
- ctx = &_jsonrpc_ctx;
- if(ctx->jrpl==NULL) {
- LM_ERR("reply object not initialized in rpl context - flags 0x%x\n",
- ctx->flags);
+ ctx = _jsonrpc_ctx_active;
+ if(ctx==NULL || ctx->jrpl==NULL) {
+ LM_ERR("reply object not initialized in rpl context %p - flags 0x%x\n",
+ ctx, (ctx)?ctx->flags:0);
return -1;
}
@@ -905,10 +907,10 @@ static int jsonrpc_struct_printf(srjson_t *jnode, char* mname, char*
fmt, ...)
return -1;
}
- ctx = &_jsonrpc_ctx;
- if(ctx->jrpl==NULL) {
- LM_ERR("reply object not initialized in rpl context - flags 0x%x\n",
- ctx->flags);
+ ctx = _jsonrpc_ctx_active;
+ if(ctx==NULL || ctx->jrpl==NULL) {
+ LM_ERR("reply object not initialized in rpl context %p - flags 0x%x\n",
+ ctx, (ctx)?ctx->flags:0);
return -1;
}
@@ -1100,6 +1102,7 @@ static void jsonrpc_delayed_ctx_close(struct rpc_delayed_ctx* dctx)
r_ctx->msg=0;
dctx->reply_ctx=0;
shm_free(dctx);
+ _jsonrpc_ctx_active = NULL;
return;
}
@@ -1233,7 +1236,8 @@ static int jsonrpc_dispatch(sip_msg_t* msg, char* s1, char* s2)
}
/* initialize jsonrpc context */
- ctx = &_jsonrpc_ctx;
+ _jsonrpc_ctx_active = &_jsonrpc_ctx_global;
+ ctx = _jsonrpc_ctx_active;
memset(ctx, 0, sizeof(jsonrpc_ctx_t));
ctx->msg = msg;
/* parse the jsonrpc request */
@@ -1312,7 +1316,8 @@ int jsonrpc_exec_ex(str *cmd, str *rpath)
scmd = *cmd;
/* initialize jsonrpc context */
- ctx = &_jsonrpc_ctx;
+ _jsonrpc_ctx_active = &_jsonrpc_ctx_global;
+ ctx = _jsonrpc_ctx_active;
memset(ctx, 0, sizeof(jsonrpc_ctx_t));
ctx->msg = NULL; /* mark it not send a reply out */
/* parse the jsonrpc request */