@matheusbsbs / matheus-bagliano / commits / 971f229c50
Fork 0

Fix possible Solaris problem in 'checkout_entry()'

Currently when checking out an entry "path", we try to unlink(2) it first (because there could be stale file), and if there is a directory there, try to deal with it (typically we run recursive rmdir). We ignore the error return from this unlink because there may not even be any file there. However if you are root on Solaris, you can unlink(2) a directory successfully and corrupt your filesystem. This moves the code around and check the directory first, and then unlink(2). Also we check the error code from it. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Linus Torvalds committed Mar 17, 2008 at 08:56 UTC 971f229c50aeace83d6fd30de1de755f419d4cb8
1 file changed +2 -2
entry.c
+2 -2
@@ -218,7 +218,6 @@ int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *t
218 * to emulate by hand - much easier to let the system
219 * just do the right thing)
220 */
221 - unlink(path);
221 if (S_ISDIR(st.st_mode)) {
222 /* If it is a gitlink, leave it alone! */
223 if (S_ISGITLINK(ce->ce_mode))
@@ -226,7 +225,8 @@ int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *t
225 if (!state->force)
226 return error("%s is a directory", path);
227 remove_subtree(path);
229 - }
228 + } else if (unlink(path))
229 + return error("unable to unlink old '%s' (%s)", path, strerror(errno));
230 } else if (state->not_new)
231 return 0;
232 create_directories(path, state);