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