summaryrefslogtreecommitdiffstats
path: root/text-utils/more.c
diff options
context:
space:
mode:
authorSami Kerola2014-12-17 23:57:02 +0100
committerKarel Zak2014-12-19 11:32:38 +0100
commit4d9a1969f7d6e97ea0605c0a00f69f4d373a6aba (patch)
treee02ac0af577a619008f7d12455a28a675bff84fd /text-utils/more.c
parentipcs: fix two data type errors [AddressSanitizer] (diff)
downloadkernel-qcow2-util-linux-4d9a1969f7d6e97ea0605c0a00f69f4d373a6aba.tar.gz
kernel-qcow2-util-linux-4d9a1969f7d6e97ea0605c0a00f69f4d373a6aba.tar.xz
kernel-qcow2-util-linux-4d9a1969f7d6e97ea0605c0a00f69f4d373a6aba.zip
more: blacklist unsigned integer overflow [AddressSanitizer]
The mbrtowc() return values are overflowing by design. Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Diffstat (limited to 'text-utils/more.c')
-rw-r--r--text-utils/more.c15
1 files changed, 11 insertions, 4 deletions
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;