Carmelo AMOROSO wrote:
> Carmelo AMOROSO wrote:
>> [EMAIL PROTECTED] wrote:
>>> Author: vda
>>> Date: 2008-04-09 12:51:18 -0700 (Wed, 09 Apr 2008)
>>> New Revision: 21683
>>>
>>> Log:
>>> Factor out the core of vprintf() into separate function
>>> vprintf_internal, so that:
>>> * vprintf() does locking and __STDIO_STREAM_TRANS_TO_WRITE thing,
>>> then calls vprintf_internal
>>> * vsnprintf, vdprintf.c, vasprintf.c use
>>> vprintf_internal directly
>>>
>>> This makes sprintf faster (since it doesn't do any locking)
>>> and stops it from pulling in fseek in static compile.
>>>
>>>
>>>
>>> Added:
>>> trunk/uClibc/libc/stdio/_vfprintf_internal.c
>>> trunk/uClibc/libc/stdio/_vfwprintf_internal.c
>>>
>>> Modified:
>>> trunk/uClibc/libc/stdio/Makefile.in
>>> trunk/uClibc/libc/stdio/_stdio.h
>>> trunk/uClibc/libc/stdio/_vfprintf.c
>>> trunk/uClibc/libc/stdio/vasprintf.c
>>> trunk/uClibc/libc/stdio/vdprintf.c
>>> trunk/uClibc/libc/stdio/vsnprintf.c
>>> trunk/uClibc/libc/stdio/vswprintf.c
>>>
>>>
>> [SNIP]
>>> Modified: trunk/uClibc/libc/stdio/_vfprintf.c
>>> ===================================================================
>>> --- trunk/uClibc/libc/stdio/_vfprintf.c 2008-04-09 11:38:48 UTC
>>> (rev 21682)
>>> +++ trunk/uClibc/libc/stdio/_vfprintf.c 2008-04-09 19:51:18 UTC
>>> (rev 21683)
>>> @@ -1198,7 +1198,7 @@
>>>
>>> #endif
>>> /**********************************************************************/
>>>
>>> -#if defined(L_vfprintf) || defined(L_vfwprintf)
>>> +#if defined(L__vfprintf_internal) || defined(L__vfwprintf_internal)
>>>
>>> /* We only support ascii digits (or their USC equivalent codes) in
>>> * precision and width settings in *printf (wide) format strings.
>>> @@ -1207,14 +1207,15 @@
>>>
>>> static size_t _charpad(FILE * __restrict stream, int padchar, size_t
>>> numpad);
>>>
>>> -#ifdef L_vfprintf
>>> +#ifdef L__vfprintf_internal
>>>
>>> -#define VFPRINTF vfprintf
>>> +#define VFPRINTF_internal _vfprintf_internal
>>> #define FMT_TYPE char
>>> #define OUTNSTR _outnstr
>>> #define STRLEN strlen
>>> #define _PPFS_init _ppfs_init
>>> -#define OUTPUT(F,S) fputs_unlocked(S,F)
>>> +/* Pulls in fseek: #define OUTPUT(F,S) fputs_unlocked(S,F) */
>>> +#define OUTPUT(F,S) __stdio_fwrite((const unsigned char
>>> *)(S),strlen(S),(F))
>>
>> Hi Denys,
>> while running some test on nptl bracn with runtime assertion enabled,
>> I've discoverd that this change is causing uclibc aborting due to an
>> assert(bytes) in __stdio_fwrite, while calling fputs_unlocked all works
>> fine. I'd like to understand better the rationale behind and I'm
>> wondering if the problem is present in trunk with other arch than sh4.
>>
>> To exploit the problem you simply need to call a printf with a format
>> string (i.e. printf("val=%d\n",x) ).
>>
>> Please let me know your comments, thanks.
>>
>> Carmelo
>>
> Hi,
> doing further analysis, I've figure out why we fail using
> __stdio_fwrite. Basically __stdio_fwrite expects at least 1 bytes.
> fputs_unlocked(S,F) calls fwrite_unlocked and this calls __stdio_fwrite
> only if bytes to be written are > 0, otherwise simply returs 0 (that is
> correct). During the parsing of format spec it could happen that
> __stdio_fwrite is called passing an empty string and with assertion
> enabled it will abort.
> So, I think that using fputs_unlocked is fine, I don't see any other
> reasons for calling __stdio_fwrite directly.
>
> Cheers,
> Carmelo
Fix applied in rev 23367.
Carmelo
>> _______________________________________________
>> uClibc mailing list
>> [email protected]
>> http://busybox.net/cgi-bin/mailman/listinfo/uclibc
>>
>
>
_______________________________________________
uClibc mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/uclibc