Mod aaa-12 修改内存泄漏等问题

RCA:
SOL:
修改人:chenling
检视人:
This commit is contained in:
ChenLing 2019-07-19 16:21:16 +08:00
parent ba9071680a
commit 94e8b2d887
2 changed files with 42 additions and 13 deletions

View File

@ -21,7 +21,7 @@ typedef struct {
}localportal_configure_t; }localportal_configure_t;
/*全局变量初始化 失败为1 成功为0*/ /*全局变量初始化 失败为1 成功为0*/
int localportalInit(localportal_configure_t *localportal); int localportalInit(localportal_configure_t **localportal);
/*检查IP地址是否有效端口号是否被占用 */ /*检查IP地址是否有效端口号是否被占用 */

View File

@ -11,10 +11,10 @@
localportal_configure_t *localportal; localportal_configure_t *localportal;
/*全局变量初始化 失败为1 成功为0*/ /*全局变量初始化 失败为1 成功为0*/
int localportalInit(localportal_configure_t *localportal) int localportalInit(localportal_configure_t **localportal)
{ {
localportal = (localportal_configure_t *)malloc(sizeof * localportal); *localportal = (localportal_configure_t *)malloc(sizeof(localportal_configure_t));
if (NULL == localportal) if (NULL == *localportal)
{ {
return 1; return 1;
} }
@ -68,11 +68,13 @@ int _valid_ipv4_port(const char *str, int port)
else if (ret < 0) else if (ret < 0)
{ {
fprintf(stderr, "EAFNOSUPPORT: %s\n", strerror(local_errno)); fprintf(stderr, "EAFNOSUPPORT: %s\n", strerror(local_errno));
close(fd);
return -1; return -1;
} }
else else
{ {
fprintf(stderr, "\"%s\" is not a vaild IPv4 address\n", str); fprintf(stderr, "\"%s\" is not a vaild IPv4 address\n", str);
close(fd);
return -1; return -1;
} }
} }
@ -105,21 +107,27 @@ ret_code portalserver_config_chk(uint source, uint *config_type,
rpc_log_info("localport configure: ip: %d port: %d\n", rpc_log_info("localport configure: ip: %d port: %d\n",
struct_portal->ip,struct_portal->port); 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; ret = RET_INPUTERR;
return ret;
} }
char str[32]; char str[32];
memset(str, 0, 32);
inet_ntop(AF_INET, (void *)&struct_portal->ip, str, 32); inet_ntop(AF_INET, (void *)&struct_portal->ip, str, 32);
char *ip_addr = str; char *ip_addr = str;
if( (_valid_ipv4_port(ip_addr, struct_portal->port)) < 0 ) if( (_valid_ipv4_port(ip_addr, struct_portal->port)) < 0 )
{ {
ret = RET_ERR; ret = RET_ERR;
return ret;
} }
ASSERT_RET(ret); ASSERT_RET(ret);
cJSON_Delete(cjson);
free(struct_portal);
return RET_OK; return RET_OK;
} }
@ -132,7 +140,7 @@ ret_code portalserver_config_proc(uint source, uint config_type,
ret_code ret = RET_OK; ret_code ret = RET_OK;
cJSON *cjson, *res; cJSON *cjson, *res;
char * ret_char = NULL; char * ret_char = NULL;
int * ret_int = NULL; unsigned int ret_int = 0;
/*JSON字符串到JSON格式 */ /*JSON字符串到JSON格式 */
cjson = cJSON_Parse(input); 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); s2j_struct_get_basic_element(struct_portal, cjson, int, port);
char str[32]; char str[32];
memset(str, 0, 32);
inet_ntop(AF_INET, (void *)&struct_portal->ip, str, 32); inet_ntop(AF_INET, (void *)&struct_portal->ip, str, 32);
char *ip_addr = str; char *ip_addr = str;
rpc_log_info("portalserver configure: ip: %s port: %d\n", 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(); res = cJSON_CreateObject();
if(!res) if(!res)
{ {
free(struct_portal);
ret = RET_ERR; ret = RET_ERR;
ASSERT_RET(ret); ASSERT_RET(ret);
return ret; return ret;
@ -172,15 +182,34 @@ ret_code portalserver_config_proc(uint source, uint config_type,
/*将json对象转换成json字符串 */ /*将json对象转换成json字符串 */
ret_char = cJSON_PrintUnformatted(res); ret_char = cJSON_PrintUnformatted(res);
ret_int = (int*)ret_char; ret_int = strlen(ret_char);
memcpy(output, ret_int, sizeof(ret_int)+1);
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); free(ret_char);
cJSON_Delete(res); cJSON_Delete(res);
/*把本地Portal server的配置信息存入全局变量 */ /*把本地Portal server的配置信息存入全局变量 */
localportal = struct_portal; localportal->ip = struct_portal->ip;
localportal->port = struct_portal->port;
free(struct_portal);
return RET_OK; return RET_OK;
} }