1 /* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2014-2018. All rights reserved. 3 * Description: Define internal used macro and data type. The marco of SECUREC_ON_64BITS 4 * will be determined in this header file, which is a switch for part 5 * of code. Some macro are used to supress warning by MS compiler. 6 * Author: lishunda 7 * Create: 2014-02-25 8 * Notes: User can change the value of SECUREC_STRING_MAX_LEN and SECUREC_MEM_MAX_LEN 9 * macro to meet their special need, but The maximum value should not exceed 2G. 10 * History: 2018-09-27 zhaozhijian Code base quality improvement 11 */ 12 /* 13 * [Standardize-exceptions]: Performance-sensitive 14 * [reason]: Strict parameter verification has been done before use 15 */ 16 17 #ifndef __SECURECTYPE_H__A7BBB686_AADA_451B_B9F9_44DACDAE18A7 18 #define __SECURECTYPE_H__A7BBB686_AADA_451B_B9F9_44DACDAE18A7 19 20 #ifndef SECUREC_USING_STD_SECURE_LIB 21 #if defined(_MSC_VER) && _MSC_VER >= 1400 22 #if defined(__STDC_WANT_SECURE_LIB__) && __STDC_WANT_SECURE_LIB__ == 0 23 /* Security functions have been provided since vs2005, default use of system library functions */ 24 #define SECUREC_USING_STD_SECURE_LIB 0 25 #else 26 #define SECUREC_USING_STD_SECURE_LIB 1 27 #endif 28 #else 29 #define SECUREC_USING_STD_SECURE_LIB 0 30 #endif 31 #endif 32 33 34 /* Compatibility with older Secure C versions, shielding VC symbol redefinition warning */ 35 #if defined(_MSC_VER) && _MSC_VER >= 1400 && SECUREC_USING_STD_SECURE_LIB == 0 36 #ifndef SECUREC_DISABLE_CRT_FUNC 37 #define SECUREC_DISABLE_CRT_FUNC 1 38 #endif 39 #ifndef SECUREC_DISABLE_CRT_IMP 40 #define SECUREC_DISABLE_CRT_IMP 1 41 #endif 42 #else /* MSC VER */ 43 #ifndef SECUREC_DISABLE_CRT_FUNC 44 #define SECUREC_DISABLE_CRT_FUNC 0 45 #endif 46 #ifndef SECUREC_DISABLE_CRT_IMP 47 #define SECUREC_DISABLE_CRT_IMP 0 48 #endif 49 #endif 50 51 #if SECUREC_DISABLE_CRT_FUNC 52 #ifdef __STDC_WANT_SECURE_LIB__ 53 #undef __STDC_WANT_SECURE_LIB__ 54 #endif 55 #define __STDC_WANT_SECURE_LIB__ 0 56 #endif 57 58 #if SECUREC_DISABLE_CRT_IMP 59 #ifdef _CRTIMP_ALTERNATIVE 60 #undef _CRTIMP_ALTERNATIVE 61 #endif 62 #define _CRTIMP_ALTERNATIVE /* Comment microsoft *_s function */ 63 #endif 64 65 /* Compile in kernel under macro control */ 66 #ifndef SECUREC_IN_KERNEL 67 #ifdef __KERNEL__ 68 #define SECUREC_IN_KERNEL 1 69 #else 70 #define SECUREC_IN_KERNEL 0 71 #endif 72 #endif 73 74 #if SECUREC_IN_KERNEL 75 #ifndef SECUREC_ENABLE_SCANF_FILE 76 #define SECUREC_ENABLE_SCANF_FILE 0 77 #endif 78 #ifndef SECUREC_ENABLE_WCHAR_FUNC 79 #define SECUREC_ENABLE_WCHAR_FUNC 0 80 #endif 81 #else /* SECUREC_IN_KERNEL */ 82 #ifndef SECUREC_ENABLE_SCANF_FILE 83 #define SECUREC_ENABLE_SCANF_FILE 1 84 #endif 85 #ifndef SECUREC_ENABLE_WCHAR_FUNC 86 #define SECUREC_ENABLE_WCHAR_FUNC 1 87 #endif 88 #endif 89 90 91 /* Default secure function declaration, default declarations for non-standard functions */ 92 #ifndef SECUREC_SNPRINTF_TRUNCATED 93 #define SECUREC_SNPRINTF_TRUNCATED 1 94 #endif 95 96 #if SECUREC_USING_STD_SECURE_LIB 97 #if defined(_MSC_VER) && _MSC_VER >= 1400 98 /* Declare secure functions that are not available in the VS compiler */ 99 #ifndef SECUREC_ENABLE_MEMSET 100 #define SECUREC_ENABLE_MEMSET 1 101 #endif 102 /* VS 2005 have vsnprintf_s function */ 103 #ifndef SECUREC_ENABLE_VSNPRINTF 104 #define SECUREC_ENABLE_VSNPRINTF 0 105 #endif 106 #ifndef SECUREC_ENABLE_SNPRINTF 107 /* VS 2005 have vsnprintf_s function Adapt the snprintf_s of the security function */ 108 #define snprintf_s _snprintf_s 109 #define SECUREC_ENABLE_SNPRINTF 0 110 #endif 111 /* Before VS 2010 do not have v functions */ 112 #if _MSC_VER <= 1600 || defined(SECUREC_FOR_V_SCANFS) 113 #ifndef SECUREC_ENABLE_VFSCANF 114 #define SECUREC_ENABLE_VFSCANF 1 115 #endif 116 #ifndef SECUREC_ENABLE_VSCANF 117 #define SECUREC_ENABLE_VSCANF 1 118 #endif 119 #ifndef SECUREC_ENABLE_VSSCANF 120 #define SECUREC_ENABLE_VSSCANF 1 121 #endif 122 #endif 123 124 #else /* MSC VER */ 125 #ifndef SECUREC_ENABLE_MEMSET 126 #define SECUREC_ENABLE_MEMSET 0 127 #endif 128 #ifndef SECUREC_ENABLE_SNPRINTF 129 #define SECUREC_ENABLE_SNPRINTF 0 130 #endif 131 #ifndef SECUREC_ENABLE_VSNPRINTF 132 #define SECUREC_ENABLE_VSNPRINTF 0 133 #endif 134 #endif 135 136 #ifndef SECUREC_ENABLE_MEMMOVE 137 #define SECUREC_ENABLE_MEMMOVE 0 138 #endif 139 #ifndef SECUREC_ENABLE_MEMCPY 140 #define SECUREC_ENABLE_MEMCPY 0 141 #endif 142 #ifndef SECUREC_ENABLE_STRCPY 143 #define SECUREC_ENABLE_STRCPY 0 144 #endif 145 #ifndef SECUREC_ENABLE_STRNCPY 146 #define SECUREC_ENABLE_STRNCPY 0 147 #endif 148 #ifndef SECUREC_ENABLE_STRCAT 149 #define SECUREC_ENABLE_STRCAT 0 150 #endif 151 #ifndef SECUREC_ENABLE_STRNCAT 152 #define SECUREC_ENABLE_STRNCAT 0 153 #endif 154 #ifndef SECUREC_ENABLE_SPRINTF 155 #define SECUREC_ENABLE_SPRINTF 0 156 #endif 157 #ifndef SECUREC_ENABLE_VSPRINTF 158 #define SECUREC_ENABLE_VSPRINTF 0 159 #endif 160 #ifndef SECUREC_ENABLE_SSCANF 161 #define SECUREC_ENABLE_SSCANF 0 162 #endif 163 #ifndef SECUREC_ENABLE_VSSCANF 164 #define SECUREC_ENABLE_VSSCANF 0 165 #endif 166 #ifndef SECUREC_ENABLE_SCANF 167 #define SECUREC_ENABLE_SCANF 0 168 #endif 169 #ifndef SECUREC_ENABLE_VSCANF 170 #define SECUREC_ENABLE_VSCANF 0 171 #endif 172 173 #ifndef SECUREC_ENABLE_FSCANF 174 #define SECUREC_ENABLE_FSCANF 0 175 #endif 176 #ifndef SECUREC_ENABLE_VFSCANF 177 #define SECUREC_ENABLE_VFSCANF 0 178 #endif 179 #ifndef SECUREC_ENABLE_STRTOK 180 #define SECUREC_ENABLE_STRTOK 0 181 #endif 182 #ifndef SECUREC_ENABLE_GETS 183 #define SECUREC_ENABLE_GETS 0 184 #endif 185 186 #else /* SECUREC USE STD SECURE LIB */ 187 188 #ifndef SECUREC_ENABLE_MEMSET 189 #define SECUREC_ENABLE_MEMSET 1 190 #endif 191 #ifndef SECUREC_ENABLE_MEMMOVE 192 #define SECUREC_ENABLE_MEMMOVE 1 193 #endif 194 #ifndef SECUREC_ENABLE_MEMCPY 195 #define SECUREC_ENABLE_MEMCPY 1 196 #endif 197 #ifndef SECUREC_ENABLE_STRCPY 198 #define SECUREC_ENABLE_STRCPY 1 199 #endif 200 #ifndef SECUREC_ENABLE_STRNCPY 201 #define SECUREC_ENABLE_STRNCPY 1 202 #endif 203 #ifndef SECUREC_ENABLE_STRCAT 204 #define SECUREC_ENABLE_STRCAT 1 205 #endif 206 #ifndef SECUREC_ENABLE_STRNCAT 207 #define SECUREC_ENABLE_STRNCAT 1 208 #endif 209 #ifndef SECUREC_ENABLE_SPRINTF 210 #define SECUREC_ENABLE_SPRINTF 1 211 #endif 212 #ifndef SECUREC_ENABLE_VSPRINTF 213 #define SECUREC_ENABLE_VSPRINTF 1 214 #endif 215 #ifndef SECUREC_ENABLE_SNPRINTF 216 #define SECUREC_ENABLE_SNPRINTF 1 217 #endif 218 #ifndef SECUREC_ENABLE_VSNPRINTF 219 #define SECUREC_ENABLE_VSNPRINTF 1 220 #endif 221 #ifndef SECUREC_ENABLE_SSCANF 222 #define SECUREC_ENABLE_SSCANF 1 223 #endif 224 #ifndef SECUREC_ENABLE_VSSCANF 225 #define SECUREC_ENABLE_VSSCANF 1 226 #endif 227 #ifndef SECUREC_ENABLE_SCANF 228 #if SECUREC_ENABLE_SCANF_FILE 229 #define SECUREC_ENABLE_SCANF 1 230 #else 231 #define SECUREC_ENABLE_SCANF 0 232 #endif 233 #endif 234 #ifndef SECUREC_ENABLE_VSCANF 235 #if SECUREC_ENABLE_SCANF_FILE 236 #define SECUREC_ENABLE_VSCANF 1 237 #else 238 #define SECUREC_ENABLE_VSCANF 0 239 #endif 240 #endif 241 242 #ifndef SECUREC_ENABLE_FSCANF 243 #if SECUREC_ENABLE_SCANF_FILE 244 #define SECUREC_ENABLE_FSCANF 1 245 #else 246 #define SECUREC_ENABLE_FSCANF 0 247 #endif 248 #endif 249 #ifndef SECUREC_ENABLE_VFSCANF 250 #if SECUREC_ENABLE_SCANF_FILE 251 #define SECUREC_ENABLE_VFSCANF 1 252 #else 253 #define SECUREC_ENABLE_VFSCANF 0 254 #endif 255 #endif 256 257 #ifndef SECUREC_ENABLE_STRTOK 258 #define SECUREC_ENABLE_STRTOK 1 259 #endif 260 #ifndef SECUREC_ENABLE_GETS 261 #define SECUREC_ENABLE_GETS 1 262 #endif 263 #endif /* SECUREC_USE_STD_SECURE_LIB */ 264 265 #if SECUREC_ENABLE_SCANF_FILE == 0 266 #if SECUREC_ENABLE_FSCANF 267 #undef SECUREC_ENABLE_FSCANF 268 #define SECUREC_ENABLE_FSCANF 0 269 #endif 270 #if SECUREC_ENABLE_VFSCANF 271 #undef SECUREC_ENABLE_VFSCANF 272 #define SECUREC_ENABLE_VFSCANF 0 273 #endif 274 #if SECUREC_ENABLE_SCANF 275 #undef SECUREC_ENABLE_SCANF 276 #define SECUREC_ENABLE_SCANF 0 277 #endif 278 #if SECUREC_ENABLE_FSCANF 279 #undef SECUREC_ENABLE_FSCANF 280 #define SECUREC_ENABLE_FSCANF 0 281 #endif 282 283 #endif 284 285 #if SECUREC_IN_KERNEL 286 #include <linux/kernel.h> 287 #include <linux/module.h> 288 #else 289 #ifndef SECUREC_HAVE_STDIO_H 290 #define SECUREC_HAVE_STDIO_H 1 291 #endif 292 #ifndef SECUREC_HAVE_STRING_H 293 #define SECUREC_HAVE_STRING_H 1 294 #endif 295 #ifndef SECUREC_HAVE_STDLIB_H 296 #define SECUREC_HAVE_STDLIB_H 1 297 #endif 298 #if SECUREC_HAVE_STDIO_H 299 #include <stdio.h> 300 #endif 301 #if SECUREC_HAVE_STRING_H 302 #include <string.h> 303 #endif 304 #if SECUREC_HAVE_STDLIB_H 305 #include <stdlib.h> 306 #endif 307 #endif 308 309 /* 310 * If you need high performance, enable the SECUREC_WITH_PERFORMANCE_ADDONS macro, default is enable. 311 * The macro is automatically closed on the windows platform and linux kernel 312 */ 313 #ifndef SECUREC_WITH_PERFORMANCE_ADDONS 314 #if SECUREC_IN_KERNEL 315 #define SECUREC_WITH_PERFORMANCE_ADDONS 0 316 #else 317 #define SECUREC_WITH_PERFORMANCE_ADDONS 0 318 #endif 319 #endif 320 321 /* If enable SECUREC_COMPATIBLE_WIN_FORMAT, the output format will be compatible to Windows. */ 322 #if (defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER)) && !defined(SECUREC_COMPATIBLE_LINUX_FORMAT) 323 #ifndef SECUREC_COMPATIBLE_WIN_FORMAT 324 #define SECUREC_COMPATIBLE_WIN_FORMAT 325 #endif 326 #endif 327 328 #if defined(SECUREC_COMPATIBLE_WIN_FORMAT) 329 /* On windows platform, can't use optimized function for there is no __builtin_constant_p like function */ 330 /* If need optimized macro, can define this: define __builtin_constant_p(x) 0 */ 331 #ifdef SECUREC_WITH_PERFORMANCE_ADDONS 332 #undef SECUREC_WITH_PERFORMANCE_ADDONS 333 #define SECUREC_WITH_PERFORMANCE_ADDONS 0 334 #endif 335 #endif 336 337 #if defined(__VXWORKS__) || defined(__vxworks) || defined(__VXWORKS) || defined(_VXWORKS_PLATFORM_) || \ 338 defined(SECUREC_VXWORKS_VERSION_5_4) 339 #ifndef SECUREC_VXWORKS_PLATFORM 340 #define SECUREC_VXWORKS_PLATFORM 341 #endif 342 #endif 343 344 /* If enable SECUREC_COMPATIBLE_LINUX_FORMAT, the output format will be compatible to Linux. */ 345 #if !defined(SECUREC_COMPATIBLE_WIN_FORMAT) && !defined(SECUREC_VXWORKS_PLATFORM) 346 #ifndef SECUREC_COMPATIBLE_LINUX_FORMAT 347 #define SECUREC_COMPATIBLE_LINUX_FORMAT 348 #endif 349 #endif 350 351 #ifdef SECUREC_COMPATIBLE_LINUX_FORMAT 352 #ifndef SECUREC_HAVE_STDDEF_H 353 #define SECUREC_HAVE_STDDEF_H 1 354 #endif 355 /* Some system may no stddef.h */ 356 #if SECUREC_HAVE_STDDEF_H 357 #include <stddef.h> 358 #endif 359 #endif 360 361 /* 362 * Add the -DSECUREC_SUPPORT_FORMAT_WARNING compiler option to supoort -Wformat. 363 * Default does not check the format is that the same data type in the actual code. 364 * In the product is different in the original data type definition of VxWorks and Linux. 365 */ 366 #ifndef SECUREC_SUPPORT_FORMAT_WARNING 367 #define SECUREC_SUPPORT_FORMAT_WARNING 0 368 #endif 369 370 /* SECUREC_PCLINT for tool do not recognize __attribute__ just for pclint */ 371 #if SECUREC_SUPPORT_FORMAT_WARNING && !defined(SECUREC_PCLINT) 372 #define SECUREC_ATTRIBUTE(x, y) __attribute__((format(printf, (x), (y)))) 373 #else 374 #define SECUREC_ATTRIBUTE(x, y) 375 #endif 376 377 /* SECUREC_PCLINT for tool do not recognize __builtin_expect, just for pclint */ 378 #if defined(__GNUC__) && \ 379 ((__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3))) && \ 380 !defined(SECUREC_PCLINT) 381 /* 382 * This is a built-in function that can be used without a declaration, if you encounter an undeclared compilation alarm, 383 * you can add -DSECUREC_NEED_BUILTIN_EXPECT_DECLARE to complier options 384 */ 385 #ifdef SECUREC_NEED_BUILTIN_EXPECT_DECLARE 386 long __builtin_expect(long exp, long c); 387 #endif 388 #define SECUREC_LIKELY(x) __builtin_expect(!!(x), 1) 389 #define SECUREC_UNLIKELY(x) __builtin_expect(!!(x), 0) 390 #else 391 #define SECUREC_LIKELY(x) (x) 392 #define SECUREC_UNLIKELY(x) (x) 393 #endif 394 395 /* Define the max length of the string */ 396 #ifndef SECUREC_STRING_MAX_LEN 397 #define SECUREC_STRING_MAX_LEN 0x7fffffffUL 398 #endif 399 #define SECUREC_WCHAR_STRING_MAX_LEN (SECUREC_STRING_MAX_LEN / sizeof(wchar_t)) 400 401 /* Add SECUREC_MEM_MAX_LEN for memcpy and memmove */ 402 #ifndef SECUREC_MEM_MAX_LEN 403 #define SECUREC_MEM_MAX_LEN 0x7fffffffUL 404 #endif 405 #define SECUREC_WCHAR_MEM_MAX_LEN (SECUREC_MEM_MAX_LEN / sizeof(wchar_t)) 406 407 #if SECUREC_STRING_MAX_LEN > 0x7fffffff 408 #error "max string is 2G" 409 #endif 410 411 #if (defined(__GNUC__) && defined(__SIZEOF_POINTER__)) 412 #if (__SIZEOF_POINTER__ != 4) && (__SIZEOF_POINTER__ != 8) 413 #error "unsupported system" 414 #endif 415 #endif 416 417 #if defined(_WIN64) || defined(WIN64) || defined(__LP64__) || defined(_LP64) 418 #define SECUREC_ON_64BITS 419 #endif 420 421 #if (!defined(SECUREC_ON_64BITS) && defined(__GNUC__) && defined(__SIZEOF_POINTER__)) 422 #if __SIZEOF_POINTER__ == 8 423 #define SECUREC_ON_64BITS 424 #endif 425 #endif 426 427 #if defined(__SVR4) || defined(__svr4__) 428 #define SECUREC_ON_SOLARIS 429 #endif 430 431 #if (defined(__hpux) || defined(_AIX) || defined(SECUREC_ON_SOLARIS)) 432 #define SECUREC_ON_UNIX 433 #endif 434 435 /* 436 * Codes should run under the macro SECUREC_COMPATIBLE_LINUX_FORMAT in unknow system on default, 437 * and strtold. 438 * The function strtold is referenced first at ISO9899:1999(C99), and some old compilers can 439 * not support these functions. Here provides a macro to open these functions: 440 * SECUREC_SUPPORT_STRTOLD -- If defined, strtold will be used 441 */ 442 #ifndef SECUREC_SUPPORT_STRTOLD 443 #define SECUREC_SUPPORT_STRTOLD 0 444 #if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT)) 445 #if defined(__USE_ISOC99) || \ 446 (defined(_AIX) && defined(_ISOC99_SOURCE)) || \ 447 (defined(__hpux) && defined(__ia64)) || \ 448 (defined(SECUREC_ON_SOLARIS) && (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \ 449 defined(_STDC_C99) || defined(__EXTENSIONS__)) 450 #undef SECUREC_SUPPORT_STRTOLD 451 #define SECUREC_SUPPORT_STRTOLD 1 452 #endif 453 #endif 454 #if ((defined(SECUREC_WRLINUX_BELOW4) || defined(_WRLINUX_BELOW4_))) 455 #undef SECUREC_SUPPORT_STRTOLD 456 #define SECUREC_SUPPORT_STRTOLD 0 457 #endif 458 #endif 459 460 461 #if SECUREC_WITH_PERFORMANCE_ADDONS 462 463 #ifndef SECUREC_TWO_MIN 464 #define SECUREC_TWO_MIN(a, b) ((a) < (b) ? (a) : (b)) 465 #endif 466 467 /* For strncpy_s performance optimization */ 468 #define SECUREC_STRNCPY_SM(dest, destMax, src, count) \ 469 (((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \ 470 (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \ 471 (SECUREC_TWO_MIN((size_t)(count), strlen(src)) + 1) <= (size_t)(destMax)) ? \ 472 (((size_t)(count) < strlen(src)) ? (memcpy((dest), (src), (count)), *((char *)(dest) + (count)) = '\0', EOK) : \ 473 (memcpy((dest), (src), strlen(src) + 1), EOK)) : (strncpy_error((dest), (destMax), (src), (count)))) 474 475 #define SECUREC_STRCPY_SM(dest, destMax, src) \ 476 (((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \ 477 (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \ 478 (strlen(src) + 1) <= (size_t)(destMax)) ? (memcpy((dest), (src), strlen(src) + 1), EOK) : \ 479 (strcpy_error((dest), (destMax), (src)))) 480 481 /* For strcat_s performance optimization */ 482 #if defined(__GNUC__) 483 #define SECUREC_STRCAT_SM(dest, destMax, src) ({ \ 484 int catRet = EOK; \ 485 if ((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \ 486 (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)) { \ 487 char *catTmpDst = (char *)(dest); \ 488 size_t catRestSize = (destMax); \ 489 while (catRestSize > 0 && *catTmpDst != '\0') { \ 490 ++catTmpDst; \ 491 --catRestSize; \ 492 } \ 493 if (catRestSize == 0) { \ 494 catRet = EINVAL; \ 495 } else if ((strlen(src) + 1) <= catRestSize) { \ 496 memcpy(catTmpDst, (src), strlen(src) + 1); \ 497 catRet = EOK; \ 498 } else { \ 499 catRet = ERANGE; \ 500 } \ 501 if (catRet != EOK) { \ 502 catRet = strcat_s((dest), (destMax), (src)); \ 503 } \ 504 } else { \ 505 catRet = strcat_s((dest), (destMax), (src)); \ 506 } \ 507 catRet; \ 508 }) 509 #else 510 #define SECUREC_STRCAT_SM(dest, destMax, src) strcat_s((dest), (destMax), (src)) 511 #endif 512 513 /* For strncat_s performance optimization */ 514 #if defined(__GNUC__) 515 #define SECUREC_STRNCAT_SM(dest, destMax, src, count) ({ \ 516 int ncatRet = EOK; \ 517 if ((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \ 518 (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \ 519 (((unsigned long long)(count) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)) { \ 520 char *ncatTmpDest = (char *)(dest); \ 521 size_t ncatRestSize = (size_t)(destMax); \ 522 while (ncatRestSize > 0 && *ncatTmpDest != '\0') { \ 523 ++ncatTmpDest; \ 524 --ncatRestSize; \ 525 } \ 526 if (ncatRestSize == 0) { \ 527 ncatRet = EINVAL; \ 528 } else if ((SECUREC_TWO_MIN((count), strlen(src)) + 1) <= ncatRestSize) { \ 529 if ((size_t)(count) < strlen(src)) { \ 530 memcpy(ncatTmpDest, (src), (count)); \ 531 *(ncatTmpDest + (count)) = '\0'; \ 532 } else { \ 533 memcpy(ncatTmpDest, (src), strlen(src) + 1); \ 534 } \ 535 } else { \ 536 ncatRet = ERANGE; \ 537 } \ 538 if (ncatRet != EOK) { \ 539 ncatRet = strncat_s((dest), (destMax), (src), (count)); \ 540 } \ 541 } else { \ 542 ncatRet = strncat_s((dest), (destMax), (src), (count)); \ 543 } \ 544 ncatRet; \ 545 }) 546 #else 547 #define SECUREC_STRNCAT_SM(dest, destMax, src, count) strncat_s((dest), (destMax), (src), (count)) 548 #endif 549 550 /* This macro do not check buffer overlap by default */ 551 #define SECUREC_MEMCPY_SM(dest, destMax, src, count) \ 552 (!(((size_t)(destMax) == 0) || \ 553 (((unsigned long long)(destMax) & (unsigned long long)(-2)) > SECUREC_MEM_MAX_LEN) || \ 554 ((size_t)(count) > (size_t)(destMax)) || ((void *)(dest)) == NULL || ((void *)(src) == NULL)) ? \ 555 (memcpy((dest), (src), (count)), EOK) : \ 556 (memcpy_s((dest), (destMax), (src), (count)))) 557 558 #define SECUREC_MEMSET_SM(dest, destMax, c, count) \ 559 (!((((unsigned long long)(destMax) & (unsigned long long)(-2)) > SECUREC_MEM_MAX_LEN) || \ 560 ((void *)(dest) == NULL) || ((size_t)(count) > (size_t)(destMax))) ? \ 561 (memset((dest), (c), (count)), EOK) : \ 562 (memset_s((dest), (destMax), (c), (count)))) 563 564 #endif 565 #endif /* __SECURECTYPE_H__A7BBB686_AADA_451B_B9F9_44DACDAE18A7 */ 566 567