Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > gnu.bash.bug > #14964
| Path | csiph.com!goblin3!goblin1!goblin.stu.neva.ru!usenet.stanford.edu!not-for-mail |
|---|---|
| From | Eduardo A. Bustamante López <dualbus@gmail.com> |
| Newsgroups | gnu.bash.bug |
| Subject | Re: difference between /tmp and other directory for loadable mkdir? |
| Date | Wed, 26 Dec 2018 11:56:15 -0800 |
| Lines | 91 |
| Approved | bug-bash@gnu.org |
| Message-ID | <mailman.6330.1545854186.1284.bug-bash@gnu.org> (permalink) |
| References | <CABrM6wmWnNA0PZmdd=C5Y1-ABSJ_beHdY4V5NSzgZROUCUP5WQ@mail.gmail.com> |
| NNTP-Posting-Host | lists.gnu.org |
| Mime-Version | 1.0 |
| Content-Type | text/plain; charset=us-ascii |
| X-Trace | usenet.stanford.edu 1545854187 18987 208.118.235.17 (26 Dec 2018 19:56:27 GMT) |
| X-Complaints-To | action@cs.stanford.edu |
| Cc | bug-bash <bug-bash@gnu.org> |
| To | Peng Yu <pengyu.ut@gmail.com> |
| Envelope-to | bug-bash@gnu.org |
| DKIM-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:mail-followup-to:references :mime-version:content-disposition:in-reply-to:user-agent; bh=CAOp41GvtLbMsVakH35wq2bmS2EPXazJ0+RI5kxJhDQ=; b=VFrbGURc2EKS6h0n4e0drY9Pt6XoRdslGkmI7RV1zXqLxXfqPuP1Nmp4Gg4Pnj3Fzk NHWSoqnY7JjbkMXhnTyqjn3v7DoSMR3bxtjPUP1Q7G2o0qQ1OPEcCa5gRPW3EgscvP69 R3JPHMFDRj9vtWRnoCNXuxV44QR7S/Xfo7dEfEgdP64R/cOH4gNxni41ppIBDXs/N8vg jw8mljYXDcmq0wMZzd2mKZ8vAIjnL1TAGX13MxwX+vtyM963UraFUFftp8yRyJ/FcWeJ GMAX1WEdIQIJQ3nU0EgCow2Ewu+RCEO4FILFEw0HnRRtei5XAeOdeZQr4AESkhmXdPM1 1u7Q== |
| X-Google-DKIM-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id :mail-followup-to:references:mime-version:content-disposition :in-reply-to:user-agent; bh=CAOp41GvtLbMsVakH35wq2bmS2EPXazJ0+RI5kxJhDQ=; b=EDdMBY7+sog0I5wSl/KLWiX4bo9ZcebqMdUawcbKWEgOtRTdccKaUUInoscbD1hOpN TVGtZ6jNKMLu1/VyWComv8kimceQwU6I+WfzsuAouEiaNvhdm4YCMogvF3jnQVuTE0kH uOMMRhwqKK3jQJm6l1TaSiWqJ9T/waLBRD7kmLQTjQC8Ocsvw66K9mtvrdM3DdW2G2XC XQ7v1kFvJgwiur5r1eSdYMS17qcCodid5tF4zH4UY+hWri7i5AP1C/zbII1Prah7r7LF RkyStvet+S3yobUPAcq7qF8aiD+IjnPbZFnUDNRKg6WAjZ/+t0cJIRS3ZZhnKLxcCUbe I+PA== |
| X-Gm-Message-State | AJcUukdcVMO9jvQRwbrSWTuQwwKwAsnZ/UPK3XTnmBx385k+V2HZCdU8 jsQetlnXSiJb/YcFyLbP/5g= |
| X-Google-Smtp-Source | ALg8bN6xL4+7OpKZis1JD6C7BbaBjQyNu//9DKQ+YtST8J5lUpLPVwmo1nXTgQ8Bi97IWtFVhWAkqw== |
| X-Received | by 2002:a63:f844:: with SMTP id v4mr19962782pgj.82.1545854178025; Wed, 26 Dec 2018 11:56:18 -0800 (PST) |
| Mail-Followup-To | Peng Yu <pengyu.ut@gmail.com>, bug-bash <bug-bash@gnu.org> |
| Content-Disposition | inline |
| In-Reply-To | <CABrM6wmWnNA0PZmdd=C5Y1-ABSJ_beHdY4V5NSzgZROUCUP5WQ@mail.gmail.com> |
| User-Agent | Mutt/1.10.1 (2018-07-13) |
| X-detected-operating-system | by eggs.gnu.org: Genre and OS details not recognized. |
| X-Received-From | 2607:f8b0:4864:20::52d |
| X-BeenThere | bug-bash@gnu.org |
| X-Mailman-Version | 2.1.21 |
| Precedence | list |
| List-Id | Bug reports for the GNU Bourne Again SHell <bug-bash.gnu.org> |
| List-Unsubscribe | <https://lists.gnu.org/mailman/options/bug-bash>, <mailto:bug-bash-request@gnu.org?subject=unsubscribe> |
| List-Archive | <http://lists.gnu.org/archive/html/bug-bash/> |
| List-Post | <mailto:bug-bash@gnu.org> |
| List-Help | <mailto:bug-bash-request@gnu.org?subject=help> |
| List-Subscribe | <https://lists.gnu.org/mailman/listinfo/bug-bash>, <mailto:bug-bash-request@gnu.org?subject=subscribe> |
| Xref | csiph.com gnu.bash.bug:14964 |
Show key headers only | View raw
On Wed, Dec 26, 2018 at 12:40:09PM -0600, Peng Yu wrote:
> Hi,
>
> I can not mkdir -p . in /tmp/ via the loadable mkdir. What is the
> difference between /tmp/ and other directories? I am on Mac OS X. Is
> this a bug in mkdir?
>
> $ cd /tmp
> $ mkdir -p -- .
> -bash: mkdir: .: Operation not permitted
I can reproduce this in Linux
[Linux debian 4.18.0-3-amd64 #1 SMP Debian 4.18.20-2 (2018-11-23) x86_64 GNU/Linux]
dualbus@debian:~/src/gnu/bash$ strace -e trace=%file -f ./bash -c 'enable -f examples/loadables/mkdir mkdir && mkdir -p -- /tmp'
execve("./bash", ["./bash", "-c", "enable -f examples/loadables/mkd"...], 0x7fff7c9b1c18 /* 33 vars */) = 0
(...)
stat("/home/dualbus/src/gnu/bash", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/dualbus", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/dualbus/src", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/dualbus/src/gnu", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/dualbus/src/gnu/bash", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/dualbus/src/iovisor/bcc", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
openat(AT_FDCWD, "examples/loadables/mkdir", O_RDONLY|O_CLOEXEC) = 3
getcwd("/home/dualbus/src/gnu/bash", 128) = 27
stat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0
chmod("/tmp", 0755) = -1 EPERM (Operation not permitted)
openat(AT_FDCWD, "/usr/share/locale/en_CA/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/share/locale/en_CA/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/share/locale/en/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
./bash: line 0: mkdir: /tmp: Operation not permitted
+++ exited with 1 +++
dualbus@debian:~/src/gnu/bash$ stat /tmp
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fe01h/65025d Inode: 25427969 Links: 18
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-12-26 11:08:30.062681076 -0800
Modify: 2018-12-26 11:37:56.826984422 -0800
Change: 2018-12-26 11:37:56.826984422 -0800
Birth: -
If you look at the source, it calls the mkdir() function to create the directory.
dualbus@debian:~/src/gnu/bash$ cat -n examples/loadables/mkdir.c | sed -n '174,180p'
174 if (stat (npath, &sb) != 0)
175 {
176 if (mkdir (npath, parent_mode)) <- this
177 {
178 builtin_error ("cannot create directory `%s': %s", npath, strerror (errno));
179 umask (original_umask);
180 free (npath);
Ref: http://git.savannah.gnu.org/cgit/bash.git/tree/examples/loadables/mkdir.c?h=6870125961b85baa9628ce4c5fbbca94e8046656#n174
Comparing to GNU coreutils' mkdir (which uses gnulib):
dualbus@debian:~$ strace -e trace=%file -f mkdir -p /tmp/
execve("/bin/mkdir", ["mkdir", "-p", "/tmp/"], 0x7fff4f7a11b8 /* 33 vars */) = 0
(...)
mkdir("/tmp/", 0777) = -1 EEXIST (File exists)
stat("/tmp/", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0
+++ exited with 0 +++
My guess is that the "problem" has to do with how bash computes the `parent_mode':
dualbus@debian:~/src/gnu/bash$ cat -n examples/loadables/mkdir.c | sed -n '106,114p'
106 /* Make the new mode */
107 original_umask = umask (0);
108 umask (original_umask);
109
110 nmode = (S_IRWXU | S_IRWXG | S_IRWXO) & ~original_umask;
111 parent_mode = nmode | (S_IWUSR|S_IXUSR); /* u+wx */
112
113 /* Adjust new mode based on mode argument */
114 nmode &= omode;
Ref: http://git.savannah.gnu.org/cgit/bash.git/tree/examples/loadables/mkdir.c?h=6870125961b85baa9628ce4c5fbbca94e8046656#n106
In gnulib, this is what is used to create the parent directories:
Ref: http://git.savannah.gnu.org/cgit/gnulib.git/tree/lib/mkdir-p.c?h=95c96b6dddd31f3676f72ed044d0c493ab5642d8#n116
Back to gnu.bash.bug | Previous | Next | Find similar | Unroll thread
Re: difference between /tmp and other directory for loadable mkdir? Eduardo A. Bustamante López <dualbus@gmail.com> - 2018-12-26 11:56 -0800
csiph-web