• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved.
3  * Licensed under Mulan PSL v2.
4  * You can use this software according to the terms and conditions of the Mulan PSL v2.
5  * You may obtain a copy of Mulan PSL v2 at:
6  *          http://license.coscl.org.cn/MulanPSL2
7  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10  * See the Mulan PSL v2 for more details.
11  * Description: wmemmove_s  function
12  * Create: 2014-02-25
13  */
14 /*
15  * [Standardize-exceptions] Use unsafe function: Portability
16  * [reason] Use unsafe function to implement security function to maintain platform compatibility.
17  *          And sufficient input validation is performed before calling
18  */
19 
20 #include "securecutil.h"
21 
22 /*
23  * <FUNCTION DESCRIPTION>
24  *   The wmemmove_s function copies n successive wide characters from the object pointed
25  *   to by src into the object pointed to by dest.
26  *
27  * <INPUT PARAMETERS>
28  *    dest                     Destination buffer.
29  *    destMax                  Size of the destination buffer.
30  *    src                      Source object.
31  *    count                    Number of bytes or character to copy.
32  *
33  * <OUTPUT PARAMETERS>
34  *    dest                     is updated.
35  *
36  * <RETURN VALUE>
37  *    EOK                      Success
38  *    EINVAL                   dest is  NULL and destMax != 0 and count <= destMax
39  *                             and destMax <= SECUREC_WCHAR_MEM_MAX_LEN
40  *    EINVAL_AND_RESET         dest != NULL and src is NULL and destMax != 0
41  *                             and destMax <= SECUREC_WCHAR_MEM_MAX_LEN and count <= destMax
42  *    ERANGE                   destMax > SECUREC_WCHAR_MEM_MAX_LEN or destMax is 0 or
43  *                             (count > destMax and dest is  NULL and destMax != 0
44  *                             and destMax <= SECUREC_WCHAR_MEM_MAX_LEN)
45  *    ERANGE_AND_RESET        count > destMax and dest  !=  NULL and destMax != 0
46  *                             and destMax <= SECUREC_WCHAR_MEM_MAX_LEN
47  *
48  *
49  *     If an error occurred, dest will  be filled with 0 when dest and destMax valid.
50  *     If some regions of the source area and the destination overlap, wmemmove_s
51  *     ensures that the original source bytes in the overlapping region are copied
52  *     before being overwritten
53  */
wmemmove_s(wchar_t * dest,size_t destMax,const wchar_t * src,size_t count)54 errno_t wmemmove_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count)
55 {
56     if (destMax == 0 || destMax > SECUREC_WCHAR_MEM_MAX_LEN) {
57         SECUREC_ERROR_INVALID_PARAMTER("wmemmove_s");
58         return ERANGE;
59     }
60     if (count > destMax) {
61         SECUREC_ERROR_INVALID_PARAMTER("wmemmove_s");
62         if (dest != NULL) {
63             (void)SECUREC_MEMSET_FUNC_OPT(dest, 0, destMax * sizeof(wchar_t));
64             return ERANGE_AND_RESET;
65         }
66         return ERANGE;
67     }
68     return memmove_s(dest, destMax * sizeof(wchar_t), src, count * sizeof(wchar_t));
69 }
70 
71