Bug#410145: fakechroot: narrow_chroot_path misimplements getcwd, and breaks make

2007-02-08 Thread Mark Eichin

 (I went digging for this in search of an explanation for a
/bin/sh: line 1: cd: .: No such file or directory
  message from deep in a 
 fakeroot/fakechroot/pdebuild/pbuilder/dpkg-buildpackage
  stack, and will see if this helps shortly... but since it's clearly
  wrong even if it doesn't, I figured I'd get the bug report out the
  door promptly.)

FTR the obvious fix *does* fix the cd problem, not just the
entering directory problem, and my somewhat-hacked pbuilder has
successfully built samba and apache (among other things) using this
fakechroot.


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Bug#410145: fakechroot: narrow_chroot_path misimplements getcwd, and breaks make

2007-02-07 Thread Mark Eichin
Package: fakechroot
Version: 2.5-1.1
Severity: important

Inside fakechroot, make displays 

 make[1]: Entering directory `/home/eichin/'

ie. it display the *outside* path.  Yet a Makefile target running pwd
gives the correct value.  (I was hunting this down in search of
another problem...)

Turns out that this is a fakeroot bug.  getcwd is documented in
getcwd(3) as:

   The  getcwd() function copies an absolute pathname of the current work-
   ing directory to the array pointed to by buf, which is of length  size.
 
Note that further on, the man page only suggests the return value as
having meaning in two cases: it's NULL if the call can't fit the path
in the buffer, and a linux-specific hack of having getcwd malloc() the
value if buf is NULL.

gnu make, being quite portable code, simply calls:
  if (getcwd (current_directory, GET_PATH_MAX) == 0)

and expects current_directory to have the desired value.

fakechroot-2.5/src/libfakechroot.c #define narrow_chroot_path, in the
typical (not in /) case, does this:

(path) = ((path) + strlen(fakechroot_path)); \

ie. returns a pointer that skips over the prefix.  That's Not Right :-)

The obvious fix is to do something like

   memmove(path, path+strlen(fakechroot_path), 
1+strlen(path)-strlen(fakechroot_path))

instead, though I have not tested this.  I've also noted that bash
uses the return value ignored form in the only two places it
actually calls the function, so builtins probably have buggy behaviour
here too:

./parse.y:4146: if (getcwd (t_string, sizeof(t_string)) == 0)
./jobs.c:355:  dir = getcwd (d, sizeof(d));
   if (dir)
  dir = d;

(I went digging for this in search of an explanation for a
   /bin/sh: line 1: cd: .: No such file or directory
 message from deep in a fakeroot/fakechroot/pdebuild/pbuilder/dpkg-buildpackage
 stack, and will see if this helps shortly... but since it's clearly
 wrong even if it doesn't, I figured I'd get the bug report out the
 door promptly.)



-- System Information:
Debian Release: 4.0
  APT prefers testing
  APT policy: (500, 'testing'), (500, 'stable')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.14.1manekineko
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)

Versions of packages fakechroot depends on:
ii  libc62.3.6.ds1-8 GNU C Library: Shared libraries

fakechroot recommends no packages.

-- no debconf information


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]