|
@@ -46,7 +46,7 @@ RUNTIMEFUNCTION
|
|
RtSetMem (
|
|
RtSetMem (
|
|
IN VOID *Buffer,
|
|
IN VOID *Buffer,
|
|
IN UINTN Size,
|
|
IN UINTN Size,
|
|
- IN UINT8 Value
|
|
|
|
|
|
+ IN UINT8 Value
|
|
)
|
|
)
|
|
{
|
|
{
|
|
INT8 *pt;
|
|
INT8 *pt;
|
|
@@ -63,16 +63,26 @@ RtSetMem (
|
|
VOID
|
|
VOID
|
|
RUNTIMEFUNCTION
|
|
RUNTIMEFUNCTION
|
|
RtCopyMem (
|
|
RtCopyMem (
|
|
- IN VOID *Dest,
|
|
|
|
- IN CONST VOID *Src,
|
|
|
|
- IN UINTN len
|
|
|
|
|
|
+ IN VOID *Dest,
|
|
|
|
+ IN CONST VOID *Src,
|
|
|
|
+ IN UINTN len
|
|
)
|
|
)
|
|
{
|
|
{
|
|
- CHAR8 *d;
|
|
|
|
- CONST CHAR8 *s = Src;
|
|
|
|
- d = Dest;
|
|
|
|
- while (len--) {
|
|
|
|
- *(d++) = *(s++);
|
|
|
|
|
|
+ CHAR8 *d = (CHAR8*)Dest;
|
|
|
|
+ CHAR8 *s = (CHAR8*)Src;
|
|
|
|
+
|
|
|
|
+ if (d == NULL || s == NULL || s == d)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ // If the beginning of the destination range overlaps with the end of
|
|
|
|
+ // the source range, make sure to start the copy from the end so that
|
|
|
|
+ // we don't end up overwriting source data that we need for the copy.
|
|
|
|
+ if ((d > s) && (d < s + len)) {
|
|
|
|
+ for (d += len, s += len; len--; )
|
|
|
|
+ *--d = *--s;
|
|
|
|
+ } else {
|
|
|
|
+ while (len--)
|
|
|
|
+ *d++ = *s++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|