Date: Tue, 27 Oct 1998 15:11:17 -0800 (PST) From: edavis@hooked.net To: freebsd-gnats-submit@FreeBSD.ORG Subject: bin/8469: fchdir not implemented in libc_r Message-ID: <199810272311.PAA08659@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 8469
>Category: bin
>Synopsis: fchdir not implemented in libc_r
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Oct 27 15:20:00 PST 1998
>Last-Modified:
>Originator: Eric Davis
>Organization:
>Release: FreeBSD 2.2.7
>Environment:
FreeBSD core.hooked.net 2.2.7-STABLE FreeBSD 2.2.7-STABLE #0: Tue Oct 27 12:04:10 PST 1998 edavis@core.hooked.net:/usr/src/sys/compile/CORE i386
>Description:
fchdir() is broken for apps linked against libc_r
>How-To-Repeat:
One way:
Try compiling an application that contains a call to fchdir() using
the '-pthread' argument to force the use of libc_r:
#include <unistd.h>
#include <fcntl.h>
void main()
{
int fd;
fd = open("/etc", 0, 0);
fchdir(fd);
}
core [133] [~] cc -pthread main.c
/var/tmp/ccB105761.o: Undefined symbol `_fchdir' referenced from text segment
/usr/lib/libc_r.so.3.0: Undefined symbol `_fchdir' referenced
Second way:
Call the realpath() library function which in turn calls fchdir().
This application will compile cleanly and cause a run time error:
#include <sys/param.h>
#include <stdlib.h>
void main()
{
char path[MAXPATHLEN];
realpath("/etc", path);
}
core [142] [~] cc -pthread main.c
core [143] [~] ./a.out
/usr/libexec/ld.so: Undefined symbol "_fchdir" called from a.out:/usr/lib/libc_r.so.3.0 at 0x200886a8
>Fix:
Apply the following patch to the libc_r source directory:
diff -rN /usr/src/lib/libc_r.orig/uthread/Makefile.inc /usr/src/lib/libc_r/uthre
ad/Makefile.inc
31a32
> uthread_fchdir.c \
diff -rN /usr/src/lib/libc_r.orig/uthread/uthread_fchdir.c /usr/src/lib/libc_r/u
thread/uthread_fchdir.c
0a1,51
> /*
> * Copyright (c) 1995 John Birrell <jb@cimlogic.com.au>.
> * All rights reserved.
> *
> * Redistribution and use in source and binary forms, with or without
> * modification, are permitted provided that the following conditions
> * are met:
> * 1. Redistributions of source code must retain the above copyright
> * notice, this list of conditions and the following disclaimer.
> * 2. Redistributions in binary form must reproduce the above copyright
> * notice, this list of conditions and the following disclaimer in the
> * documentation and/or other materials provided with the distribution.
> * 3. All advertising materials mentioning features or use of this software
> * must display the following acknowledgement:
> * This product includes software developed by John Birrell.
> * 4. Neither the name of the author nor the names of any co-contributors
> * may be used to endorse or promote products derived from this software
> * without specific prior written permission.
> *
> * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> * SUCH DAMAGE.
> *
> */
> #include <sys/types.h>
> #include <unistd.h>
> #include <dirent.h>
> #ifdef _THREAD_SAFE
> #include <pthread.h>
> #include "pthread_private.h"
>
> int
> fchdir(int fd)
> {
> int ret;
>
> if ((ret = _thread_fd_lock(fd, FD_WRITE, NULL, __FILE__, __LINE__)) == 0
) {
> ret = _thread_sys_fchdir(fd);
> _thread_fd_unlock(fd, FD_WRITE);
> }
> return (ret);
> }
> #endif
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810272311.PAA08659>
