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