[Bug 2011326] Re: glibc 2.37: snprintf() on armhf wrongly truncates writes given extremely large size argument
Florian Weimer
2011326 at bugs.launchpad.net
Sun Mar 12 13:36:10 UTC 2023
The C standard says that the input is an array of the specified size. So
I think an application that does this triggers undefined behavior.
We could support this as an extension, by extending the end-of-address-
space saturation logic introduced for the fortified variant in this
commit:
commit 0d50f477f47ba637b54fb03ac48d769ec4543e8d
Author: Florian Weimer <fweimer at redhat.com>
Date: Wed Jan 25 08:01:00 2023 +0100
stdio-common: Handle -1 buffer size in __sprintf_chk & co (bug
30039)
The fortified case is different because the application does not specify
the -1 buffer size in that case, so there's no application bug.
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to glibc in Ubuntu.
https://bugs.launchpad.net/bugs/2011326
Title:
glibc 2.37: snprintf() on armhf wrongly truncates writes given
extremely large size argument
Status in glibc package in Ubuntu:
New
Bug description:
The cyrus-imapd package fails to build from source on armhf in lunar
against glibc 2.37. I've tracked this down to a combination of bad
string handling in the cyrus library's API, and a regression in glibc
2.37 vs 2.36 when snprintf() is passed a size argument whose value is
very close to INT_MAX.
Basically, since the API is passed a buffer of unknown size, and then
passes this on to functions that DO safe handling of buffer lengths,
it claims a buffer size of INT_MAX. Because the functions start
filling the buffer before the call to snprintf(), the actual size
argument to snprintf() is slightly less than INT_MAX. This is
unrealistic and incorrect, but technically valid, so snprintf() should
handle it correctly.
Below is a reproducer that demonstrates the bug on armhf.
#include <limits.h>
#include <stdio.h>
#include <string.h>
int main() {
char buf[32];
int res;
res = snprintf(buf, sizeof(buf)-1, "%s", "hello world");
printf("having a normal one. res=%d,buf=%s\n",res,buf);
res = snprintf(buf, INT_MAX, "%s", "hello world");
printf("res=%d but buf=%s\n",res,buf);
}
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/2011326/+subscriptions
More information about the foundations-bugs
mailing list