Code

config.c:store_write_pair(): don't read the byte before a malloc'd buffer.
[git.git] / entry.c
diff --git a/entry.c b/entry.c
index 23687af7d5d140fa3ddc7a884acfa8a3412ed869..ef88f62ce82e7188a8d1863227a87033543958fb 100644 (file)
--- a/entry.c
+++ b/entry.c
@@ -54,7 +54,7 @@ static void remove_subtree(const char *path)
        struct dirent *de;
        char pathbuf[PATH_MAX];
        char *name;
-       
+
        if (!dir)
                die("cannot opendir %s (%s)", path, strerror(errno));
        strcpy(pathbuf, path);
@@ -112,6 +112,16 @@ static int write_entry(struct cache_entry *ce, char *path, const struct checkout
                if (!new)
                        return error("git-checkout-index: unable to read sha1 file of %s (%s)",
                                path, sha1_to_hex(ce->sha1));
+
+               /*
+                * Convert from git internal format to working tree format
+                */
+               buf = convert_to_working_tree(ce->name, new, &size);
+               if (buf) {
+                       free(new);
+                       new = buf;
+               }
+
                if (to_tempfile) {
                        strcpy(path, ".merge_file_XXXXXX");
                        fd = mkstemp(path);
@@ -123,15 +133,6 @@ static int write_entry(struct cache_entry *ce, char *path, const struct checkout
                                path, strerror(errno));
                }
 
-               /*
-                * Convert from git internal format to working tree format
-                */
-               buf = convert_to_working_tree(ce->name, new, &size);
-               if (buf) {
-                       free(new);
-                       new = buf;
-               }
-
                wrote = write_in_full(fd, new, size);
                close(fd);
                free(new);
@@ -168,7 +169,7 @@ static int write_entry(struct cache_entry *ce, char *path, const struct checkout
                                                 "symlink %s (%s)", path, strerror(errno));
                }
                break;
-       case S_IFDIRLNK:
+       case S_IFGITLINK:
                if (to_tempfile)
                        return error("git-checkout-index: cannot create temporary subproject %s", path);
                if (mkdir(path, 0777) < 0)
@@ -199,7 +200,7 @@ int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *t
        strcpy(path + len, ce->name);
 
        if (!lstat(path, &st)) {
-               unsigned changed = ce_match_stat(ce, &st, 1);
+               unsigned changed = ce_match_stat(ce, &st, CE_MATCH_IGNORE_VALID);
                if (!changed)
                        return 0;
                if (!state->force) {
@@ -217,7 +218,7 @@ int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *t
                unlink(path);
                if (S_ISDIR(st.st_mode)) {
                        /* If it is a gitlink, leave it alone! */
-                       if (S_ISDIRLNK(ntohl(ce->ce_mode)))
+                       if (S_ISGITLINK(ntohl(ce->ce_mode)))
                                return 0;
                        if (!state->force)
                                return error("%s is a directory", path);