From owner-freebsd-threads@FreeBSD.ORG Thu Jun 30 17:25:54 2005 Return-Path: X-Original-To: freebsd-threads@FreeBSD.org Delivered-To: freebsd-threads@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C3C0E16A41C; Thu, 30 Jun 2005 17:25:54 +0000 (GMT) (envelope-from tataz@tataz.chchile.org) Received: from postfix3-2.free.fr (postfix3-2.free.fr [213.228.0.169]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5300C43D1D; Thu, 30 Jun 2005 17:25:54 +0000 (GMT) (envelope-from tataz@tataz.chchile.org) Received: from tatooine.tataz.chchile.org (vol75-8-82-233-239-98.fbx.proxad.net [82.233.239.98]) by postfix3-2.free.fr (Postfix) with ESMTP id DD5AAC085; Thu, 30 Jun 2005 19:25:52 +0200 (CEST) Received: by tatooine.tataz.chchile.org (Postfix, from userid 1000) id B9819405B; Thu, 30 Jun 2005 19:26:03 +0200 (CEST) Date: Thu, 30 Jun 2005 19:26:03 +0200 From: Jeremie Le Hen To: freebsd-hackers@FreeBSD.org Message-ID: <20050630172602.GI49933@obiwan.tataz.chchile.org> References: <20050630165017.GH49933@obiwan.tataz.chchile.org> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20050630165017.GH49933@obiwan.tataz.chchile.org> User-Agent: Mutt/1.5.9i Cc: freebsd-threads@FreeBSD.org Subject: Re: ProPolice and pthreads (was: ProPolice and FreeBSD) X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Jun 2005 17:25:54 -0000 [ I'm not snipping anything since I'm Cc'ing to -threads@. ] On Thu, Jun 30, 2005 at 06:50:17PM +0200, Jeremie Le Hen wrote: > Hello, > > maybe this question should be asked on -threads@, I'm not sure. If it > is, please tell me and I will redirect my mail. > > I'm working on upgrading the ProPolice/SSP patch [1] to -CURRENT. I > initially used the patch against FreeBSD 5.1 to know which file I > should modify and in which way in the source tree, but I used the > newest patch against gcc 3.4.1 for gcc specific stuffs. > > After a little work, I got a full FreeBSD built with SSP functions > compiled in libc (it is also possible to compile it in libgcc but, > AFAIU, this would require the SSP stuff to be statically built in > all binaries since FreeBSD doesn't provide a shared libgcc). I also > read somewhere that some guys of the hardened Debian project have made > a libssp, but I find this a little bit overkill (comments ?). > > I recompiled host(1), libc and libpthread with debugging symbol. > > Now the questions. All binaries linked against libpthread immediately > get a SIGSEGV : > %%% > coyote:libc# gdb /usr/bin/host > GNU gdb 6.1.1 [FreeBSD] > Copyright 2004 Free Software Foundation, Inc. > GDB is free software, covered by the GNU General Public License, and you are > welcome to change it and/or distribute copies of it under certain conditions. > Type "show copying" to see the conditions. > There is absolutely no warranty for GDB. Type "show warranty" for details. > This GDB was configured as "i386-marcel-freebsd"... > (gdb) r > Starting program: /usr/bin/host > warning: Unable to get location for thread creation breakpoint: generic error > [New LWP 100135] > > Program received signal SIGSEGV, Segmentation fault. > [Switching to LWP 100135] > _thr_cancel_enter (thread=0x0) > at /usr/src/lib/libpthread/thread/thr_cancel.c:269 > 269 THR_THREAD_LOCK(thread, thread); > (gdb) bt full > #0 _thr_cancel_enter (thread=0x0) > at /usr/src/lib/libpthread/thread/thr_cancel.c:269 > No locals. > #1 0x282dd51b in __open (path=0x281bc0c0 "ÀÀ\033( \220\033(", flags=0) > at /usr/src/lib/libpthread/thread/thr_open.c:53 > curthread = (struct pthread *) 0x0 > ret = 0 > mode = 0 > #2 0x2838f40b in __guard_setup () > at /usr/src/lib/libc/sys/stack_protector.c:51 > fd = 0 > #3 0x283cbe22 in lseek () from /lib/libc.so.6 > No symbol table info available. > #4 0x28316dd1 in _init () from /lib/libc.so.6 > No symbol table info available. > #5 0x281b8000 in ?? () > No symbol table info available. > #6 0x281ad6fc in ?? () from /libexec/ld-elf.so.1 > No symbol table info available. > #7 0xbfbfeca8 in ?? () > No symbol table info available. > #8 0x2818cc79 in find_symdef () from /libexec/ld-elf.so.1 > No symbol table info available. > #9 0x2818b759 in _rtld () from /libexec/ld-elf.so.1 > No symbol table info available. > #10 0x2818a98e in .rtld_start () from /libexec/ld-elf.so.1 > No symbol table info available. > %%% > > __guard_setup() is the constructor of the SSP patch, it generates a > random cookie for the application runtime : > %%% > static void __guard_setup(void) __attribute__ ((constructor)); > static void > __guard_setup(void) > { > int fd; > if (__guard[0]!=0) return; > fd = open ("/dev/urandom", 0); > if (fd != -1) { > ssize_t size = read (fd, (char*)&__guard, sizeof(__guard)); > close (fd) ; > if (size == sizeof(__guard)) return; > } > /* If a random generator can't be used, the protector switches the guard > to the "terminator canary" */ > ((char*)__guard)[0] = 0; ((char*)__guard)[1] = 0; > ((char*)__guard)[2] = '\n'; ((char*)__guard)[3] = 255; > } > %%% > > I am neither a gcc hacker nor a thread guru, so I have no clue on how to > resolve this issue. Advices are welcome. > > Thanks. > > Regards, > [1] http://www.trl.ibm.com/projects/security/ssp/ cognet@ sent me the following patch and it makes pthreaded programs work like a charm. He also said me that this change will be surely needed for libthr. %%% cvs diff: Diffing . Index: thr_open.c =================================================================== RCS file: /nfs/donald/repo/FreeBSD/src/lib/libpthread/thread/thr_open.c,v retrieving revision 1.16 diff -u -p -r1.16 thr_open.c --- thr_open.c 9 Dec 2003 02:20:56 -0000 1.16 +++ thr_open.c 30 Jun 2005 17:19:03 -0000 @@ -45,11 +45,14 @@ __weak_reference(__open, open); int __open(const char *path, int flags,...) { - struct pthread *curthread = _get_curthread(); + struct pthread *curthread; int ret; int mode = 0; va_list ap; + if (_thr_initial == NULL) + _libpthread_init(NULL); + curthread = _get_curthread(); _thr_cancel_enter(curthread); /* Check if the file is being created: */ %%% For now, I'm including this in my ProPolice patch. Regards, -- Jeremie Le Hen < jeremie at le-hen dot org >< ttz at chchile dot org >