зеркало из https://github.com/microsoft/git.git
sha1_file: guard against invalid loose subdirectory numbers
Loose object subdirectories have hexadecimal names based on the first byte of the hash of contained objects, thus their numerical representation can range from 0 (0x00) to 255 (0xff). Change the type of the corresponding variable in for_each_file_in_obj_subdir() and associated callback functions to unsigned int and add a range check. Suggested-by: Jeff King <peff@peff.net> Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
0375f472d4
Коммит
70c49050d4
|
@ -537,7 +537,7 @@ static int fsck_cruft(const char *basename, const char *path, void *data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int fsck_subdir(int nr, const char *path, void *progress)
|
||||
static int fsck_subdir(unsigned int nr, const char *path, void *progress)
|
||||
{
|
||||
display_progress(progress, nr + 1);
|
||||
return 0;
|
||||
|
|
|
@ -10,7 +10,7 @@ static const char * const prune_packed_usage[] = {
|
|||
|
||||
static struct progress *progress;
|
||||
|
||||
static int prune_subdir(int nr, const char *path, void *data)
|
||||
static int prune_subdir(unsigned int nr, const char *path, void *data)
|
||||
{
|
||||
int *opts = data;
|
||||
display_progress(progress, nr + 1);
|
||||
|
|
|
@ -68,7 +68,7 @@ static int prune_cruft(const char *basename, const char *path, void *data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int prune_subdir(int nr, const char *path, void *data)
|
||||
static int prune_subdir(unsigned int nr, const char *path, void *data)
|
||||
{
|
||||
if (!show_only)
|
||||
rmdir(path);
|
||||
|
|
4
cache.h
4
cache.h
|
@ -1805,10 +1805,10 @@ typedef int each_loose_object_fn(const struct object_id *oid,
|
|||
typedef int each_loose_cruft_fn(const char *basename,
|
||||
const char *path,
|
||||
void *data);
|
||||
typedef int each_loose_subdir_fn(int nr,
|
||||
typedef int each_loose_subdir_fn(unsigned int nr,
|
||||
const char *path,
|
||||
void *data);
|
||||
int for_each_file_in_obj_subdir(int subdir_nr,
|
||||
int for_each_file_in_obj_subdir(unsigned int subdir_nr,
|
||||
struct strbuf *path,
|
||||
each_loose_object_fn obj_cb,
|
||||
each_loose_cruft_fn cruft_cb,
|
||||
|
|
|
@ -3735,7 +3735,7 @@ void assert_sha1_type(const unsigned char *sha1, enum object_type expect)
|
|||
typename(expect));
|
||||
}
|
||||
|
||||
int for_each_file_in_obj_subdir(int subdir_nr,
|
||||
int for_each_file_in_obj_subdir(unsigned int subdir_nr,
|
||||
struct strbuf *path,
|
||||
each_loose_object_fn obj_cb,
|
||||
each_loose_cruft_fn cruft_cb,
|
||||
|
@ -3747,6 +3747,9 @@ int for_each_file_in_obj_subdir(int subdir_nr,
|
|||
struct dirent *de;
|
||||
int r = 0;
|
||||
|
||||
if (subdir_nr > 0xff)
|
||||
BUG("invalid loose object subdirectory: %x", subdir_nr);
|
||||
|
||||
origlen = path->len;
|
||||
strbuf_complete(path, '/');
|
||||
strbuf_addf(path, "%02x", subdir_nr);
|
||||
|
|
Загрузка…
Ссылка в новой задаче