From 85f1c797f6935223205159dd108e4871b2e55500 Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Tue, 24 Apr 2018 13:45:11 +0100 Subject: [PATCH 1/4] Fix conversion from 'UINTN' to 'UINT8' warnings * MSVC generates two of the following in rtstr.c: warning C4244: 'function': conversion from 'UINTN' to 'UINT8', possible loss of data --- lib/runtime/rtstr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/runtime/rtstr.c b/lib/runtime/rtstr.c index 80ff489..dcc1a2a 100644 --- a/lib/runtime/rtstr.c +++ b/lib/runtime/rtstr.c @@ -71,7 +71,7 @@ RtStrnCpy ( { UINTN Size = RtStrnLen(Src, Len); if (Size != Len) - RtSetMem(Dest + Len, '\0', (Len - Size) * sizeof(CHAR16)); + RtSetMem(Dest + Len, '\0', (UINT8)((Len - Size) * sizeof(CHAR16))); RtCopyMem(Dest, Src, Size * sizeof(CHAR16)); } @@ -107,7 +107,7 @@ RtStpnCpy ( { UINTN Size = RtStrnLen(Src, Len); if (Size != Len) - RtSetMem(Dest + Len, '\0', (Len - Size) * sizeof(CHAR16)); + RtSetMem(Dest + Len, '\0', (UINT8)((Len - Size) * sizeof(CHAR16))); RtCopyMem(Dest, Src, Size * sizeof(CHAR16)); return Dest + Size; } -- 2.19.0 From 4889dc561f905406f3d0a648321589bd47703fdc Mon Sep 17 00:00:00 2001 From: Gary Lin Date: Tue, 9 Oct 2018 18:35:21 +0800 Subject: [PATCH 2/4] Set '\0' properly in StrnCpy() The arguments to SetMem() were wrong. Besides, SetMem() should start at "Dest + Size" since "Size" will be smaller than "Len" if they are not equal. Signed-off-by: Gary Lin --- lib/runtime/rtstr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/runtime/rtstr.c b/lib/runtime/rtstr.c index dcc1a2a..949f938 100644 --- a/lib/runtime/rtstr.c +++ b/lib/runtime/rtstr.c @@ -71,7 +71,7 @@ RtStrnCpy ( { UINTN Size = RtStrnLen(Src, Len); if (Size != Len) - RtSetMem(Dest + Len, '\0', (UINT8)((Len - Size) * sizeof(CHAR16))); + RtSetMem(Dest + Size, (Len - Size) * sizeof(CHAR16), '\0'); RtCopyMem(Dest, Src, Size * sizeof(CHAR16)); } -- 2.19.0 From 38a9921bc39fea25b0ca62d6eb1595bf15d05839 Mon Sep 17 00:00:00 2001 From: Gary Lin Date: Thu, 11 Oct 2018 12:02:27 +0800 Subject: [PATCH 3/4] Implement StrnCat() without StrnCpy() StrnCpy() doesn't guarantee the dest string will be null-terminated, so we shouldn't use StrnCpy(). Signed-off-by: Gary Lin --- lib/runtime/rtstr.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/runtime/rtstr.c b/lib/runtime/rtstr.c index 949f938..fe65d96 100644 --- a/lib/runtime/rtstr.c +++ b/lib/runtime/rtstr.c @@ -126,7 +126,7 @@ RtStrCat ( } #ifndef __GNUC__ -#pragma RUNTIME_CODE(RtStrCat) +#pragma RUNTIME_CODE(RtStrnCat) #endif VOID RUNTIMEFUNCTION @@ -136,7 +136,12 @@ RtStrnCat ( IN UINTN Len ) { - RtStrnCpy(Dest+StrLen(Dest), Src, Len); + UINTN DestSize, Size; + + DestSize = StrLen(Dest); + Size = RtStrnLen(Src, Len); + RtCopyMem(Dest + DestSize, Src, Size * sizeof(CHAR16)); + Dest[DestSize + Size] = '\0'; } #ifndef __GNUC__ -- 2.19.0 From 134587ea094a4974e5773bf228f6436535f50f1a Mon Sep 17 00:00:00 2001 From: Gary Lin Date: Thu, 11 Oct 2018 16:10:26 +0800 Subject: [PATCH 4/4] Set '\0' properly in StpnCpy() The arguments to SetMem() were wrong. Besides, SetMem() should start at "Dest + Size" since "Size" will be smaller than "Len" if they are not equal. Signed-off-by: Gary Lin --- lib/runtime/rtstr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/runtime/rtstr.c b/lib/runtime/rtstr.c index fe65d96..73965ca 100644 --- a/lib/runtime/rtstr.c +++ b/lib/runtime/rtstr.c @@ -94,7 +94,7 @@ RtStpCpy ( } #ifndef __GNUC__ -#pragma RUNTIME_CODE(RtStrnCpy) +#pragma RUNTIME_CODE(RtStpnCpy) #endif CHAR16 * RUNTIMEFUNCTION @@ -107,7 +107,7 @@ RtStpnCpy ( { UINTN Size = RtStrnLen(Src, Len); if (Size != Len) - RtSetMem(Dest + Len, '\0', (UINT8)((Len - Size) * sizeof(CHAR16))); + RtSetMem(Dest + Size, (Len - Size) * sizeof(CHAR16), '\0'); RtCopyMem(Dest, Src, Size * sizeof(CHAR16)); return Dest + Size; } -- 2.19.0