git: 9front

Download patch

ref: c2764eea3808b84ff158be656a3558919c12eb04
parent: 4c9630e97e69893be16b1c25f611c894d3a97044
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Aug 5 03:12:37 EDT 2024

git/fs: don't allow walking blobs

--- a/sys/src/cmd/git/fs.c
+++ b/sys/src/cmd/git/fs.c
@@ -72,9 +72,11 @@
 
 #define Eperm	"permission denied"
 #define Eexist	"file does not exist"
+#define Enotdir	"is not a directory"
 #define E2long	"path too long"
 #define Enodir	"not a directory"
 #define Erepo	"unable to read repo"
+#define Eimpl	"not implemented"
 #define Egreg	"wat"
 #define Ebadobj	"invalid object"
 
@@ -472,7 +474,11 @@
 	e = nil;
 	if(!o)
 		return Eexist;
-	if(o->type == GTree){
+	switch(o->type){
+	case GBlob:
+		e = Enotdir;
+		break;
+	case GTree:
 		q->type = 0;
 		for(i = 0; i < o->tree->nent; i++){
 			if(strcmp(o->tree->ent[i].name, name) != 0)
@@ -495,7 +501,8 @@
 		}
 		if(!w)
 			e = Eexist;
-	}else if(o->type == GCommit){
+		break;
+	case  GCommit:
 		q->type = 0;
 		c->mtime = o->commit->mtime;
 		c->mode = 0644;
@@ -521,8 +528,10 @@
 		}
 		else
 			e = Eexist;
-	}else if(o->type == GTag){
-		e = "tag walk unimplemented";
+		break;
+	case GTag:
+		e = Eimpl;
+		break;
 	}
 	return e;
 }
--