bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bug] Problem with cd -@ if filesystem does not support extended att


From: Lionel Cons
Subject: Re: [bug] Problem with cd -@ if filesystem does not support extended attributes (O_XATTR)
Date: Wed, 6 Nov 2013 16:47:03 +0100

On 6 November 2013 13:16, Joshuah Hurst <address@hidden> wrote:
> Chet, on Solaris the /devices filesystem does not support extended
> attributes (O_XATTR), yet cd -@ returns 0 (success):
>
> ./bash -c 'cd -@ /devices 2>/dev/null; echo $?'
> 0
> ~/bin/ksh -c 'cd -@ /devices 2>/dev/null; echo $?'
> 1
>
> truss shows that bash gets errno==EINVAL but then uses
> chdir("/devices") instead of returning the error:
> stat64("/devices", 0x08047520)                  = 0
> open64("/devices", O_RDONLY|O_NONBLOCK)         = 3
> openat64(3, ".", O_RDONLY|O_XATTR)              Err#22 EINVAL
> close(3)                                        = 0
> chdir("/devices")                               = 0
> brk(0x0819C000)                                 = 0
>
> Josh

Thanks

The following patch should fix the bugs (build+cd -@ /devices):
===============================
diff --git a/builtins/cd.def b/builtins/cd.def
index 498cf88..7dd9684 100644
--- a/builtins/cd.def
+++ b/builtins/cd.def
@@ -194,7 +194,7 @@ cdxattr (dir, ndirp)
 {
 #if defined (O_XATTR)
   int apfd, fd, r, e;
-  char buf[11+40+40];  /* construct new `fake' path for pwd */
+  char buff[11+40+40]; /* construct new `fake' path for pwd */

   apfd = openat (AT_FDCWD, dir, O_RDONLY|O_NONBLOCK);
   if (apfd < 0)
@@ -630,7 +630,7 @@ change_to_directory (newdir, nolinks, xattr)
   /* We're not in physical mode (nolinks == 0), but we failed to change to
      the canonicalized directory name (TDIR).  Try what the user passed
      verbatim. If we succeed, reinitialize the_current_working_directory. */
-  if (chdir (newdir) == 0)
+  if (!xattr && (chdir (newdir) == 0))
     {
       t = resetpwd ("cd");
       if (t == 0)
===============================

After applying the patch I get:

./bash -c 'cd -@ /devices ; echo $?'
./bash: line 0: cd: /devices: Invalid argument
1 <--- correct
./bash -c 'cd -@ / ; ls -l'
total 2
-r--r--r--   1 root     root         156 Sep 18 05:05 SUNWattr_ro
-rw-r--r--   1 root     root         472 Sep 18 05:05 SUNWattr_rw

Lionel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]