Merge branch 'maint'
* maint: pack-check.c::verify_packfile(): don't run SHA-1 update on huge data Fix infinite loop when deleting multiple packed refs.maint
commit
e27e609bbf
1
cache.h
1
cache.h
|
@ -179,6 +179,7 @@ extern int refresh_cache(unsigned int flags);
|
|||
|
||||
struct lock_file {
|
||||
struct lock_file *next;
|
||||
char on_list;
|
||||
char filename[PATH_MAX];
|
||||
};
|
||||
extern int hold_lock_file_for_update(struct lock_file *, const char *path, int);
|
||||
|
|
|
@ -27,9 +27,12 @@ static int lock_file(struct lock_file *lk, const char *path)
|
|||
sprintf(lk->filename, "%s.lock", path);
|
||||
fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
|
||||
if (0 <= fd) {
|
||||
if (!lk->next) {
|
||||
if (!lk->on_list) {
|
||||
lk->next = lock_file_list;
|
||||
lock_file_list = lk;
|
||||
lk->on_list = 1;
|
||||
}
|
||||
if (lock_file_list) {
|
||||
signal(SIGINT, remove_lock_file_on_signal);
|
||||
atexit(remove_lock_file);
|
||||
}
|
||||
|
@ -37,6 +40,8 @@ static int lock_file(struct lock_file *lk, const char *path)
|
|||
return error("cannot fix permission bits on %s",
|
||||
lk->filename);
|
||||
}
|
||||
else
|
||||
lk->filename[0] = 0;
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
|
20
pack-check.c
20
pack-check.c
|
@ -1,16 +1,18 @@
|
|||
#include "cache.h"
|
||||
#include "pack.h"
|
||||
|
||||
#define BATCH (1u<<20)
|
||||
|
||||
static int verify_packfile(struct packed_git *p)
|
||||
{
|
||||
unsigned long index_size = p->index_size;
|
||||
void *index_base = p->index_base;
|
||||
SHA_CTX ctx;
|
||||
unsigned char sha1[20];
|
||||
unsigned long pack_size = p->pack_size;
|
||||
void *pack_base;
|
||||
struct pack_header *hdr;
|
||||
int nr_objects, err, i;
|
||||
unsigned char *packdata;
|
||||
unsigned long datasize;
|
||||
|
||||
/* Header consistency check */
|
||||
hdr = p->pack_base;
|
||||
|
@ -25,11 +27,19 @@ static int verify_packfile(struct packed_git *p)
|
|||
"while idx size expects %d", nr_objects,
|
||||
num_packed_objects(p));
|
||||
|
||||
/* Check integrity of pack data with its SHA-1 checksum */
|
||||
SHA1_Init(&ctx);
|
||||
pack_base = p->pack_base;
|
||||
SHA1_Update(&ctx, pack_base, pack_size - 20);
|
||||
packdata = p->pack_base;
|
||||
datasize = p->pack_size - 20;
|
||||
while (datasize) {
|
||||
unsigned long batch = (datasize < BATCH) ? datasize : BATCH;
|
||||
SHA1_Update(&ctx, packdata, batch);
|
||||
datasize -= batch;
|
||||
packdata += batch;
|
||||
}
|
||||
SHA1_Final(sha1, &ctx);
|
||||
if (hashcmp(sha1, (unsigned char *)pack_base + pack_size - 20))
|
||||
|
||||
if (hashcmp(sha1, (unsigned char *)(p->pack_base) + p->pack_size - 20))
|
||||
return error("Packfile %s SHA1 mismatch with itself",
|
||||
p->pack_name);
|
||||
if (hashcmp(sha1, (unsigned char *)index_base + index_size - 40))
|
||||
|
|
Loading…
Reference in New Issue