diff options
author | Ori Bernstein <ori@eigenstate.org> | 2021-06-05 22:07:57 -0400 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2021-06-06 13:07:51 -0400 |
commit | 74912993de657a9885d4c1f95ebf64b0c7d5083f (patch) | |
tree | bb6282cb2de79b29b339750e10626f12cfb16afb | |
parent | f9ae02033295468dc427b742d098b65537287b06 (diff) | |
download | plan9front-74912993de657a9885d4c1f95ebf64b0c7d5083f.tar.xz |
git/commit: allow passing absolute paths
we would treat paths as relative, and not
step past leading '/'s, leading to an infinte
loop.
-rw-r--r-- | sys/src/cmd/git/save.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/sys/src/cmd/git/save.c b/sys/src/cmd/git/save.c index 69e5c2b01..5275817ba 100644 --- a/sys/src/cmd/git/save.c +++ b/sys/src/cmd/git/save.c @@ -345,18 +345,25 @@ void main(int argc, char **argv) { Hash th, ch, parents[Maxparents]; - char *msg, *name, *email, *dstr; - int i, r, nparents; + char *msg, *name, *email, *dstr, cwd[1024]; + int i, r, ncwd, nparents; vlong date; Object *t; + gitinit(); + gitinit(); + if(access(".git", AEXIST) != 0) + sysfatal("could not find git repo: %r"); + if(getwd(cwd, sizeof(cwd)) == nil) + sysfatal("getcwd: %r"); msg = nil; name = nil; email = nil; dstr = nil; date = time(nil); nparents = 0; - gitinit(); + ncwd = strlen(cwd); + ARGBEGIN{ case 'm': msg = EARGF(usage()); break; case 'n': name = EARGF(usage()); break; @@ -385,12 +392,14 @@ main(int argc, char **argv) } if(msg == nil || name == nil) usage(); - for(i = 0; i < argc; i++) + for(i = 0; i < argc; i++){ cleanname(argv[i]); + if(*argv[i] == '/' && strncmp(argv[i], cwd, ncwd) == 0) + argv[i] += ncwd; + while(*argv[i] == '/') + argv[i]++; + } - gitinit(); - if(access(".git", AEXIST) != 0) - sysfatal("could not find git repo: %r"); t = findroot(); r = treeify(t, argv, argv + argc, 0, &th); if(r == -1) |