1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4
5/***
6*memmove_s.c - contains memmove_s routine
7*
8
9*
10*Purpose:
11* memmove_s() copies a source memory buffer to a destination buffer.
12* Overlapping buffers are treated specially, to avoid propagation.
13*
14*Revision History:
15* 10-07-03 AC Module created.
16* 03-10-04 AC Return ERANGE when buffer is too small
17*
18*******************************************************************************/
19
20#include <string.h>
21#include <errno.h>
22#include "internal_securecrt.h"
23#include "mbusafecrt_internal.h"
24
25/***
26*memmove - Copy source buffer to destination buffer
27*
28*Purpose:
29* memmove() copies a source memory buffer to a destination memory buffer.
30* This routine recognize overlapping buffers to avoid propagation.
31*
32* For cases where propagation is not a problem, memcpy_s() can be used.
33*
34*Entry:
35* void *dst = pointer to destination buffer
36* size_t sizeInBytes = size in bytes of the destination buffer
37* const void *src = pointer to source buffer
38* size_t count = number of bytes to copy
39*
40*Exit:
41* Returns 0 if everything is ok, else return the error code.
42*
43*Exceptions:
44* Input parameters are validated. Refer to the validation section of the function.
45* On error, the error code is returned. Nothing is written to the destination buffer.
46*
47*******************************************************************************/
48
49errno_t __cdecl memmove_s(
50 void * dst,
51 size_t sizeInBytes,
52 const void * src,
53 size_t count
54)
55{
56 if (count == 0)
57 {
58 /* nothing to do */
59 return 0;
60 }
61
62 /* validation section */
63 _VALIDATE_RETURN_ERRCODE(dst != NULL, EINVAL);
64 _VALIDATE_RETURN_ERRCODE(src != NULL, EINVAL);
65 _VALIDATE_RETURN_ERRCODE(sizeInBytes >= count, ERANGE);
66
67 memmove(dst, src, count);
68 return 0;
69}
70