mirror of https://github.com/sipwise/kamailio.git
> janssonmod_set(): result has json error at line 1: end of file expected > > https://github.com/kamailio/kamailio/issues/2327 Change-Id: Ieaa3511b3abf447740357d4dd690b363043a73a5changes/20/40020/3
parent
c2c59c709e
commit
18503c0f7c
@ -0,0 +1,22 @@
|
||||
From: Daniel-Constantin Mierla <miconda@gmail.com>
|
||||
Date: Mon, 27 Apr 2020 15:24:23 +0200
|
||||
Subject: [PATCH] core: str - fixed wrong (undo'ed) version of STR_ZTOV()
|
||||
macro
|
||||
|
||||
---
|
||||
src/core/str.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/core/str.h b/src/core/str.h
|
||||
index 83334b8..01b12ec 100644
|
||||
--- a/src/core/str.h
|
||||
+++ b/src/core/str.h
|
||||
@@ -137,7 +137,7 @@ typedef struct _str str;
|
||||
if (v != '\0') { \
|
||||
c = v; \
|
||||
} \
|
||||
- }
|
||||
+ } while(0)
|
||||
|
||||
/** @} */
|
||||
|
||||
@ -0,0 +1,124 @@
|
||||
From: Daniel-Constantin Mierla <miconda@gmail.com>
|
||||
Date: Mon, 27 Apr 2020 14:53:33 +0200
|
||||
Subject: [PATCH] core: str - helper macro to set ending zero with backup and
|
||||
restore from backup
|
||||
|
||||
---
|
||||
src/core/str.h | 57 ++++++++++++++++++++++++++++++++++++++++-----------------
|
||||
1 file changed, 40 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/src/core/str.h b/src/core/str.h
|
||||
index de226c7..83334b8 100644
|
||||
--- a/src/core/str.h
|
||||
+++ b/src/core/str.h
|
||||
@@ -13,8 +13,8 @@
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
- * You should have received a copy of the GNU General Public License
|
||||
- * along with this program; if not, write to the Free Software
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
@@ -23,23 +23,23 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
-/** @defgroup str_string Counted-Length Strings
|
||||
+/** @defgroup str_string Counted-Length Strings
|
||||
* @{
|
||||
- *
|
||||
+ *
|
||||
* Implementation of counted-length strings. In SER and its modules, strings
|
||||
* are often stored in the ::str structure. In addition to the pointer
|
||||
* pointing to the first character of the string, the structure also contains
|
||||
* the length of the string.
|
||||
- *
|
||||
+ *
|
||||
* @section motivation Motivation
|
||||
* Storing the length of the string together with the pointer to the string
|
||||
* has two advantages. First, it makes many string operations faster because
|
||||
* it is not necessary to count the number of characters at runtime. Second,
|
||||
* the pointer can point to arbitrary substrings within a SIP message (which
|
||||
* itself is stored as one long string spanning the whole message) without the
|
||||
- * need to make a zero-terminated copy of it.
|
||||
+ * need to make a zero-terminated copy of it.
|
||||
*
|
||||
- * @section drawbacks Drawbacks
|
||||
+ * @section drawbacks Drawbacks
|
||||
* Note well that the fact that string stored
|
||||
* using this data structure are not zero terminated makes them a little
|
||||
* incovenient to use with many standard libc string functions, because these
|
||||
@@ -49,7 +49,7 @@
|
||||
* characters is considered to be dangerous.
|
||||
*/
|
||||
|
||||
-/** @file
|
||||
+/** @file
|
||||
* This header field defines the ::str data structure that is used across
|
||||
* SER sources to store counted-length strings. The file also defines several
|
||||
* convenience macros.
|
||||
@@ -91,13 +91,13 @@ typedef struct _str str;
|
||||
#define STR_NULL {0, 0}
|
||||
|
||||
/** Formats ::str string for use in printf-like functions.
|
||||
- * This is a macro that prepares a ::str string for use in functions which
|
||||
- * use printf-like formatting strings. This macro is necessary because
|
||||
- * ::str strings do not have to be zero-terminated and thus it is necessary
|
||||
- * to provide printf-like functions with the number of characters in the
|
||||
- * string manually. Here is an example how to use the macro:
|
||||
- * \code printf("%.*s\n", STR_FMT(var));\endcode Note well that the correct
|
||||
- * sequence in the formatting string is %.*, see the man page of printf for
|
||||
+ * This is a macro that prepares a ::str string for use in functions which
|
||||
+ * use printf-like formatting strings. This macro is necessary because
|
||||
+ * ::str strings do not have to be zero-terminated and thus it is necessary
|
||||
+ * to provide printf-like functions with the number of characters in the
|
||||
+ * string manually. Here is an example how to use the macro:
|
||||
+ * \code printf("%.*s\n", STR_FMT(var));\endcode Note well that the correct
|
||||
+ * sequence in the formatting string is %.*, see the man page of printf for
|
||||
* more details.
|
||||
*/
|
||||
#define STR_FMT(_pstr_) \
|
||||
@@ -106,8 +106,8 @@ typedef struct _str str;
|
||||
|
||||
|
||||
/** Compares two ::str strings.
|
||||
- * This macro implements comparison of two strings represented using ::str
|
||||
- * structures. First it compares the lengths of both string and if and only
|
||||
+ * This macro implements comparison of two strings represented using ::str
|
||||
+ * structures. First it compares the lengths of both string and if and only
|
||||
* if they are same then both strings are compared using memcmp.
|
||||
* @param x is first string to be compared
|
||||
* @param y is second string to be compared
|
||||
@@ -116,6 +116,29 @@ typedef struct _str str;
|
||||
#define STR_EQ(x,y) (((x).len == (y).len) && \
|
||||
(memcmp((x).s, (y).s, (x).len) == 0))
|
||||
|
||||
+/**
|
||||
+ * If c != '\0', backup c in v and set c = '\0'
|
||||
+ * - useful to terminate str->s with '\0' (if not already '\0'), keeping original
|
||||
+ * value in v, to be able to restore with STR_ZTOV(...)
|
||||
+ */
|
||||
+#define STR_VTOZ(c,v) do { \
|
||||
+ v = '\0'; \
|
||||
+ if(c!='\0') { \
|
||||
+ v = c; \
|
||||
+ c = '\0'; \
|
||||
+ } \
|
||||
+ } while(0)
|
||||
+
|
||||
+/**
|
||||
+ * If v != '\0', set c = v
|
||||
+ * - restore original value after using STR_VTOZ(...)
|
||||
+ */
|
||||
+#define STR_ZTOV(c,v) do { \
|
||||
+ if (v != '\0') { \
|
||||
+ c = v; \
|
||||
+ } \
|
||||
+ }
|
||||
+
|
||||
/** @} */
|
||||
|
||||
/** Appends a sufffix
|
||||
@ -0,0 +1,118 @@
|
||||
From: Victor Seva <linuxmaniac@torreviejawireless.org>
|
||||
Date: Thu, 14 May 2020 10:41:06 +0200
|
||||
Subject: [PATCH] jansson: use the core macros for ending string value with
|
||||
'\0' and to restore
|
||||
|
||||
---
|
||||
src/modules/jansson/jansson_funcs.c | 35 +++++++++++++++++++----------------
|
||||
1 file changed, 19 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/src/modules/jansson/jansson_funcs.c b/src/modules/jansson/jansson_funcs.c
|
||||
index 7eceae4..a5f8b1f 100644
|
||||
--- a/src/modules/jansson/jansson_funcs.c
|
||||
+++ b/src/modules/jansson/jansson_funcs.c
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
#include "../../core/mod_fix.h"
|
||||
#include "../../core/lvalue.h"
|
||||
+#include "../../core/str.h"
|
||||
|
||||
#include "jansson_path.h"
|
||||
#include "jansson_funcs.h"
|
||||
@@ -33,13 +34,13 @@
|
||||
|
||||
int janssonmod_get_helper(sip_msg_t* msg, str *path_s, str *src_s, pv_spec_t *dst_pv)
|
||||
{
|
||||
-
|
||||
+ char c;
|
||||
pv_value_t dst_val;
|
||||
json_t* json = NULL;
|
||||
json_error_t parsing_error;
|
||||
-
|
||||
+ STR_VTOZ(src_s->s[src_s->len], c);
|
||||
json = json_loads(src_s->s, JSON_REJECT_DUPLICATES, &parsing_error);
|
||||
-
|
||||
+ STR_ZTOV(src_s->s[src_s->len], c);
|
||||
if(!json) {
|
||||
ERR("failed to parse json: %.*s\n", src_s->len, src_s->s);
|
||||
ERR("json error at line %d, col %d: %s\n",
|
||||
@@ -98,7 +99,7 @@ int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in,
|
||||
str type_s;
|
||||
str value_s;
|
||||
str path_s;
|
||||
-
|
||||
+ char c;
|
||||
pv_spec_t* result_pv;
|
||||
pv_value_t result_val;
|
||||
|
||||
@@ -126,14 +127,11 @@ int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in,
|
||||
result_val.rs.len = strlen("{}");
|
||||
}
|
||||
|
||||
-/*
|
||||
- ALERT("type is: %.*s\n", type_s.len, type_s.s);
|
||||
- ALERT("path is: %.*s\n", path_s.len, path_s.s);
|
||||
- ALERT("value is: %.*s\n", value_s.len, value_s.s);
|
||||
- ALERT("result is: %.*s\n", result_val.rs.len, result_val.rs.s);
|
||||
-*/
|
||||
|
||||
- char* result = result_val.rs.s;
|
||||
+ LM_DBG("type is: %.*s\n", type_s.len, type_s.s);
|
||||
+ LM_DBG("path is: %.*s\n", path_s.len, path_s.s);
|
||||
+ LM_DBG("value is: %.*s\n", value_s.len, value_s.s);
|
||||
+ LM_DBG("result is: %.*s\n", result_val.rs.len, result_val.rs.s);
|
||||
|
||||
json_t* result_json = NULL;
|
||||
json_t* value = NULL;
|
||||
@@ -143,14 +141,18 @@ int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in,
|
||||
|
||||
/* check the type */
|
||||
if(STR_EQ_STATIC(type_s, "object") || STR_EQ_STATIC(type_s, "obj")){
|
||||
+ STR_VTOZ(value_s.s[value_s.len], c);
|
||||
value = json_loads(value_s.s, JSON_REJECT_DUPLICATES, &parsing_error);
|
||||
+ STR_ZTOV(value_s.s[value_s.len], c);
|
||||
if(value && !json_is_object(value)) {
|
||||
ERR("value to add is not an object - \"%s\"\n", path_s.s);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
}else if(STR_EQ_STATIC(type_s, "array")) {
|
||||
+ STR_VTOZ(value_s.s[value_s.len], c);
|
||||
value = json_loads(value_s.s, JSON_REJECT_DUPLICATES, &parsing_error);
|
||||
+ STR_ZTOV(value_s.s[value_s.len], c);
|
||||
if(value && !json_is_array(value)) {
|
||||
ERR("value to add is not an array - \"%s\"\n", path_s.s);
|
||||
goto fail;
|
||||
@@ -211,9 +213,9 @@ int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in,
|
||||
}
|
||||
|
||||
char* path = path_s.s;
|
||||
-
|
||||
- result_json = json_loads(result, JSON_REJECT_DUPLICATES, &parsing_error);
|
||||
-
|
||||
+ STR_VTOZ(result_val.rs.s[result_val.rs.len], c);
|
||||
+ result_json = json_loads(result_val.rs.s, JSON_REJECT_DUPLICATES, &parsing_error);
|
||||
+ STR_ZTOV(result_val.rs.s[result_val.rs.len], c);
|
||||
if(!result_json) {
|
||||
ERR("result has json error at line %d: %s\n",
|
||||
parsing_error.line, parsing_error.text);
|
||||
@@ -240,6 +242,7 @@ fail:
|
||||
|
||||
int janssonmod_array_size(struct sip_msg* msg, char* path_in, char* src_in, char* dst)
|
||||
{
|
||||
+ char c;
|
||||
str src_s;
|
||||
str path_s;
|
||||
pv_spec_t *dst_pv;
|
||||
@@ -259,9 +262,9 @@ int janssonmod_array_size(struct sip_msg* msg, char* path_in, char* src_in, char
|
||||
|
||||
json_t* json = NULL;
|
||||
json_error_t parsing_error;
|
||||
-
|
||||
+ STR_VTOZ(src_s.s[src_s.len], c);
|
||||
json = json_loads(src_s.s, JSON_REJECT_DUPLICATES, &parsing_error);
|
||||
-
|
||||
+ STR_ZTOV(src_s.s[src_s.len], c);
|
||||
if(!json) {
|
||||
ERR("json error at line %d: %s\n",
|
||||
parsing_error.line, parsing_error.text);
|
||||
Loading…
Reference in new issue