瀏覽代碼

Merge branch 'master' of ssh://git.sip-router.org/kamailio

Hugh Waite 11 年之前
父節點
當前提交
331b0cf3e9
共有 3 個文件被更改,包括 40 次插入7 次删除
  1. 2 1
      lib/srdb1/db_val.h
  2. 35 3
      modules/jsonrpc-s/jsonrpc-s_mod.c
  3. 3 3
      modules/xhttp_pi/xhttp_pi_fnc.c

+ 2 - 1
lib/srdb1/db_val.h

@@ -56,7 +56,8 @@ typedef enum {
 	DB1_STR,        /**< represents a string of 'str' type        */
 	DB1_STR,        /**< represents a string of 'str' type        */
 	DB1_DATETIME,   /**< represents date and time                 */
 	DB1_DATETIME,   /**< represents date and time                 */
 	DB1_BLOB,       /**< represents a large binary object         */
 	DB1_BLOB,       /**< represents a large binary object         */
-	DB1_BITMAP      /**< an one-dimensional array of 32 flags     */
+	DB1_BITMAP,     /**< an one-dimensional array of 32 flags     */
+	DB1_UNKNOWN     /**< represents an unknown type               */
 } db_type_t;
 } db_type_t;
 
 
 
 

+ 35 - 3
modules/jsonrpc-s/jsonrpc-s_mod.c

@@ -404,6 +404,7 @@ static int jsonrpc_scan(jsonrpc_ctx_t* ctx, char* fmt, ...)
 	int auto_convert = 0;
 	int auto_convert = 0;
 	char* orig_fmt;
 	char* orig_fmt;
 	va_list ap;
 	va_list ap;
+	str stmp;
 
 
 	if(ctx->req_node==NULL)
 	if(ctx->req_node==NULL)
 		return 0;
 		return 0;
@@ -434,12 +435,39 @@ static int jsonrpc_scan(jsonrpc_ctx_t* ctx, char* fmt, ...)
 			break;
 			break;
 		case 's': /* zero terminated string */
 		case 's': /* zero terminated string */
 			char_ptr = va_arg(ap, char**);
 			char_ptr = va_arg(ap, char**);
-			*char_ptr = ctx->req_node->valuestring;
+			if(ctx->req_node->type==srjson_String) {
+				*char_ptr = ctx->req_node->valuestring;
+			} else if(auto_convert == 1) {
+				if(ctx->req_node->type==srjson_Number) {
+					*char_ptr = int2str(ctx->req_node->valueint, &stmp.len);
+				} else {
+					*char_ptr = NULL;
+					goto error;
+				}
+			} else {
+				*char_ptr = NULL;
+				goto error;
+			}
 			break;
 			break;
 		case 'S': /* str structure */
 		case 'S': /* str structure */
 			str_ptr = va_arg(ap, str*);
 			str_ptr = va_arg(ap, str*);
-			str_ptr->s = ctx->req_node->valuestring;
-			str_ptr->len = strlen(ctx->req_node->valuestring);
+			if(ctx->req_node->type==srjson_String) {
+				str_ptr->s = ctx->req_node->valuestring;
+				str_ptr->len = strlen(ctx->req_node->valuestring);
+			} else if(auto_convert == 1) {
+				if(ctx->req_node->type==srjson_Number) {
+					str_ptr->s = int2str(ctx->req_node->valueint,
+							&str_ptr->len);
+				} else {
+					str_ptr->s = NULL;
+					str_ptr->len = 0;
+					goto error;
+				}
+			} else {
+				str_ptr->s = NULL;
+				str_ptr->len = 0;
+				goto error;
+			}
 			break;
 			break;
 		case '{':
 		case '{':
 		case '[':
 		case '[':
@@ -456,6 +484,10 @@ static int jsonrpc_scan(jsonrpc_ctx_t* ctx, char* fmt, ...)
 		auto_convert = 0;
 		auto_convert = 0;
 		ctx->req_node = ctx->req_node->next;
 		ctx->req_node = ctx->req_node->next;
 	}
 	}
+	/* error if there is still a scan char type and it is not optional */
+	if(*fmt && mandatory_param==1)
+		goto error;
+
 	va_end(ap);
 	va_end(ap);
 	return (int)(fmt-orig_fmt)-modifiers;
 	return (int)(fmt-orig_fmt)-modifiers;
 error:
 error:

+ 3 - 3
modules/xhttp_pi/xhttp_pi_fnc.c

@@ -570,7 +570,7 @@ int ph_getDbTableCols(ph_db_url_t *ph_db_urls, ph_db_table_t *db_tables,
 			db_tables->cols = cols;
 			db_tables->cols = cols;
 			cols = &db_tables->cols[db_tables->cols_size];
 			cols = &db_tables->cols[db_tables->cols_size];
 			memset(cols, 0, sizeof(ph_table_col_t));
 			memset(cols, 0, sizeof(ph_table_col_t));
-			cols->type=-1;
+			cols->type=DB1_UNKNOWN;
 			/* Populate the field */
 			/* Populate the field */
 			field.s =
 			field.s =
 				ph_xmlNodeGetNodeContentByName(node->children,
 				ph_xmlNodeGetNodeContentByName(node->children,
@@ -683,7 +683,7 @@ int ph_getDbTableCols(ph_db_url_t *ph_db_urls, ph_db_table_t *db_tables,
 				if(strncmp("DB1_DATETIME",val,12)==0)
 				if(strncmp("DB1_DATETIME",val,12)==0)
 					cols->type=DB1_DATETIME;
 					cols->type=DB1_DATETIME;
 			}
 			}
-			if(cols->type==-1){
+			if(cols->type==DB1_UNKNOWN){
 				LM_ERR("unexpected type [%s] for %s %s %s\n",
 				LM_ERR("unexpected type [%s] for %s %s %s\n",
 					val, table_node->name, node->name,
 					val, table_node->name, node->name,
 					XHTTP_PI_XML_TYPE_NODE);
 					XHTTP_PI_XML_TYPE_NODE);
@@ -889,7 +889,7 @@ int ph_getColVals(ph_mod_t *module, ph_cmd_t *cmd,
 			if(vals==NULL||ids==NULL) {LM_ERR("oom\n"); return -1;}
 			if(vals==NULL||ids==NULL) {LM_ERR("oom\n"); return -1;}
 			col_vals = vals; col_ids = ids;
 			col_vals = vals; col_ids = ids;
 			vals = &col_vals[size]; ids = &col_ids[size];
 			vals = &col_vals[size]; ids = &col_ids[size];
-			memset(vals, 0, sizeof(str*)); memset(ids, 0, sizeof(str*));
+			memset(vals, 0, sizeof(str)); memset(ids, 0, sizeof(str));
 			/* Retrieve the node attribute */
 			/* Retrieve the node attribute */
 			attr.s = ph_xmlNodeGetAttrContentByName(node,
 			attr.s = ph_xmlNodeGetAttrContentByName(node,
 							XHTTP_PI_XML_ID_ATTR);
 							XHTTP_PI_XML_ID_ATTR);