Re: [PATCH] Add compat/vsnprintf.c for systems that returns -1 on maxsize reached
- From
- Michal Rokos <michal.rokos@nextsoft.cz>
- Date
- Mar 5, 2008, 08:37 UTC
- Message-ID
- <200803050937.40345.michal.rokos@nextsoft.cz>
- In-Reply-To
- <47CD78C9.80003@viscovery.net>
Hello,
On Tuesday 04 March 2008 17:28:57 Johannes Sixt wrote:
Show 5 quoted lines
> Michal Rokos schrieb: > > If anybody could think of some better define than BROKEN_VSNPRINTF, I'm > > all ears. > > CLUELESS_OVERFLOWN_VSNPRINTF?
Heh. My first one was VSNPRINTF_RETURNS_MINUS_1...
Show 9 quoted lines
> Because we have the same issue on Windows where vsnprintf returns -1 on > overflow. > > But there is also another complication: The size parameter of the system's > vsnprintf must not count the trailing NUL, i.e. the buffer must actually > have space for one extra byte, whereas the POSIX version must count NUL. > Can you check whether your vsnprintf has this flaw, too? If it doesn't, we > would need another configuration variable so that we can distinguish these > two kinds of brokenness.
I did my homework and prepared this:
#include "stdio.h" #include "stdarg.h"
int test_vsnprintf(char *str, size_t maxsize, const char *format, ...)
{
int ret;
va_list ap;va_start(ap, format); ret = vsnprintf(str, maxsize, format, ap); va_end(ap);
return ret; }
int main(void)
{
char buf[10];
int ret; ret = test_vsnprintf(buf, 1, "%s", "12345");
printf("case1: %d\n", ret); ret = test_vsnprintf(buf, 5, "%s", "12345");
printf("case2: %d\n", ret); ret = test_vsnprintf(buf, 6, "%s", "12345");
printf("case3: %d\n", ret); ret = test_vsnprintf(buf, 10, "%s", "12345");
printf("case4: %d\n", ret);return 0; }
which returns: Linux 2.6.25-rc3-mr i686 case1: 5 case2: 5 case3: 5 case4: 5
HP-UX B.11.11 9000/800 case1: -1 case2: -1 case3: 5 case4: 5
HP-UX B.11.23 ia64 case1: -1 case2: -1 case3: 5 case4: 5
So HPUX impl is the same as a Windows one. So we can share the replacement. Please note that there's no va_copy() on HPUX.
I think that Tru64 has the same issue, but I have no HW to test it on now.
Could somebody else try to run testcase above on some other OSes?
Thanks
Michal