From 05c7d5f6153b24fa83266cb853f731368fb7e457 Mon Sep 17 00:00:00 2001 From: darylm503 Date: Mon, 11 Mar 2013 18:00:30 +0000 Subject: [PATCH] StdLib: Fix printf issues with floating point and wide character strings. Also resolves a compilation issue with VS2010. See ISSUES.txt items 1, 11. ISSUES.txt: Added issue 11, updated status of issue 1. gdtoa/gdtoaimp.h: Fix definition of union U. Locale/_wcstod.h: Return 0.0 instead of 0 in the "no_convert" case. Locale/multibyte_Utf8.c: In wcsrtombs(), if both the destination pointer is NULL and the size, Limit, is 0; return the estimated length of the converted string up to ASCII_STRING_MAX bytes. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: daryl.mcdaniel@intel.com Reviewed-by: Aniruddha_Herekar@Dell.com git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14171 6f19259b-4bc3-4df7-8a09-765794883524 --- StdLib/ISSUES.txt | 10 ++- StdLib/LibC/Locale/_wcstod.h | 116 ++++++++++++++-------------- StdLib/LibC/Locale/multibyte_Utf8.c | 4 + StdLib/LibC/gdtoa/gdtoaimp.h | 3 +- 4 files changed, 70 insertions(+), 63 deletions(-) diff --git a/StdLib/ISSUES.txt b/StdLib/ISSUES.txt index f2b695e473..25317f7a68 100644 --- a/StdLib/ISSUES.txt +++ b/StdLib/ISSUES.txt @@ -14,16 +14,17 @@ StdLib Issues ============= Category TOOLs Reported Status ------------------------ -------- -------------- ----------- -1: Compilation Error vs2010 2012 Understood +1: Compilation Error vs2010 2012 Fixed 3/2013 stdlib\libc\gdtoa\strtod.c(825) : warning C4789: destination of memory copy is too small + runtime crashes when using floating-point formats with printf 2: Compilation Error ALL 2012 Fixed 1/2012 StdLib/LibC/Uefi/SysCalls.c: In function 'utimes': error: 'va_start' used in function with fixed args -3: Usage Clarification 2012 Understood/Document +3: Usage Clarification 2012 Document Clarify that the current StdLib may not be used for developing drivers. -4: Execution/Compile errors 2012 Understood +4: Execution/Compile errors 2012 Fixed 1/2013 Mismatch in use of EFIAPI between declaration and definition of some functions. 5: Error message Quality during execution 2012 Verified @@ -48,6 +49,9 @@ StdLib Issues If the Shell does not have a current volume or directory, file operations may hang or fail. +11: printf("-%ls-", L"test") will only print "--" 2013 Fixed 3/2013 + + PosixLib ============= Category TOOLs Reported Status diff --git a/StdLib/LibC/Locale/_wcstod.h b/StdLib/LibC/Locale/_wcstod.h index 1e7c47f2c0..4b0a833728 100644 --- a/StdLib/LibC/Locale/_wcstod.h +++ b/StdLib/LibC/Locale/_wcstod.h @@ -34,9 +34,9 @@ * function template for wcstof, wcstod, wcstold. * * parameters: - * _FUNCNAME : function name - * _RETURN_TYPE : return type - * _STRTOD_FUNC : real conversion function + * _FUNCNAME : function name + * _RETURN_TYPE : return type + * _STRTOD_FUNC : real conversion function */ #ifndef __WCSTOD_H_ #define __WCSTOD_H_ @@ -54,73 +54,73 @@ _RETURN_TYPE _FUNCNAME(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr) { - const wchar_t *src, *start; - _RETURN_TYPE val; - char *buf, *end; - size_t bufsiz, len; + const wchar_t *src, *start; + _RETURN_TYPE val; + char *buf, *end; + size_t bufsiz, len; - _DIAGASSERT(nptr != NULL); - /* endptr may be null */ + _DIAGASSERT(nptr != NULL); + /* endptr may be null */ - src = nptr; - while (iswspace((wint_t)*src) != 0) - ++src; - if (*src == L'\0') - goto no_convert; + src = nptr; + while (iswspace((wint_t)*src) != 0) + ++src; + if (*src == L'\0') + goto no_convert; - /* - * Convert the supplied numeric wide char. string to multibyte. - * - * We could attempt to find the end of the numeric portion of the - * wide char. string to avoid converting unneeded characters but - * choose not to bother; optimising the uncommon case where - * the input string contains a lot of text after the number - * duplicates a lot of strto{f,d,ld}()'s functionality and - * slows down the most common cases. - */ - start = src; - len = wcstombs(NULL, src, 0); - if (len == (size_t)-1) - /* errno = EILSEQ */ - goto no_convert; + /* + * Convert the supplied numeric wide char. string to multibyte. + * + * We could attempt to find the end of the numeric portion of the + * wide char. string to avoid converting unneeded characters but + * choose not to bother; optimising the uncommon case where + * the input string contains a lot of text after the number + * duplicates a lot of strto{f,d,ld}()'s functionality and + * slows down the most common cases. + */ + start = src; + len = wcstombs(NULL, src, 0); + if (len == (size_t)-1) + /* errno = EILSEQ */ + goto no_convert; - _DIAGASSERT(len > 0); + _DIAGASSERT(len > 0); - bufsiz = len; - buf = (void *)malloc(bufsiz + 1); - if (buf == NULL) - /* errno = ENOMEM */ - goto no_convert; + bufsiz = len; + buf = (void *)malloc(bufsiz + 1); + if (buf == NULL) + /* errno = ENOMEM */ + goto no_convert; - len = wcstombs(buf, src, bufsiz + 1); + len = wcstombs(buf, src, bufsiz + 1); - _DIAGASSERT(len == bufsiz); - _DIAGASSERT(buf[len] == '\0'); + _DIAGASSERT(len == bufsiz); + _DIAGASSERT(buf[len] == '\0'); - /* Let strto{f,d,ld}() do most of the work for us. */ - val = _STRTOD_FUNC(buf, &end); - if (buf == end) { - free(buf); - goto no_convert; - } + /* Let strto{f,d,ld}() do most of the work for us. */ + val = _STRTOD_FUNC(buf, &end); + if (buf == end) { + free(buf); + goto no_convert; + } - /* - * We only know where the number ended in the _multibyte_ - * representation of the string. If the caller wants to know - * where it ended, count multibyte characters to find the - * corresponding position in the wide char string. - */ - if (endptr != NULL) - /* XXX Assume each wide char is one byte. */ - *endptr = __UNCONST(start + (size_t)(end - buf)); + /* + * We only know where the number ended in the _multibyte_ + * representation of the string. If the caller wants to know + * where it ended, count multibyte characters to find the + * corresponding position in the wide char string. + */ + if (endptr != NULL) + /* XXX Assume each wide char is one byte. */ + *endptr = __UNCONST(start + (size_t)(end - buf)); - free(buf); + free(buf); - return val; + return val; no_convert: - if (endptr != NULL) - *endptr = __UNCONST(nptr); - return 0; + if (endptr != NULL) + *endptr = __UNCONST(nptr); + return 0.0; } #endif /*__WCSTOD_H_*/ diff --git a/StdLib/LibC/Locale/multibyte_Utf8.c b/StdLib/LibC/Locale/multibyte_Utf8.c index 36e2cb379e..ec9b012658 100644 --- a/StdLib/LibC/Locale/multibyte_Utf8.c +++ b/StdLib/LibC/Locale/multibyte_Utf8.c @@ -14,6 +14,7 @@ #include #include #include +#include typedef int ch_UCS4; @@ -913,6 +914,9 @@ wcsrtombs( return (0); if (Dest == NULL) { + if(MaxBytes <= 0) { + MaxBytes = ASCII_STRING_MAX; + } NumStored = EstimateWtoM(*Src, MaxBytes, NULL); } else { diff --git a/StdLib/LibC/gdtoa/gdtoaimp.h b/StdLib/LibC/gdtoa/gdtoaimp.h index 635a177544..3ba2cf8fbf 100644 --- a/StdLib/LibC/gdtoa/gdtoaimp.h +++ b/StdLib/LibC/gdtoa/gdtoaimp.h @@ -283,8 +283,7 @@ extern "C" { Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be defined. #endif -typedef union { double d; ULong L[2]; } U; -//typedef union { double d; UINT32 L[2]; } U; +typedef union { double d; UINT32 L[2]; } U; #ifdef YES_ALIAS #define dval(x) x