Merge branch 'js/pack-objects-mutex-init-fix' into maint

A mutex used in "git pack-objects" were not correctly initialized
and this caused "git repack" to dump core on Windows.

* js/pack-objects-mutex-init-fix:
  pack-objects (mingw): initialize `packing_data` mutex in the correct spot
  pack-objects (mingw): demonstrate a segmentation fault with large deltas
  pack-objects: fix typo 'detla' -> 'delta'
This commit is contained in:
Junio C Hamano 2018-11-21 22:57:50 +09:00
commit e3c18aa35b
4 changed files with 36 additions and 2 deletions

View File

@ -2299,7 +2299,6 @@ static void init_threaded_search(void)
pthread_mutex_init(&cache_mutex, NULL); pthread_mutex_init(&cache_mutex, NULL);
pthread_mutex_init(&progress_mutex, NULL); pthread_mutex_init(&progress_mutex, NULL);
pthread_cond_init(&progress_cond, NULL); pthread_cond_init(&progress_cond, NULL);
pthread_mutex_init(&to_pack.lock, NULL);
old_try_to_free_routine = set_try_to_free_routine(try_to_free_from_threads); old_try_to_free_routine = set_try_to_free_routine(try_to_free_from_threads);
} }

View File

@ -148,6 +148,9 @@ void prepare_packing_data(struct packing_data *pdata)
1U << OE_SIZE_BITS); 1U << OE_SIZE_BITS);
pdata->oe_delta_size_limit = git_env_ulong("GIT_TEST_OE_DELTA_SIZE", pdata->oe_delta_size_limit = git_env_ulong("GIT_TEST_OE_DELTA_SIZE",
1UL << OE_DELTA_SIZE_BITS); 1UL << OE_DELTA_SIZE_BITS);
#ifndef NO_PTHREADS
pthread_mutex_init(&pdata->lock, NULL);
#endif
} }
struct object_entry *packlist_alloc(struct packing_data *pdata, struct object_entry *packlist_alloc(struct packing_data *pdata,

View File

@ -356,7 +356,7 @@ static inline unsigned long oe_delta_size(struct packing_data *pack,
return e->delta_size_; return e->delta_size_;
/* /*
* pack->detla_size[] can't be NULL because oe_set_delta_size() * pack->delta_size[] can't be NULL because oe_set_delta_size()
* must have been called when a new delta is saved with * must have been called when a new delta is saved with
* oe_set_delta(). * oe_set_delta().
* If oe_delta() returns NULL (i.e. default state, which means * If oe_delta() returns NULL (i.e. default state, which means

32
t/t5321-pack-large-objects.sh Executable file
View File

@ -0,0 +1,32 @@
#!/bin/sh
#
# Copyright (c) 2018 Johannes Schindelin
#
test_description='git pack-object with "large" deltas
'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-pack.sh
# Two similar-ish objects that we have computed deltas between.
A=01d7713666f4de822776c7622c10f1b07de280dc
B=e68fe8129b546b101aee9510c5328e7f21ca1d18
test_expect_success 'setup' '
clear_packs &&
{
pack_header 2 &&
pack_obj $A $B &&
pack_obj $B
} >ab.pack &&
pack_trailer ab.pack &&
git index-pack --stdin <ab.pack
'
test_expect_success 'repack large deltas' '
printf "%s\\n" $A $B |
GIT_TEST_OE_DELTA_SIZE=2 git pack-objects tmp-pack
'
test_done