refs.c: commit_packed_refs to return a meaningful errno on failure

Making errno when returning from commit_packed_refs() meaningful,
which should fix

 * a bug in "git clone" where it prints strerror(errno) based on
   errno, despite errno possibly being zero and potentially having
   been clobbered by that point
 * the same kind of bug in "git pack-refs"

and prepares for repack_without_refs() to get a meaningful
error message when commit_packed_refs() fails without falling into
the same bug.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Acked-by: Michael Haggerty <mhagger@alum.mit.edu>
This commit is contained in:
Ronnie Sahlberg
2014-06-20 07:42:53 -07:00
committed by Junio C Hamano
parent 470a91ef75
commit d3f6655505
2 changed files with 10 additions and 1 deletions

10
refs.c
View File

@ -2239,11 +2239,16 @@ int lock_packed_refs(int flags)
return 0; return 0;
} }
/*
* Commit the packed refs changes.
* On error we must make sure that errno contains a meaningful value.
*/
int commit_packed_refs(void) int commit_packed_refs(void)
{ {
struct packed_ref_cache *packed_ref_cache = struct packed_ref_cache *packed_ref_cache =
get_packed_ref_cache(&ref_cache); get_packed_ref_cache(&ref_cache);
int error = 0; int error = 0;
int save_errno = 0;
if (!packed_ref_cache->lock) if (!packed_ref_cache->lock)
die("internal error: packed-refs not locked"); die("internal error: packed-refs not locked");
@ -2253,10 +2258,13 @@ int commit_packed_refs(void)
do_for_each_entry_in_dir(get_packed_ref_dir(packed_ref_cache), do_for_each_entry_in_dir(get_packed_ref_dir(packed_ref_cache),
0, write_packed_entry_fn, 0, write_packed_entry_fn,
&packed_ref_cache->lock->fd); &packed_ref_cache->lock->fd);
if (commit_lock_file(packed_ref_cache->lock)) if (commit_lock_file(packed_ref_cache->lock)) {
save_errno = errno;
error = -1; error = -1;
}
packed_ref_cache->lock = NULL; packed_ref_cache->lock = NULL;
release_packed_ref_cache(packed_ref_cache); release_packed_ref_cache(packed_ref_cache);
errno = save_errno;
return error; return error;
} }

1
refs.h
View File

@ -98,6 +98,7 @@ extern void add_packed_ref(const char *refname, const unsigned char *sha1);
* Write the current version of the packed refs cache from memory to * Write the current version of the packed refs cache from memory to
* disk. The packed-refs file must already be locked for writing (see * disk. The packed-refs file must already be locked for writing (see
* lock_packed_refs()). Return zero on success. * lock_packed_refs()). Return zero on success.
* Sets errno to something meaningful on error.
*/ */
extern int commit_packed_refs(void); extern int commit_packed_refs(void);