• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
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 wmemcpy_s function copies n successive wide characters
25  *    from the object pointed to by src into the object pointed to by dest.t.
26  *
27  * <INPUT PARAMETERS>
28  *    dest                   Destination buffer.
29  *    destMax                Size of the destination buffer.
30  *    src                     Buffer to copy from.
31  *    count                  Number of characters to copy.
32  *
33  * <OUTPUT PARAMETERS>
34  *    dest buffer            is updated.
35  *
36  * <RETURN VALUE>
37  *    EOK                    Success
38  *    EINVAL                 dest is  NULL  and destMax != 0 and destMax <= SECUREC_WCHAR_MEM_MAX_LEN
39  *                           and count <= destMax
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  *    EOVERLAP_AND_RESET     dest buffer and source buffer are overlapped and
48  *                           count <= destMax destMax != 0 and destMax <= SECUREC_WCHAR_MEM_MAX_LEN
49  *                           and dest  !=  NULL  and src != NULL and dest != src
50  *
51  *    if an error occurred, dest will be filled with 0 when dest and destMax valid .
52  *    If the source and destination overlap, the behavior of wmemcpy_s is undefined.
53  *    Use wmemmove_s to handle overlapping regions.
54  *******************************************************************************
55  */
wmemcpy_s(wchar_t * dest,size_t destMax,const wchar_t * src,size_t count)56 errno_t wmemcpy_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count)
57 {
58     if (destMax == 0 || destMax > SECUREC_WCHAR_MEM_MAX_LEN) {
59         SECUREC_ERROR_INVALID_PARAMTER("wmemcpy_s");
60         return ERANGE;
61     }
62     if (count > destMax) {
63         SECUREC_ERROR_INVALID_PARAMTER("wmemcpy_s");
64         if (dest != NULL) {
65             (void)memset(dest, 0, destMax * sizeof(wchar_t));
66             return ERANGE_AND_RESET;
67         }
68         return ERANGE;
69     }
70     return memcpy_s(dest, destMax * sizeof(wchar_t), src, count * sizeof(wchar_t));
71 }
72 
73 
74