update_ref(): don't read old reference value before delete

If we are deleting the reference, then we don't need to read the
reference's old value. It doesn't provide any race safety, because the
value read just before the delete is no "better" than the value that
would be read under lock during the delete. And even if the reference
previously didn't exist, we can call delete_ref() on it if we don't
provide an old_sha1 value.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Michael Haggerty 2015-06-22 16:03:08 +02:00 коммит произвёл Junio C Hamano
Родитель 4eaa4bd800
Коммит a1c9eb918b
1 изменённых файлов: 3 добавлений и 3 удалений

Просмотреть файл

@ -1692,13 +1692,13 @@ static int update_branch(struct branch *b)
unsigned char old_sha1[20]; unsigned char old_sha1[20];
struct strbuf err = STRBUF_INIT; struct strbuf err = STRBUF_INIT;
if (read_ref(b->name, old_sha1))
hashclr(old_sha1);
if (is_null_sha1(b->sha1)) { if (is_null_sha1(b->sha1)) {
if (b->delete) if (b->delete)
delete_ref(b->name, old_sha1, 0); delete_ref(b->name, NULL, 0);
return 0; return 0;
} }
if (read_ref(b->name, old_sha1))
hashclr(old_sha1);
if (!force_update && !is_null_sha1(old_sha1)) { if (!force_update && !is_null_sha1(old_sha1)) {
struct commit *old_cmit, *new_cmit; struct commit *old_cmit, *new_cmit;