13d58139fSopenharmony_ci/* 23d58139fSopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. 33d58139fSopenharmony_ci * Licensed under Mulan PSL v2. 43d58139fSopenharmony_ci * You can use this software according to the terms and conditions of the Mulan PSL v2. 53d58139fSopenharmony_ci * You may obtain a copy of Mulan PSL v2 at: 63d58139fSopenharmony_ci * http://license.coscl.org.cn/MulanPSL2 73d58139fSopenharmony_ci * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 83d58139fSopenharmony_ci * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 93d58139fSopenharmony_ci * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 103d58139fSopenharmony_ci * See the Mulan PSL v2 for more details. 113d58139fSopenharmony_ci * Description: memset_s function 123d58139fSopenharmony_ci * Create: 2014-02-25 133d58139fSopenharmony_ci */ 143d58139fSopenharmony_ci/* 153d58139fSopenharmony_ci * [Standardize-exceptions] Use unsafe function: Portability 163d58139fSopenharmony_ci * [reason] Use unsafe function to implement security function to maintain platform compatibility. 173d58139fSopenharmony_ci * And sufficient input validation is performed before calling 183d58139fSopenharmony_ci */ 193d58139fSopenharmony_ci 203d58139fSopenharmony_ci#include "securecutil.h" 213d58139fSopenharmony_ci 223d58139fSopenharmony_ci#define SECUREC_MEMSET_PARAM_OK(dest, destMax, count) (SECUREC_LIKELY((destMax) <= SECUREC_MEM_MAX_LEN && \ 233d58139fSopenharmony_ci (dest) != NULL && (count) <= (destMax))) 243d58139fSopenharmony_ci 253d58139fSopenharmony_ci#if SECUREC_WITH_PERFORMANCE_ADDONS 263d58139fSopenharmony_ci 273d58139fSopenharmony_ci/* Use union to clear strict-aliasing warning */ 283d58139fSopenharmony_citypedef union { 293d58139fSopenharmony_ci SecStrBuf32 buf32; 303d58139fSopenharmony_ci SecStrBuf31 buf31; 313d58139fSopenharmony_ci SecStrBuf30 buf30; 323d58139fSopenharmony_ci SecStrBuf29 buf29; 333d58139fSopenharmony_ci SecStrBuf28 buf28; 343d58139fSopenharmony_ci SecStrBuf27 buf27; 353d58139fSopenharmony_ci SecStrBuf26 buf26; 363d58139fSopenharmony_ci SecStrBuf25 buf25; 373d58139fSopenharmony_ci SecStrBuf24 buf24; 383d58139fSopenharmony_ci SecStrBuf23 buf23; 393d58139fSopenharmony_ci SecStrBuf22 buf22; 403d58139fSopenharmony_ci SecStrBuf21 buf21; 413d58139fSopenharmony_ci SecStrBuf20 buf20; 423d58139fSopenharmony_ci SecStrBuf19 buf19; 433d58139fSopenharmony_ci SecStrBuf18 buf18; 443d58139fSopenharmony_ci SecStrBuf17 buf17; 453d58139fSopenharmony_ci SecStrBuf16 buf16; 463d58139fSopenharmony_ci SecStrBuf15 buf15; 473d58139fSopenharmony_ci SecStrBuf14 buf14; 483d58139fSopenharmony_ci SecStrBuf13 buf13; 493d58139fSopenharmony_ci SecStrBuf12 buf12; 503d58139fSopenharmony_ci SecStrBuf11 buf11; 513d58139fSopenharmony_ci SecStrBuf10 buf10; 523d58139fSopenharmony_ci SecStrBuf9 buf9; 533d58139fSopenharmony_ci SecStrBuf8 buf8; 543d58139fSopenharmony_ci SecStrBuf7 buf7; 553d58139fSopenharmony_ci SecStrBuf6 buf6; 563d58139fSopenharmony_ci SecStrBuf5 buf5; 573d58139fSopenharmony_ci SecStrBuf4 buf4; 583d58139fSopenharmony_ci SecStrBuf3 buf3; 593d58139fSopenharmony_ci SecStrBuf2 buf2; 603d58139fSopenharmony_ci} SecStrBuf32Union; 613d58139fSopenharmony_ci/* C standard initializes the first member of the consortium. */ 623d58139fSopenharmony_cistatic const SecStrBuf32 g_allZero = {{ 633d58139fSopenharmony_ci 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 643d58139fSopenharmony_ci 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 653d58139fSopenharmony_ci 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 663d58139fSopenharmony_ci 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U 673d58139fSopenharmony_ci}}; 683d58139fSopenharmony_cistatic const SecStrBuf32 g_allFF = {{ 693d58139fSopenharmony_ci 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 703d58139fSopenharmony_ci 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 713d58139fSopenharmony_ci 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 723d58139fSopenharmony_ci 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 733d58139fSopenharmony_ci}}; 743d58139fSopenharmony_ci 753d58139fSopenharmony_ci/* Clear conversion warning strict aliasing" */ 763d58139fSopenharmony_ciSECUREC_INLINE const SecStrBuf32Union *SecStrictAliasingCast(const SecStrBuf32 *buf) 773d58139fSopenharmony_ci{ 783d58139fSopenharmony_ci return (const SecStrBuf32Union *)buf; 793d58139fSopenharmony_ci} 803d58139fSopenharmony_ci 813d58139fSopenharmony_ci#ifndef SECUREC_MEMSET_THRESHOLD_SIZE 823d58139fSopenharmony_ci#define SECUREC_MEMSET_THRESHOLD_SIZE 32UL 833d58139fSopenharmony_ci#endif 843d58139fSopenharmony_ci 853d58139fSopenharmony_ci#define SECUREC_UNALIGNED_SET(dest, c, count) do { \ 863d58139fSopenharmony_ci unsigned char *pDest_ = (unsigned char *)(dest); \ 873d58139fSopenharmony_ci switch (count) { \ 883d58139fSopenharmony_ci case 32: \ 893d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 903d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 913d58139fSopenharmony_ci case 31: \ 923d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 933d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 943d58139fSopenharmony_ci case 30: \ 953d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 963d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 973d58139fSopenharmony_ci case 29: \ 983d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 993d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1003d58139fSopenharmony_ci case 28: \ 1013d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1023d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1033d58139fSopenharmony_ci case 27: \ 1043d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1053d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1063d58139fSopenharmony_ci case 26: \ 1073d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1083d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1093d58139fSopenharmony_ci case 25: \ 1103d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1113d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1123d58139fSopenharmony_ci case 24: \ 1133d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1143d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1153d58139fSopenharmony_ci case 23: \ 1163d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1173d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1183d58139fSopenharmony_ci case 22: \ 1193d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1203d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1213d58139fSopenharmony_ci case 21: \ 1223d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1233d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1243d58139fSopenharmony_ci case 20: \ 1253d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1263d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1273d58139fSopenharmony_ci case 19: \ 1283d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1293d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1303d58139fSopenharmony_ci case 18: \ 1313d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1323d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1333d58139fSopenharmony_ci case 17: \ 1343d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1353d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1363d58139fSopenharmony_ci case 16: \ 1373d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1383d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1393d58139fSopenharmony_ci case 15: \ 1403d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1413d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1423d58139fSopenharmony_ci case 14: \ 1433d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1443d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1453d58139fSopenharmony_ci case 13: \ 1463d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1473d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1483d58139fSopenharmony_ci case 12: \ 1493d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1503d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1513d58139fSopenharmony_ci case 11: \ 1523d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1533d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1543d58139fSopenharmony_ci case 10: \ 1553d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1563d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1573d58139fSopenharmony_ci case 9: \ 1583d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1593d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1603d58139fSopenharmony_ci case 8: \ 1613d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1623d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1633d58139fSopenharmony_ci case 7: \ 1643d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1653d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1663d58139fSopenharmony_ci case 6: \ 1673d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1683d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1693d58139fSopenharmony_ci case 5: \ 1703d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1713d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1723d58139fSopenharmony_ci case 4: \ 1733d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1743d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1753d58139fSopenharmony_ci case 3: \ 1763d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1773d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1783d58139fSopenharmony_ci case 2: \ 1793d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1803d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1813d58139fSopenharmony_ci case 1: \ 1823d58139fSopenharmony_ci *(pDest_++) = (unsigned char)(c); \ 1833d58139fSopenharmony_ci /* fall-through */ /* FALLTHRU */ \ 1843d58139fSopenharmony_ci default: \ 1853d58139fSopenharmony_ci /* Do nothing */ \ 1863d58139fSopenharmony_ci break; \ 1873d58139fSopenharmony_ci } \ 1883d58139fSopenharmony_ci} SECUREC_WHILE_ZERO 1893d58139fSopenharmony_ci 1903d58139fSopenharmony_ci#define SECUREC_SET_VALUE_BY_STRUCT(dest, dataName, n) do { \ 1913d58139fSopenharmony_ci *(SecStrBuf##n *)(dest) = *(const SecStrBuf##n *)(&((SecStrictAliasingCast(&(dataName)))->buf##n)); \ 1923d58139fSopenharmony_ci} SECUREC_WHILE_ZERO 1933d58139fSopenharmony_ci 1943d58139fSopenharmony_ci#define SECUREC_ALIGNED_SET_OPT_ZERO_FF(dest, c, count) do { \ 1953d58139fSopenharmony_ci switch (c) { \ 1963d58139fSopenharmony_ci case 0: \ 1973d58139fSopenharmony_ci switch (count) { \ 1983d58139fSopenharmony_ci case 1: \ 1993d58139fSopenharmony_ci *(unsigned char *)(dest) = (unsigned char)0; \ 2003d58139fSopenharmony_ci break; \ 2013d58139fSopenharmony_ci case 2: \ 2023d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 2); \ 2033d58139fSopenharmony_ci break; \ 2043d58139fSopenharmony_ci case 3: \ 2053d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 3); \ 2063d58139fSopenharmony_ci break; \ 2073d58139fSopenharmony_ci case 4: \ 2083d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 4); \ 2093d58139fSopenharmony_ci break; \ 2103d58139fSopenharmony_ci case 5: \ 2113d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 5); \ 2123d58139fSopenharmony_ci break; \ 2133d58139fSopenharmony_ci case 6: \ 2143d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 6); \ 2153d58139fSopenharmony_ci break; \ 2163d58139fSopenharmony_ci case 7: \ 2173d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 7); \ 2183d58139fSopenharmony_ci break; \ 2193d58139fSopenharmony_ci case 8: \ 2203d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 8); \ 2213d58139fSopenharmony_ci break; \ 2223d58139fSopenharmony_ci case 9: \ 2233d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 9); \ 2243d58139fSopenharmony_ci break; \ 2253d58139fSopenharmony_ci case 10: \ 2263d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 10); \ 2273d58139fSopenharmony_ci break; \ 2283d58139fSopenharmony_ci case 11: \ 2293d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 11); \ 2303d58139fSopenharmony_ci break; \ 2313d58139fSopenharmony_ci case 12: \ 2323d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 12); \ 2333d58139fSopenharmony_ci break; \ 2343d58139fSopenharmony_ci case 13: \ 2353d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 13); \ 2363d58139fSopenharmony_ci break; \ 2373d58139fSopenharmony_ci case 14: \ 2383d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 14); \ 2393d58139fSopenharmony_ci break; \ 2403d58139fSopenharmony_ci case 15: \ 2413d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 15); \ 2423d58139fSopenharmony_ci break; \ 2433d58139fSopenharmony_ci case 16: \ 2443d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 16); \ 2453d58139fSopenharmony_ci break; \ 2463d58139fSopenharmony_ci case 17: \ 2473d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 17); \ 2483d58139fSopenharmony_ci break; \ 2493d58139fSopenharmony_ci case 18: \ 2503d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 18); \ 2513d58139fSopenharmony_ci break; \ 2523d58139fSopenharmony_ci case 19: \ 2533d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 19); \ 2543d58139fSopenharmony_ci break; \ 2553d58139fSopenharmony_ci case 20: \ 2563d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 20); \ 2573d58139fSopenharmony_ci break; \ 2583d58139fSopenharmony_ci case 21: \ 2593d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 21); \ 2603d58139fSopenharmony_ci break; \ 2613d58139fSopenharmony_ci case 22: \ 2623d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 22); \ 2633d58139fSopenharmony_ci break; \ 2643d58139fSopenharmony_ci case 23: \ 2653d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 23); \ 2663d58139fSopenharmony_ci break; \ 2673d58139fSopenharmony_ci case 24: \ 2683d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 24); \ 2693d58139fSopenharmony_ci break; \ 2703d58139fSopenharmony_ci case 25: \ 2713d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 25); \ 2723d58139fSopenharmony_ci break; \ 2733d58139fSopenharmony_ci case 26: \ 2743d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 26); \ 2753d58139fSopenharmony_ci break; \ 2763d58139fSopenharmony_ci case 27: \ 2773d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 27); \ 2783d58139fSopenharmony_ci break; \ 2793d58139fSopenharmony_ci case 28: \ 2803d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 28); \ 2813d58139fSopenharmony_ci break; \ 2823d58139fSopenharmony_ci case 29: \ 2833d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 29); \ 2843d58139fSopenharmony_ci break; \ 2853d58139fSopenharmony_ci case 30: \ 2863d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 30); \ 2873d58139fSopenharmony_ci break; \ 2883d58139fSopenharmony_ci case 31: \ 2893d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 31); \ 2903d58139fSopenharmony_ci break; \ 2913d58139fSopenharmony_ci case 32: \ 2923d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 32); \ 2933d58139fSopenharmony_ci break; \ 2943d58139fSopenharmony_ci default: \ 2953d58139fSopenharmony_ci /* Do nothing */ \ 2963d58139fSopenharmony_ci break; \ 2973d58139fSopenharmony_ci } \ 2983d58139fSopenharmony_ci break; \ 2993d58139fSopenharmony_ci case 0xFF: \ 3003d58139fSopenharmony_ci switch (count) { \ 3013d58139fSopenharmony_ci case 1: \ 3023d58139fSopenharmony_ci *(unsigned char *)(dest) = (unsigned char)0xffU; \ 3033d58139fSopenharmony_ci break; \ 3043d58139fSopenharmony_ci case 2: \ 3053d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 2); \ 3063d58139fSopenharmony_ci break; \ 3073d58139fSopenharmony_ci case 3: \ 3083d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 3); \ 3093d58139fSopenharmony_ci break; \ 3103d58139fSopenharmony_ci case 4: \ 3113d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 4); \ 3123d58139fSopenharmony_ci break; \ 3133d58139fSopenharmony_ci case 5: \ 3143d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 5); \ 3153d58139fSopenharmony_ci break; \ 3163d58139fSopenharmony_ci case 6: \ 3173d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 6); \ 3183d58139fSopenharmony_ci break; \ 3193d58139fSopenharmony_ci case 7: \ 3203d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 7); \ 3213d58139fSopenharmony_ci break; \ 3223d58139fSopenharmony_ci case 8: \ 3233d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 8); \ 3243d58139fSopenharmony_ci break; \ 3253d58139fSopenharmony_ci case 9: \ 3263d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 9); \ 3273d58139fSopenharmony_ci break; \ 3283d58139fSopenharmony_ci case 10: \ 3293d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 10); \ 3303d58139fSopenharmony_ci break; \ 3313d58139fSopenharmony_ci case 11: \ 3323d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 11); \ 3333d58139fSopenharmony_ci break; \ 3343d58139fSopenharmony_ci case 12: \ 3353d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 12); \ 3363d58139fSopenharmony_ci break; \ 3373d58139fSopenharmony_ci case 13: \ 3383d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 13); \ 3393d58139fSopenharmony_ci break; \ 3403d58139fSopenharmony_ci case 14: \ 3413d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 14); \ 3423d58139fSopenharmony_ci break; \ 3433d58139fSopenharmony_ci case 15: \ 3443d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 15); \ 3453d58139fSopenharmony_ci break; \ 3463d58139fSopenharmony_ci case 16: \ 3473d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 16); \ 3483d58139fSopenharmony_ci break; \ 3493d58139fSopenharmony_ci case 17: \ 3503d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 17); \ 3513d58139fSopenharmony_ci break; \ 3523d58139fSopenharmony_ci case 18: \ 3533d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 18); \ 3543d58139fSopenharmony_ci break; \ 3553d58139fSopenharmony_ci case 19: \ 3563d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 19); \ 3573d58139fSopenharmony_ci break; \ 3583d58139fSopenharmony_ci case 20: \ 3593d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 20); \ 3603d58139fSopenharmony_ci break; \ 3613d58139fSopenharmony_ci case 21: \ 3623d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 21); \ 3633d58139fSopenharmony_ci break; \ 3643d58139fSopenharmony_ci case 22: \ 3653d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 22); \ 3663d58139fSopenharmony_ci break; \ 3673d58139fSopenharmony_ci case 23: \ 3683d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 23); \ 3693d58139fSopenharmony_ci break; \ 3703d58139fSopenharmony_ci case 24: \ 3713d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 24); \ 3723d58139fSopenharmony_ci break; \ 3733d58139fSopenharmony_ci case 25: \ 3743d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 25); \ 3753d58139fSopenharmony_ci break; \ 3763d58139fSopenharmony_ci case 26: \ 3773d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 26); \ 3783d58139fSopenharmony_ci break; \ 3793d58139fSopenharmony_ci case 27: \ 3803d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 27); \ 3813d58139fSopenharmony_ci break; \ 3823d58139fSopenharmony_ci case 28: \ 3833d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 28); \ 3843d58139fSopenharmony_ci break; \ 3853d58139fSopenharmony_ci case 29: \ 3863d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 29); \ 3873d58139fSopenharmony_ci break; \ 3883d58139fSopenharmony_ci case 30: \ 3893d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 30); \ 3903d58139fSopenharmony_ci break; \ 3913d58139fSopenharmony_ci case 31: \ 3923d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 31); \ 3933d58139fSopenharmony_ci break; \ 3943d58139fSopenharmony_ci case 32: \ 3953d58139fSopenharmony_ci SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 32); \ 3963d58139fSopenharmony_ci break; \ 3973d58139fSopenharmony_ci default: \ 3983d58139fSopenharmony_ci /* Do nothing */ \ 3993d58139fSopenharmony_ci break; \ 4003d58139fSopenharmony_ci } \ 4013d58139fSopenharmony_ci break; \ 4023d58139fSopenharmony_ci default: \ 4033d58139fSopenharmony_ci SECUREC_UNALIGNED_SET((dest), (c), (count)); \ 4043d58139fSopenharmony_ci break; \ 4053d58139fSopenharmony_ci } /* END switch */ \ 4063d58139fSopenharmony_ci} SECUREC_WHILE_ZERO 4073d58139fSopenharmony_ci 4083d58139fSopenharmony_ci#define SECUREC_SMALL_MEM_SET(dest, c, count) do { \ 4093d58139fSopenharmony_ci if (SECUREC_ADDR_ALIGNED_8((dest))) { \ 4103d58139fSopenharmony_ci SECUREC_ALIGNED_SET_OPT_ZERO_FF((dest), (c), (count)); \ 4113d58139fSopenharmony_ci } else { \ 4123d58139fSopenharmony_ci SECUREC_UNALIGNED_SET((dest), (c), (count)); \ 4133d58139fSopenharmony_ci } \ 4143d58139fSopenharmony_ci} SECUREC_WHILE_ZERO 4153d58139fSopenharmony_ci 4163d58139fSopenharmony_ci/* 4173d58139fSopenharmony_ci * Performance optimization 4183d58139fSopenharmony_ci */ 4193d58139fSopenharmony_ci#define SECUREC_MEMSET_OPT(dest, c, count) do { \ 4203d58139fSopenharmony_ci if ((count) > SECUREC_MEMSET_THRESHOLD_SIZE) { \ 4213d58139fSopenharmony_ci SECUREC_MEMSET_PREVENT_DSE((dest), (c), (count)); \ 4223d58139fSopenharmony_ci } else { \ 4233d58139fSopenharmony_ci SECUREC_SMALL_MEM_SET((dest), (c), (count)); \ 4243d58139fSopenharmony_ci } \ 4253d58139fSopenharmony_ci} SECUREC_WHILE_ZERO 4263d58139fSopenharmony_ci#endif 4273d58139fSopenharmony_ci 4283d58139fSopenharmony_ci/* 4293d58139fSopenharmony_ci * Handling errors 4303d58139fSopenharmony_ci */ 4313d58139fSopenharmony_ciSECUREC_INLINE errno_t SecMemsetError(void *dest, size_t destMax, int c) 4323d58139fSopenharmony_ci{ 4333d58139fSopenharmony_ci /* Check destMax is 0 compatible with _sp macro */ 4343d58139fSopenharmony_ci if (destMax == 0 || destMax > SECUREC_MEM_MAX_LEN) { 4353d58139fSopenharmony_ci SECUREC_ERROR_INVALID_RANGE("memset_s"); 4363d58139fSopenharmony_ci return ERANGE; 4373d58139fSopenharmony_ci } 4383d58139fSopenharmony_ci if (dest == NULL) { 4393d58139fSopenharmony_ci SECUREC_ERROR_INVALID_PARAMTER("memset_s"); 4403d58139fSopenharmony_ci return EINVAL; 4413d58139fSopenharmony_ci } 4423d58139fSopenharmony_ci SECUREC_MEMSET_PREVENT_DSE(dest, c, destMax); /* Set entire buffer to value c */ 4433d58139fSopenharmony_ci SECUREC_ERROR_INVALID_RANGE("memset_s"); 4443d58139fSopenharmony_ci return ERANGE_AND_RESET; 4453d58139fSopenharmony_ci} 4463d58139fSopenharmony_ci 4473d58139fSopenharmony_ci/* 4483d58139fSopenharmony_ci * <FUNCTION DESCRIPTION> 4493d58139fSopenharmony_ci * The memset_s function copies the value of c (converted to an unsigned char) 4503d58139fSopenharmony_ci * into each of the first count characters of the object pointed to by dest. 4513d58139fSopenharmony_ci * 4523d58139fSopenharmony_ci * <INPUT PARAMETERS> 4533d58139fSopenharmony_ci * dest Pointer to destination. 4543d58139fSopenharmony_ci * destMax The size of the buffer. 4553d58139fSopenharmony_ci * c Character to set. 4563d58139fSopenharmony_ci * count Number of characters. 4573d58139fSopenharmony_ci * 4583d58139fSopenharmony_ci * <OUTPUT PARAMETERS> 4593d58139fSopenharmony_ci * dest buffer is updated. 4603d58139fSopenharmony_ci * 4613d58139fSopenharmony_ci * <RETURN VALUE> 4623d58139fSopenharmony_ci * EOK Success 4633d58139fSopenharmony_ci * EINVAL dest == NULL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN 4643d58139fSopenharmony_ci * ERANGE destMax > SECUREC_MEM_MAX_LEN or (destMax is 0 and count > destMax) 4653d58139fSopenharmony_ci * ERANGE_AND_RESET count > destMax and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN and dest != NULL 4663d58139fSopenharmony_ci * 4673d58139fSopenharmony_ci * if return ERANGE_AND_RESET then fill dest to c ,fill length is destMax 4683d58139fSopenharmony_ci */ 4693d58139fSopenharmony_cierrno_t memset_s(void *dest, size_t destMax, int c, size_t count) 4703d58139fSopenharmony_ci{ 4713d58139fSopenharmony_ci if (SECUREC_MEMSET_PARAM_OK(dest, destMax, count)) { 4723d58139fSopenharmony_ci SECUREC_MEMSET_PREVENT_DSE(dest, c, count); 4733d58139fSopenharmony_ci return EOK; 4743d58139fSopenharmony_ci } 4753d58139fSopenharmony_ci /* Meet some runtime violation, return error code */ 4763d58139fSopenharmony_ci return SecMemsetError(dest, destMax, c); 4773d58139fSopenharmony_ci} 4783d58139fSopenharmony_ci 4793d58139fSopenharmony_ci#if SECUREC_EXPORT_KERNEL_SYMBOL 4803d58139fSopenharmony_ciEXPORT_SYMBOL(memset_s); 4813d58139fSopenharmony_ci#endif 4823d58139fSopenharmony_ci 4833d58139fSopenharmony_ci#if SECUREC_WITH_PERFORMANCE_ADDONS 4843d58139fSopenharmony_ci/* 4853d58139fSopenharmony_ci * Performance optimization 4863d58139fSopenharmony_ci */ 4873d58139fSopenharmony_cierrno_t memset_sOptAsm(void *dest, size_t destMax, int c, size_t count) 4883d58139fSopenharmony_ci{ 4893d58139fSopenharmony_ci if (SECUREC_MEMSET_PARAM_OK(dest, destMax, count)) { 4903d58139fSopenharmony_ci SECUREC_MEMSET_OPT(dest, c, count); 4913d58139fSopenharmony_ci return EOK; 4923d58139fSopenharmony_ci } 4933d58139fSopenharmony_ci /* Meet some runtime violation, return error code */ 4943d58139fSopenharmony_ci return SecMemsetError(dest, destMax, c); 4953d58139fSopenharmony_ci} 4963d58139fSopenharmony_ci 4973d58139fSopenharmony_ci/* 4983d58139fSopenharmony_ci * Performance optimization, trim judgement on "destMax <= SECUREC_MEM_MAX_LEN" 4993d58139fSopenharmony_ci */ 5003d58139fSopenharmony_cierrno_t memset_sOptTc(void *dest, size_t destMax, int c, size_t count) 5013d58139fSopenharmony_ci{ 5023d58139fSopenharmony_ci if (SECUREC_LIKELY(count <= destMax && dest != NULL)) { 5033d58139fSopenharmony_ci SECUREC_MEMSET_OPT(dest, c, count); 5043d58139fSopenharmony_ci return EOK; 5053d58139fSopenharmony_ci } 5063d58139fSopenharmony_ci /* Meet some runtime violation, return error code */ 5073d58139fSopenharmony_ci return SecMemsetError(dest, destMax, c); 5083d58139fSopenharmony_ci} 5093d58139fSopenharmony_ci#endif 5103d58139fSopenharmony_ci 511