From 94e8b2d8876f5a79c87e4cb7dcdaf727acec8e21 Mon Sep 17 00:00:00 2001 From: ChenLing Date: Fri, 19 Jul 2019 16:21:16 +0800 Subject: [PATCH] =?UTF-8?q?Mod=20=20aaa-12=20=E4=BF=AE=E6=94=B9=E5=86=85?= =?UTF-8?q?=E5=AD=98=E6=B3=84=E6=BC=8F=E7=AD=89=E9=97=AE=E9=A2=98=20RCA?= =?UTF-8?q?=EF=BC=9A=20SOL=EF=BC=9A=20=E4=BF=AE=E6=94=B9=E4=BA=BA=EF=BC=9A?= =?UTF-8?q?chenling=20=E6=A3=80=E8=A7=86=E4=BA=BA=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config-server/include/localportal.h | 2 +- .../localportal_config/localportal.c | 53 ++++++++++++++----- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/Platform/user/configm/config-server/include/localportal.h b/Platform/user/configm/config-server/include/localportal.h index d9e7f6e06..cc843e87b 100644 --- a/Platform/user/configm/config-server/include/localportal.h +++ b/Platform/user/configm/config-server/include/localportal.h @@ -21,7 +21,7 @@ typedef struct { }localportal_configure_t; /*全局变量初始化 失败为1 成功为0*/ -int localportalInit(localportal_configure_t *localportal); +int localportalInit(localportal_configure_t **localportal); /*检查IP地址是否有效,端口号是否被占用 */ diff --git a/Platform/user/configm/config-server/localportal_config/localportal.c b/Platform/user/configm/config-server/localportal_config/localportal.c index aab5c40da..371a5c427 100644 --- a/Platform/user/configm/config-server/localportal_config/localportal.c +++ b/Platform/user/configm/config-server/localportal_config/localportal.c @@ -11,10 +11,10 @@ localportal_configure_t *localportal; /*全局变量初始化 失败为1 成功为0*/ -int localportalInit(localportal_configure_t *localportal) +int localportalInit(localportal_configure_t **localportal) { - localportal = (localportal_configure_t *)malloc(sizeof * localportal); - if (NULL == localportal) + *localportal = (localportal_configure_t *)malloc(sizeof(localportal_configure_t)); + if (NULL == *localportal) { return 1; } @@ -66,13 +66,15 @@ int _valid_ipv4_port(const char *str, int port) } else if (ret < 0) - { + { fprintf(stderr, "EAFNOSUPPORT: %s\n", strerror(local_errno)); + close(fd); return -1; } else { fprintf(stderr, "\"%s\" is not a vaild IPv4 address\n", str); + close(fd); return -1; } } @@ -90,7 +92,7 @@ ret_code portalserver_config_chk(uint source, uint *config_type, /*JSON字符串到JSON格式 */ cjson = cJSON_Parse(input); if(!cjson) - { + { ret = RET_INPUTERR; ASSERT_RET(ret); return ret; @@ -105,20 +107,26 @@ ret_code portalserver_config_chk(uint source, uint *config_type, rpc_log_info("localport configure: ip: %d port: %d\n", struct_portal->ip,struct_portal->port); - if(*input_len < sizeof(localportal_configure_t) ) + if((*input_len < sizeof(localportal_configure_t)) || (*input_len > sizeof(localportal_configure_t)) ) { ret = RET_INPUTERR; + return ret; } - + char str[32]; + memset(str, 0, 32); inet_ntop(AF_INET, (void *)&struct_portal->ip, str, 32); char *ip_addr = str; if( (_valid_ipv4_port(ip_addr, struct_portal->port)) < 0 ) { ret = RET_ERR; + return ret; } ASSERT_RET(ret); + + cJSON_Delete(cjson); + free(struct_portal); return RET_OK; } @@ -132,7 +140,7 @@ ret_code portalserver_config_proc(uint source, uint config_type, ret_code ret = RET_OK; cJSON *cjson, *res; char * ret_char = NULL; - int * ret_int = NULL; + unsigned int ret_int = 0; /*JSON字符串到JSON格式 */ cjson = cJSON_Parse(input); @@ -151,6 +159,7 @@ ret_code portalserver_config_proc(uint source, uint config_type, s2j_struct_get_basic_element(struct_portal, cjson, int, port); char str[32]; + memset(str, 0, 32); inet_ntop(AF_INET, (void *)&struct_portal->ip, str, 32); char *ip_addr = str; rpc_log_info("portalserver configure: ip: %s port: %d\n", @@ -163,6 +172,7 @@ ret_code portalserver_config_proc(uint source, uint config_type, res = cJSON_CreateObject(); if(!res) { + free(struct_portal); ret = RET_ERR; ASSERT_RET(ret); return ret; @@ -171,16 +181,35 @@ ret_code portalserver_config_proc(uint source, uint config_type, cJSON_AddNumberToObject(res, "result", r); /*将json对象转换成json字符串 */ - ret_char = cJSON_PrintUnformatted(res); - ret_int = (int*)ret_char; - memcpy(output, ret_int, sizeof(ret_int)+1); + ret_char = cJSON_PrintUnformatted(res); + ret_int = strlen(ret_char); + + if(output_len) + { + *output_len = ret_int; + } + + /*超出2k的内存,报错 */ + if(ret_int >= 1024 * 2) + { + free(struct_portal); + free(ret_char); + cJSON_Delete(res); + return RET_NOMEM; + } + + memcpy(output, 0, ret_int + 1); + strcpy(output, ret_char); free(ret_char); cJSON_Delete(res); /*把本地Portal server的配置信息存入全局变量 */ - localportal = struct_portal; + localportal->ip = struct_portal->ip; + localportal->port = struct_portal->port; + + free(struct_portal); return RET_OK; }