X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=refs.c;h=b8fcb98dad976c529dcccbaf592f567931b9a360;hb=ee34518d629331dadd58b1a75294369d679eda8b;hp=ac2619851d63e45a5f0d97b780e59af60fcc182b;hpb=0870ca7fabe6f25095431280e480859f7c66e8ab;p=git.git diff --git a/refs.c b/refs.c index ac261985..b8fcb98d 100644 --- a/refs.c +++ b/refs.c @@ -292,6 +292,8 @@ int write_ref_sha1(const char *ref, int fd, const unsigned char *sha1) return -1; filename = ref_file_name(ref); lock_filename = ref_lock_file_name(ref); + if (safe_create_leading_directories(filename)) + die("unable to create leading directory for %s", filename); retval = write_ref_file(filename, lock_filename, fd, sha1); free(filename); free(lock_filename); @@ -343,6 +345,11 @@ int check_ref_format(const char *ref) if (!ch) { if (level < 2) return -1; /* at least of form "heads/blah" */ + + /* do not allow ref name to end in "HEAD" */ + if (cp - ref > 4 && !strcmp(cp - 4, "HEAD")) + return -1; + return 0; } } @@ -358,6 +365,8 @@ int write_ref_sha1_unlocked(const char *ref, const unsigned char *sha1) return -1; filename = ref_file_name(ref); lock_filename = ref_lock_file_name(ref); + if (safe_create_leading_directories(filename)) + die("unable to create leading directory for %s", filename); fd = open(lock_filename, O_WRONLY | O_CREAT | O_EXCL, 0666); if (fd < 0) { error("Writing %s", lock_filename);