Machine: i586 OS: interix5.2 Compiler: gcc Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='i586' -DCONF_OSTYPE='interix5.2' -DCONF_MACHTYPE='i586-pc-interix5.2' -DCONF_VENDOR='pc' -DLOCALEDIR='/tools/snapshot/prefix-launcher-1pre.20071219/i586-pc-interix5.2/share/locale' -DPACKAGE='bash' -DLOCAL_PREFIX=/tools/snapshot/prefix-launcher-1pre.20071219/i586-pc-interix5.2 -DSHELL -DHAVE_CONFIG_H -DNO_MAIN_ENV_ARG -DBROKEN_DIRENT_D_INO -D_POSIX_SOURCE -I. -I/tss/prefix-launcher-1pre.20071219/buildroot/bash/bash-3.2 -I/tss/prefix-launcher-1pre.20071219/buildroot/bash/bash-3.2/include -I/tss/prefix-launcher-1pre.20071219/buildroot/bash/bash-3.2/lib -g -O2 uname output: Interix pc312001 5.2 SP-9.0.3790.3034 x86 Intel_x86_Family6_Model15_Stepping6 Machine Type: i586-pc-interix5.2
Bash Version: 3.2 Patch Level: 33 Release Status: release Description: Bash uses getcwd-replacement if libc provides getcwd without the feature of allocating the buffer when called without one. This override is done in config-bot.h, with an exception for solaris already. Problem now is that getcwd-replacement does not work on Interix (SUA 5.2 here). Now there's only one source location in builtins/common.c really relying on getcwd(0,0) allocating the buffer. But even here is some conditional code on GETCWD_BROKEN. So why not simply don't require allocation-feature of getcwd at all and use getcwd-replacement only if libc does not provide one ? Repeat-By: $ PWD= /tools/snapshot/prefix-launcher-1pre.20071219/i586-pc-interix5.2/bin/bash shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory Fix: (patch attached) builtins/common.c: Do not depend on getcwd() doing buffer allocation. config-bot.h: Ignore GETCWD_BROKEN, keep HAVE_GETCWD as is. Additionally, the check for GETCWD_BROKEN can be dropped from configure.in and aclocal.m4. Thanks! /haubi/ -- Michael Haubenwallner Gentoo on a different level
diff -ru builtins/common.c builtins/common.c --- builtins/common.c Wed Dec 19 10:30:07 2007 +++ builtins/common.c Wed Dec 19 10:34:58 2007 @@ -479,11 +479,8 @@ if (the_current_working_directory == 0) { -#if defined (GETCWD_BROKEN) - the_current_working_directory = getcwd (0, PATH_MAX); -#else - the_current_working_directory = getcwd (0, 0); -#endif + char *t = xmalloc(PATH_MAX); + the_current_working_directory = getcwd (t, PATH_MAX); if (the_current_working_directory == 0) { fprintf (stderr, _("%s: error retrieving current directory: %s: %s\n"), diff -ru config-bot.h config-bot.h --- config-bot.h Wed Dec 19 10:30:06 2007 +++ config-bot.h Wed Dec 19 10:31:16 2007 @@ -70,14 +70,6 @@ # define TERMIOS_MISSING #endif -/* If we have a getcwd(3), but one that does not dynamically allocate memory, - #undef HAVE_GETCWD so the replacement in getcwd.c will be built. We do - not do this on Solaris, because their implementation of loopback mounts - breaks the traditional file system assumptions that getcwd uses. */ -#if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN) && !defined (SOLARIS) -# undef HAVE_GETCWD -#endif - #if !defined (HAVE_DEV_FD) && defined (NAMED_PIPES_MISSING) # undef PROCESS_SUBSTITUTION #endif diff -ru configure.in configure.in --- configure.in Wed Dec 19 10:30:09 2007 +++ configure.in Wed Dec 19 10:37:08 2007 @@ -894,9 +894,6 @@ BASH_FUNC_OPENDIR_CHECK BASH_FUNC_ULIMIT_MAXFDS BASH_FUNC_GETENV -if test "$ac_cv_func_getcwd" = "yes"; then -BASH_FUNC_GETCWD -fi BASH_FUNC_POSIX_SETJMP BASH_FUNC_STRCOLL diff -ru aclocal.m4 aclocal.m4 --- aclocal.m4 Tue Sep 12 23:18:07 2006 +++ aclocal.m4 Wed Dec 19 10:37:33 2007 @@ -684,32 +684,6 @@ fi ]) -AC_DEFUN(BASH_FUNC_GETCWD, -[AC_MSG_CHECKING([if getcwd() will dynamically allocate memory]) -AC_CACHE_VAL(bash_cv_getcwd_malloc, -[AC_TRY_RUN([ -#include <stdio.h> -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -main() -{ - char *xpwd; - xpwd = getcwd(0, 0); - exit (xpwd == 0); -} -], bash_cv_getcwd_malloc=yes, bash_cv_getcwd_malloc=no, - [AC_MSG_WARN(cannot check whether getcwd allocates memory when cross-compiling -- defaulting to no) - bash_cv_getcwd_malloc=no] -)]) -AC_MSG_RESULT($bash_cv_getcwd_malloc) -if test $bash_cv_getcwd_malloc = no; then -AC_DEFINE(GETCWD_BROKEN) -AC_LIBOBJ(getcwd) -fi -]) - dnl dnl This needs BASH_CHECK_SOCKLIB, but since that's not called on every dnl system, we can't use AC_PREREQ