Files
openGauss-server/src/include/securec_check.h
2020-06-30 17:38:27 +08:00

118 lines
8.7 KiB
C
Executable File

/*
* Copyright (c) 2020 Huawei Technologies Co.,Ltd.
*
* openGauss is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* ---------------------------------------------------------------------------------------
*
* securec_check.h
*
*
*
* IDENTIFICATION
* src/include/securec_check.h
*
* ---------------------------------------------------------------------------------------
*/
#ifndef _SECUREC_CHECK_H_
#define _SECUREC_CHECK_H_
#include "securectype.h"
#include <stdarg.h>
/* free space for error function operator with exit-function mechanism */
#define freeSecurityFuncSpace_c(str1, str2) \
{ \
if (str1 != NULL && strlen(str1) > 0) \
free((char*)str1); \
if (str2 != NULL && strlen(str2) > 0) \
free((char*)str2); \
}
#ifndef GDS_SERVER
/* gds using gds_securec_check and gds_securec_check_ss */
#define securec_check_c(errno, str1, str2) \
{ \
errno_t e_for_securec_check_c = (errno); \
if (EOK != e_for_securec_check_c) { \
freeSecurityFuncSpace_c(str1, str2); \
switch (e_for_securec_check_c) { \
case EINVAL: \
printf("ERROR at %s : %d : The destination buffer is NULL or not terminated. The second case " \
"only occures in function strcat_s/strncat_s.\n", \
__FILE__, \
__LINE__); \
break; \
case EINVAL_AND_RESET: \
printf("ERROR at %s : %d : The source buffer is NULL.\n", __FILE__, __LINE__); \
break; \
case ERANGE: \
printf("ERROR at %s : %d : The parameter destMax is equal to zero or larger than the macro : " \
"SECUREC_STRING_MAX_LEN.\n", \
__FILE__, \
__LINE__); \
break; \
case ERANGE_AND_RESET: \
printf("ERROR at %s : %d : The parameter destMax is too small or parameter count is larger than " \
"macro parameter SECUREC_STRING_MAX_LEN. The second case only occures in functions " \
"strncat_s/strncpy_s.\n", \
__FILE__, \
__LINE__); \
break; \
case EOVERLAP_AND_RESET: \
printf("ERROR at %s : %d : The destination buffer and source buffer are overlapped.\n", \
__FILE__, \
__LINE__); \
break; \
default: \
printf("ERROR at %s : %d : Unrecognized return type.\n", __FILE__, __LINE__); \
break; \
} \
exit(1); \
} \
}
#define securec_check_ss_c(errno, str1, str2) \
do { \
if (errno == -1) { \
freeSecurityFuncSpace_c(str1, str2); \
printf("ERROR at %s : %d : The destination buffer or format is a NULL pointer or the invalid parameter " \
"handle is invoked..\n", \
__FILE__, \
__LINE__); \
exit(1); \
} \
} while (0)
#endif
/* define a macro about the return value of security function */
#define securec_check_intval_core(val, express) \
if (val == -1) { \
fprintf(stderr, \
"WARNING: %s:%d failed on calling " \
"security function.\n", \
__FILE__, \
__LINE__); \
express; \
}
#define securec_check_for_sscanf_s(ret, min_num, str1, str2) \
do { \
if ((ret) < (min_num)) { \
freeSecurityFuncSpace_c(str1, str2); \
printf("ERROR at %s : %d : The destination buffer or format is a NULL pointer or the invalid parameter " \
"handle is invoked..\n", \
__FILE__, \
__LINE__); \
exit(1); \
} \
} while (0)
#endif