NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: standards/47119: putc_unlocked(3) is found even with -std=c89



christos%zoulas.com@localhost (Christos Zoulas) wrote:

 |On Oct 24,  2:10pm, sdaoden%gmail.com@localhost (Steffen "Daode" Nurpmeso) 
wrote:
 |-- Subject: Re: standards/47119: putc_unlocked(3) is found even with \
 |-std=c89
 |
 || The following reply was made to PR standards/47119; it has been noted by \
 |. GNATS.
 || 
 || From: Steffen "Daode" Nurpmeso <sdaoden%gmail.com@localhost>
 || To: Martin Husemann <martin%duskware.de@localhost>
 || Cc: gnats-bugs%NetBSD.org@localhost
 || Subject: Re: standards/47119: putc_unlocked(3) is found even with \
 |. -std=c89
 || Date: Wed, 24 Oct 2012 16:05:07 +0200
 || 
 ||  Martin Husemann <martin%duskware.de@localhost> wrote:
 ||  
 |||On Wed, Oct 24, 2012 at 03:11:03PM +0200, Steffen Daode Nurpmeso wrote:
 |||> Because it is not part of C89/C99?
 |||
 |||You are misunderstanding the compiler option - it has no influence on the
 |||symbols visible in libraries nor system headers (at least in general).
 |||There are a few defines you can add via -D to make the headers pollute \
 |.. less
 ||  
 ||  Hmm.  I think you're right.
 ||  Well i'm not really working with those headers, and i still see
 ||  a '#define _GNU_SOURCE' on top of the one that's really important
 ||  for me.
 ||  
 |||namespace, but since this is a posix blessed function, it is better
 |||to avoid a name clash in application code.
 |||Martin
 ||  
 ||  Yes, a lot of conditions and a lot of what standards produce most
 ||  of the time, so thanks for all those work on standard compliance.
 ||  
 ||  Nonetheless - the bug is triggered only with -std=c89, and only on
 ||  NetBSD 6.0.  And in the meanwhile i've found it.
 ||  In fact it has nothing to do with putc_unlocked() (i was so clumsy
 ||  that i even tried to compile with -pthread and -D_REENTRANT, and
 ||  it was still expanded to __sputc() or so - amazing!), but it is in
 ||  fact alloca(3) that returns an invalid buffer:
 ||  
 ||    %fwrite_td() calls ac_alloc for 29
 ||    fwrite_td() calls memcpy (From: <XXXXXXXXXXX%YYYY.com@localhost>
 ||    )29
 ||    fwrite_td() before delctrl (^])29
 ||    fwrite_td() calls prefixwrite (^])29
 ||    *29 (0xbfbf9254)()*^@^@^@^@^@^@^@^@XXXXXXXXXX%YYYY.com@localhost>
 ||  
 ||  From the alloca(3) manual i see nothing special to adhere to,
 ||  i would not describe 29 bytes as a "large unbounded allocation".
 ||  The CFLAGS are simply '-std=c89 -O2', so nothing special at all.
 ||  I think this is worth another PR?
 |
 |You are probably missing some include header (stdlib.h) and there
 |is no prototype for alloca()? Post the code...
 |
 |christos

No no, that used to be Berkeley Mail before it was mangled ;)

Breakpoint 1, fwrite_td (ptr=0xbb60c520, nmemb=29, f=0xbb9afea0, flags=TD_NONE, 
prefix=0x0, prefixlen=0, size=1) at mime.c:1479
1494            mptr = xmptr = ac_alloc(mptrsz + 1);
0x0804b1ac in alloca@plt ()
0xbb993192 in memcpy () from /lib/libc.so.12

0x0804b1ac in alloca@plt ()

gdb) print mptr
$9 = 0xbfbf91f4 "p
=0r\277\277"

(gdb) info registers esp
esp            0xbfbf91e4       0xbfbf91e4

(gdb) print (char*)ptr
$10 = 0xbb60c520 "From: <Paul_Koning%Dell.com@localhost>\n"

1517                    memcpy(mptr, ptr, csize);

0x0804acac in memcpy@plt ()


(gdb) print (char*)ptr
$11 = 0xbb60c520 "From: <Paul_Koning%Dell.com@localhost>\n"
(gdb) print (char*)mptr
$12 = 0xbfbf91f4 "From: <Paul_Koning%Dell.com@localhost>\n"

(gdb) print csize
$13 = 29


prefixwrite (ptr=0xbfbf91f4, size=1, nmemb=29, f=0xbb9afea0, prefix=0x0, 
prefixlen=0) at mime.c:1361
1361    {


(gdb) print rsz
$14 = <optimized out>
(gdb) print size
$15 = 1
(gdb) print nmemb
$16 = 29
(gdb) 


(gdb) print (char*)ptr
$17 = 0xbfbf91f4 ""




Home | Main Index | Thread Index | Old Index