getpwnam + getpwnam_r + LinuxThreads port = deadlock
Joshua Oreman
oremanj at webserver.get-linux.org
Sat Jul 12 10:29:36 PDT 2003
On Sat, Jul 12, 2003 at 10:47:50AM -0400 or thereabouts, Daniel Eischen wrote:
> On Fri, 11 Jul 2003, Joshua Oreman wrote:
>
> > Hi -hackers,
> >
> > System: FreeBSD 5.0-CURRENT cvsupped around 5.0-RELEASE
> >
> > I'm writing an app that links with the LinuxThreads
> > (/usr/ports/devel/linuxthreads) and also uses getpwnam(). The problem:
> > a deadlock. GDB backtrace:
> >
> > Basically: FreeBSD implements getpwnam() as a wrapper around
> > getpwnam_r(), as seen in src/lib/libc/gen/getpwent.c:
> >
> > So basically, my app calls getpwnam(), which calls the overridden
> > getpwnam_r() from LinuxThreads, which calls getpwnam() from libc
> > again, and then calls getpwnam_r() from LinuxThreads again, and
> > deadlocks trying to recursively lock its own mutex. Obviously, if
> > there was no mutex the stack would leak out the back of my computer
> > :-)
> >
> > Any ideas here?
>
> Three ideas:
>
> 1) Change the linuxthreads port to not implement getpwname
> in the way that it is (or at all and let it use libc's
> version).
Probably the easiest way; just include the getpw(nam|uid)_r
code in #ifndef BSD (or #ifndef __FreeBSD__ if it's only
a FBSD problem).
>
> 2) Change libc so that getpwnam and getpwnam_r are weak
> references to _getpwnam and _getpwnam_r respectively
> and have the "_" versions be the real implementation.
> Make all references in libc use _getpwname and
> _getpwnam_r (including the call to _getpwnam_r in
> _getpwnam).
I think this would still cause the same problem, but not sure.
>
> 3) CVSup to the latest 5.x and use libthr or libkse and
> forget linuxthreads.
Not an option, as my app needs to be runnable on both BSD
and Linux. (So LinuxThreads was a natural choice :-)
Then again, if there's a pthread-compatible wrapper around
libthr, I might be able to consider it...
Well, I think I'll probably do 1) for future users, and
4) (switch to libpth) for now :-)
-- Josh
>
> --
> Dan Eischen
More information about the freebsd-hackers
mailing list