12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /*
- * Copyright (c) 2013-2023, Arm Limited and Contributors. All rights reserved.
- * Copyright (c) 2023, Intel Corporation. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #include <errno.h>
- #include <stddef.h>
- #include <string.h>
- int memcpy_s(void *dst, size_t dsize, void *src, size_t ssize)
- {
- unsigned int *s = (unsigned int *)src;
- unsigned int *d = (unsigned int *)dst;
- /*
- * Check source and destination size is NULL
- */
- if ((dst == NULL) || (src == NULL)) {
- return -ENOMEM;
- }
- /*
- * Check source and destination size validity
- */
- if ((dsize == 0) || (ssize == 0)) {
- return -ERANGE;
- }
- /*
- * Check both source and destination size range
- */
- if ((ssize > dsize) || (dsize > ssize)) {
- return -EINVAL;
- }
- /*
- * Check both source and destination address overlapping
- * When (s > d < s + ssize)
- * Or (d > s < d + dsize)
- */
- if (d > s) {
- if ((d) < (s + ssize)) {
- return -EOPNOTSUPP;
- }
- }
- if (s > d) {
- if ((s) < (d + dsize)) {
- return -EOPNOTSUPP;
- }
- }
- /*
- * Start copy process when there is no error
- */
- while (ssize--) {
- d[ssize] = s[ssize];
- }
- return 0;
- }
|