summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2021-06-05 22:07:57 -0400
committerOri Bernstein <ori@eigenstate.org>2021-06-06 13:07:51 -0400
commit74912993de657a9885d4c1f95ebf64b0c7d5083f (patch)
treebb6282cb2de79b29b339750e10626f12cfb16afb
parentf9ae02033295468dc427b742d098b65537287b06 (diff)
downloadplan9front-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.c23
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)