Преглед изворни кода

jsonrpc-s: auto-convert int to str if required by scanning spec

- check if there spec string has still mandatory chars
Daniel-Constantin Mierla пре 11 година
родитељ
комит
09cff24f44
1 измењених фајлова са 35 додато и 3 уклоњено
  1. 35 3
      modules/jsonrpc-s/jsonrpc-s_mod.c

+ 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;
 	char* orig_fmt;
 	va_list ap;
+	str stmp;
 
 	if(ctx->req_node==NULL)
 		return 0;
@@ -434,12 +435,39 @@ static int jsonrpc_scan(jsonrpc_ctx_t* ctx, char* fmt, ...)
 			break;
 		case 's': /* zero terminated string */
 			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;
 		case 'S': /* str structure */
 			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;
 		case '{':
 		case '[':
@@ -456,6 +484,10 @@ static int jsonrpc_scan(jsonrpc_ctx_t* ctx, char* fmt, ...)
 		auto_convert = 0;
 		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);
 	return (int)(fmt-orig_fmt)-modifiers;
 error: