summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2014-03-24 06:26:49 -0500
committerRob Landley <rob@landley.net>2014-03-24 06:26:49 -0500
commit02f5a30ec0acf6c42441e5b06fb3ab41f629952a (patch)
tree0c4dd7cd7acc4500302f88fb5f784110773cdd33 /lib
parent64f61640880011b991931ac30371719edd88e65d (diff)
downloadtoybox-02f5a30ec0acf6c42441e5b06fb3ab41f629952a.tar.gz
toybox-02f5a30ec0acf6c42441e5b06fb3ab41f629952a.tar.bz2
toybox-02f5a30ec0acf6c42441e5b06fb3ab41f629952a.zip
Fix mkdir -p with absolute paths.
Stripping leading / is not the right thing to do there. Broken when the code moved to lib and was genericized for use elsewhere.
Diffstat (limited to 'lib')
-rw-r--r--lib/lib.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 1efb642..c1029d2 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -135,15 +135,12 @@ int mkpathat(int atfd, char *dir, mode_t lastmode, int flags)
return 1;
}
- // Skip leading / of absolute paths
- while (*dir == '/') dir++;
-
- for (s=dir; ;s++) {
+ for (s = dir; ;s++) {
char save = 0;
mode_t mode = (0777&~toys.old_umask)|0300;
- // Skip leading / of absolute paths.
- if (*s == '/' && (flags&2)) {
+ // find next '/', but don't try to mkdir "" at start of absolute path
+ if (*s == '/' && (flags&2) && s != dir) {
save = *s;
*s = 0;
} else if (*s) continue;