On Mon, Oct 1, 2018 at 3:46 PM Ben Peart <peartben@xxxxxxxxx> wrote: > @@ -1890,6 +1891,46 @@ static size_t estimate_cache_size(size_t ondisk_size, unsigned int entries) > static size_t read_eoie_extension(const char *mmap, size_t mmap_size); > static void write_eoie_extension(struct strbuf *sb, git_hash_ctx *eoie_context, size_t offset); > > +struct load_index_extensions > +{ > +#ifndef NO_PTHREADS > + pthread_t pthread; > +#endif > + struct index_state *istate; > + const char *mmap; > + size_t mmap_size; > + unsigned long src_offset; > +}; > + > +static void *load_index_extensions(void *_data) > +{ > + struct load_index_extensions *p = _data; > + unsigned long src_offset = p->src_offset; > + > + while (src_offset <= p->mmap_size - the_hash_algo->rawsz - 8) { > + /* After an array of active_nr index entries, > + * there can be arbitrary number of extended > + * sections, each of which is prefixed with > + * extension name (4-byte) and section length > + * in 4-byte network byte order. > + */ > + uint32_t extsize; > + memcpy(&extsize, p->mmap + src_offset + 4, 4); > + extsize = ntohl(extsize); This could be get_be32() so that the next person will not need to do another cleanup patch. > + if (read_index_extension(p->istate, > + p->mmap + src_offset, > + p->mmap + src_offset + 8, > + extsize) < 0) { This alignment is misleading because the conditions are aligned with the code block below. If you can't align it with the '(', then just add another tab. > + munmap((void *)p->mmap, p->mmap_size); This made me pause for a bit since we should not need to cast back to void *. It turns out you need this because mmap pointer is const. But you don't even need to munmap here. We're dying, the OS will clean everything up. > + die(_("index file corrupt")); > + } > + src_offset += 8; > + src_offset += extsize; > + } > + > + return NULL; > +} -- Duy