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