Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/transformations.c b/transformations.c
- index c1ad7c967..f5c63b4c5 100644
- --- a/transformations.c
- +++ b/transformations.c
- @@ -53,7 +53,16 @@
- #define TR_BUFFER_SIZE 65536
- -static char _tr_buffer[TR_BUFFER_SIZE];
- +/* two buffers are enough to allow infinite chaining (R/W <-> W/R) */
- +#define TR_INF_CHAINS 2
- +
- +/* a separate set of chaining buffers for each script function argument */
- +static char __tr_buffers[MAX_ACTION_ELEMS - 1][TR_INF_CHAINS][TR_BUFFER_SIZE];
- +static int __crt_tr_buf, __crt_tr_link;
- +
- +#define get_tr_buffer() \
- + __tr_buffers[__crt_tr_buf] \
- + [__crt_tr_link = (__crt_tr_link + 1) % TR_INF_CHAINS]
- trans_extra_t *tr_extra_list;
- @@ -144,21 +153,27 @@ int run_transformations(struct sip_msg *msg, trans_t *tr, pv_value_t *val)
- if (tr==NULL || val==NULL) {
- LM_DBG("null pointer\n");
- - return -1;
- + ret = -1;
- + goto out;
- }
- it = tr;
- while (it) {
- ret = (*it->trf)(msg, it->params, it->subtype, val);
- if(ret!=0)
- - return ret;
- + goto out;
- it = it->next;
- }
- - return 0;
- +out:
- + /* advancing the current set of buffers prevents any bugs when passing
- + * multiple transformation-enabled vars as cfg function parameters */
- + __crt_tr_buf = (__crt_tr_buf + 1) % (MAX_ACTION_ELEMS - 1);
- +
- + return ret;
- }
- -static void trans_fill_left(pv_value_t *val, str pad, int len)
- +static void trans_fill_left(pv_value_t *val, str pad, int len, char *_tr_buffer)
- {
- char *p;
- int r;
- @@ -201,7 +216,7 @@ static void trans_fill_left(pv_value_t *val, str pad, int len)
- }
- }
- -static void trans_fill_right(pv_value_t *val, str pad, int len)
- +static void trans_fill_right(pv_value_t *val, str pad, int len, char *_tr_buffer)
- {
- char *p;
- int r;
- @@ -237,7 +252,7 @@ int tr_eval_string(struct sip_msg *msg, tr_param_t *tp, int subtype,
- pv_value_t *val)
- {
- int i, j;
- - char *p, *s;
- + char *p, *s, *_tr_buffer = get_tr_buffer();
- str st;
- pv_value_t v;
- @@ -776,9 +791,9 @@ int tr_eval_string(struct sip_msg *msg, tr_param_t *tp, int subtype,
- return 0;
- if (subtype == TR_S_FILL_LEFT)
- - trans_fill_left(val, st, i);
- + trans_fill_left(val, st, i, _tr_buffer);
- else
- - trans_fill_right(val, st, i);
- + trans_fill_right(val, st, i, _tr_buffer);
- break;
- case TR_S_WIDTH:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement