Re: svn commit: trunk/uClibc/libc/stdio

2008-09-09 Thread Carmelo AMOROSO
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.c2008-04-09 11:38:48 UTC 
>>> (rev 21682)
>>> +++ trunk/uClibc/libc/stdio/_vfprintf.c2008-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
>> uClibc@uclibc.org
>> http://busybox.net/cgi-bin/mailman/listinfo/uclibc
>>
> 
> 

___
uClibc mailing list
uClibc@uclibc.org
http://busybox.net/cgi-bin/mailman/listinfo/uclibc


Re: svn commit: trunk/uClibc/libc/stdio

2008-07-31 Thread Carmelo AMOROSO
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
> ___
> uClibc mailing list
> uClibc@uclibc.org
> http://busybox.net/cgi-bin/mailman/listinfo/uclibc
> 

___
uClibc mailing list
uClibc@uclibc.org
http://busybox.net/cgi-bin/mailman/listinfo/uclibc


Re: svn commit: trunk/uClibc/libc/stdio

2008-07-31 Thread Carmelo AMOROSO
[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

___
uClibc mailing list
uClibc@uclibc.org
http://busybox.net/cgi-bin/mailman/listinfo/uclibc