git.c: two fixes, gitsetenv type and off-by-one error.
[gitweb.git] / receive-pack.c
index 1ef0c13935751903efc5c2dee738604a80b75de2..18735061206a813d523fdf29dd3e5b06899f1a1d 100644 (file)
@@ -24,7 +24,7 @@ struct command {
        unsigned char updated;
        unsigned char old_sha1[20];
        unsigned char new_sha1[20];
-       char ref_name[];
+       char ref_name[0];
 };
 
 static struct command *commands = NULL;
@@ -95,6 +95,10 @@ static int update(const char *name,
        char new_hex[60], *old_hex, *lock_name;
        int newfd, namelen, written;
 
+       if (!strncmp(name, "refs/", 5) && check_ref_format(name + 5))
+               return error("refusing to create funny ref '%s' locally",
+                            name);
+
        namelen = strlen(name);
        lock_name = xmalloc(namelen + 10);
        memcpy(lock_name, name, namelen);
@@ -244,11 +248,11 @@ static void unpack(void)
 int main(int argc, char **argv)
 {
        int i;
-       const char *dir = NULL;
+       char *dir = NULL;
 
        argv++;
        for (i = 1; i < argc; i++) {
-               const char *arg = *argv++;
+               char *arg = *argv++;
 
                if (*arg == '-') {
                        /* Do flag handling here */
@@ -261,18 +265,9 @@ int main(int argc, char **argv)
        if (!dir)
                usage(receive_pack_usage);
 
-       /* chdir to the directory. If that fails, try appending ".git" */
-       if (chdir(dir) < 0) {
-               if (chdir(mkpath("%s.git", dir)) < 0)
-                       die("unable to cd to %s", dir);
-       }
-
-       /* If we have a ".git" directory, chdir to it */
-       chdir(".git");
-       putenv("GIT_DIR=.");
+       if(!enter_repo(dir, 0))
+               die("'%s': unable to chdir or not a git archive", dir);
 
-       if (access("objects", X_OK) < 0 || access("refs/heads", X_OK) < 0)
-               die("%s doesn't appear to be a git directory", dir);
        write_head_info();
 
        /* EOF */