From 4d9a1969f7d6e97ea0605c0a00f69f4d373a6aba Mon Sep 17 00:00:00 2001 From: Sami Kerola Date: Wed, 17 Dec 2014 22:57:02 +0000 Subject: more: blacklist unsigned integer overflow [AddressSanitizer] The mbrtowc() return values are overflowing by design. Signed-off-by: Sami Kerola --- text-utils/more.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'text-utils/more.c') diff --git a/text-utils/more.c b/text-utils/more.c index 8c0853c14..a75cd7a80 100644 --- a/text-utils/more.c +++ b/text-utils/more.c @@ -1091,6 +1091,16 @@ void clreos(void) my_putstring(EodClr); } + +static UL_ASAN_BLACKLIST xmbrtowc(wchar_t *wc, const char *s, size_t n, + mbstate_t *mbstate) +{ + const size_t mblength = mbrtowc(&wc, s, n, &mbstate); + if (mblength == (size_t)-2 || mblength == (size_t)-1) + return 1; + return mblength; +} + /* Print a buffer of n characters */ void prbuf(register char *s, register int n) { @@ -1130,10 +1140,7 @@ void prbuf(register char *s, register int n) memset(&mbstate, '\0', sizeof(mbstate_t)); s--; n++; - mblength = mbrtowc(&wc, s, n, &mbstate); - if (mblength == (size_t)-2 - || mblength == (size_t)-1) - mblength = 1; + mblength = xmbrtowc(&wc, s, n, &mbstate); while (mblength--) putchar(*s++); n += mblength; -- cgit v1.2.3-55-g7522