hold_lock_file_for_append(): restore errno before returning
[gitweb.git] / lockfile.c
index c51c6ec69d0352378c2d31bea45bb7029c8f5657..b2f5d36f7e944798afdd9ae5b591b3dd03eadf7b 100644 (file)
@@ -243,15 +243,22 @@ int hold_lock_file_for_append(struct lock_file *lk, const char *path, int flags)
        orig_fd = open(path, O_RDONLY);
        if (orig_fd < 0) {
                if (errno != ENOENT) {
+                       int save_errno = errno;
+
                        if (flags & LOCK_DIE_ON_ERROR)
                                die("cannot open '%s' for copying", path);
                        rollback_lock_file(lk);
-                       return error("cannot open '%s' for copying", path);
+                       error("cannot open '%s' for copying", path);
+                       errno = save_errno;
+                       return -1;
                }
        } else if (copy_fd(orig_fd, fd)) {
+               int save_errno = errno;
+
                if (flags & LOCK_DIE_ON_ERROR)
                        exit(128);
                rollback_lock_file(lk);
+               errno = save_errno;
                return -1;
        }
        return fd;