118 lines
8.7 KiB
C
118 lines
8.7 KiB
C
/*
|
|
* 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
|