This patch does a clean up pass to minimize the casting required to work
with the memory mapped index (mmap).

It also makes the decoding of network byte order more consistent by using
get_be32() where possible.

Signed-off-by: Ben Peart <ben.pe...@microsoft.com>
---
 read-cache.c | 49 +++++++++++++++++++++++--------------------------
 1 file changed, 23 insertions(+), 26 deletions(-)

diff --git a/read-cache.c b/read-cache.c
index 40dc4723b2..c05e887fc9 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1655,7 +1655,7 @@ int verify_index_checksum;
 /* Allow fsck to force verification of the cache entry order. */
 int verify_ce_order;
 
-static int verify_hdr(struct cache_header *hdr, unsigned long size)
+static int verify_hdr(const struct cache_header *hdr, unsigned long size)
 {
        git_hash_ctx c;
        unsigned char hash[GIT_MAX_RAWSZ];
@@ -1679,7 +1679,7 @@ static int verify_hdr(struct cache_header *hdr, unsigned 
long size)
 }
 
 static int read_index_extension(struct index_state *istate,
-                               const char *ext, void *data, unsigned long sz)
+                               const char *ext, const char *data, unsigned 
long sz)
 {
        switch (CACHE_EXT(ext)) {
        case CACHE_EXT_TREE:
@@ -1902,7 +1902,7 @@ static size_t estimate_cache_size(size_t ondisk_size, 
unsigned int entries)
 }
 
 #ifndef NO_PTHREADS
-static unsigned long read_eoie_extension(void *mmap_, size_t mmap_size);
+static unsigned long read_eoie_extension(const char *mmap, size_t mmap_size);
 #endif
 static void write_eoie_extension(struct strbuf *sb, git_hash_ctx 
*eoie_context, unsigned long offset);
 
@@ -1912,14 +1912,14 @@ struct load_index_extensions
        pthread_t pthread;
 #endif
        struct index_state *istate;
-       void *mmap;
+       const char *mmap;
        size_t mmap_size;
        unsigned long src_offset;
 };
 
-static void *load_index_extensions(void *_data)
+static void *load_index_extensions(void *data)
 {
-       struct load_index_extensions *p = _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) {
@@ -1930,13 +1930,12 @@ static void *load_index_extensions(void *_data)
                 * in 4-byte network byte order.
                 */
                uint32_t extsize;
-               memcpy(&extsize, (char *)p->mmap + src_offset + 4, 4);
-               extsize = ntohl(extsize);
+               extsize = get_be32(p->mmap + src_offset + 4);
                if (read_index_extension(p->istate,
-                       (const char *)p->mmap + src_offset,
-                       (char *)p->mmap + src_offset + 8,
+                       p->mmap + src_offset,
+                       p->mmap + src_offset + 8,
                        extsize) < 0) {
-                       munmap(p->mmap, p->mmap_size);
+                       munmap((void *)p->mmap, p->mmap_size);
                        die("index file corrupt");
                }
                src_offset += 8;
@@ -1951,7 +1950,7 @@ static void *load_index_extensions(void *_data)
  * from the memory mapped file and add them to the given index.
  */
 static unsigned long load_cache_entry_block(struct index_state *istate,
-                       struct mem_pool *ce_mem_pool, int offset, int nr, void 
*mmap,
+                       struct mem_pool *ce_mem_pool, int offset, int nr, const 
char *mmap,
                        unsigned long start_offset, const struct cache_entry 
*previous_ce)
 {
        int i;
@@ -1962,7 +1961,7 @@ static unsigned long load_cache_entry_block(struct 
index_state *istate,
                struct cache_entry *ce;
                unsigned long consumed;
 
-               disk_ce = (struct ondisk_cache_entry *)((char *)mmap + 
src_offset);
+               disk_ce = (struct ondisk_cache_entry *)(mmap + src_offset);
                ce = create_from_disk(ce_mem_pool, istate->version, disk_ce, 
&consumed, previous_ce);
                set_index_entry(istate, i, ce);
 
@@ -1973,7 +1972,7 @@ static unsigned long load_cache_entry_block(struct 
index_state *istate,
 }
 
 static unsigned long load_all_cache_entries(struct index_state *istate,
-                       void *mmap, size_t mmap_size, unsigned long src_offset)
+                       const char *mmap, size_t mmap_size, unsigned long 
src_offset)
 {
        unsigned long consumed;
 
@@ -2006,7 +2005,7 @@ struct load_cache_entries_thread_data
        struct index_state *istate;
        struct mem_pool *ce_mem_pool;
        int offset, nr;
-       void *mmap;
+       const char *mmap;
        unsigned long start_offset;
        struct cache_entry *previous_ce;
        unsigned long consumed; /* return # of bytes in index file processed */
@@ -2026,7 +2025,7 @@ static void *load_cache_entries_thread(void *_data)
 }
 
 static unsigned long load_cache_entries_threaded(int nr_threads, struct 
index_state *istate,
-                       void *mmap, size_t mmap_size, unsigned long src_offset)
+                       const char *mmap, size_t mmap_size, unsigned long 
src_offset)
 {
        struct strbuf previous_name_buf = STRBUF_INIT, *previous_name;
        struct load_cache_entries_thread_data *data;
@@ -2095,7 +2094,7 @@ static unsigned long load_cache_entries_threaded(int 
nr_threads, struct index_st
                                break;
                }
 
-               ondisk = (struct ondisk_cache_entry *)((char *)mmap + 
src_offset);
+               ondisk = (struct ondisk_cache_entry *)(mmap + src_offset);
 
                /* On-disk flags are just 16 bits */
                flags = get_be16(&ondisk->flags);
@@ -2143,8 +2142,8 @@ int do_read_index(struct index_state *istate, const char 
*path, int must_exist)
        int fd;
        struct stat st;
        unsigned long src_offset;
-       struct cache_header *hdr;
-       void *mmap;
+       const struct cache_header *hdr;
+       const char *mmap;
        size_t mmap_size;
        struct load_index_extensions p = { 0 };
        unsigned long extension_offset = 0;
@@ -2176,7 +2175,7 @@ int do_read_index(struct index_state *istate, const char 
*path, int must_exist)
                die_errno("unable to map index file");
        close(fd);
 
-       hdr = mmap;
+       hdr = (const struct cache_header *)mmap;
        if (verify_hdr(hdr, mmap_size) < 0)
                goto unmap;
 
@@ -2236,11 +2235,11 @@ int do_read_index(struct index_state *istate, const 
char *path, int must_exist)
                p.src_offset = src_offset;
                load_index_extensions(&p);
        }
-       munmap(mmap, mmap_size);
+       munmap((void *)mmap, mmap_size);
        return istate->cache_nr;
 
 unmap:
-       munmap(mmap, mmap_size);
+       munmap((void *)mmap, mmap_size);
        die("index file corrupt");
 }
 
@@ -3263,7 +3262,7 @@ int should_validate_cache_entries(void)
 #define EOIE_SIZE_WITH_HEADER (4 + 4 + EOIE_SIZE) /* <4-byte signature> + 
<4-byte length> + EOIE_SIZE */
 
 #ifndef NO_PTHREADS
-static unsigned long read_eoie_extension(void *mmap_, size_t mmap_size)
+static unsigned long read_eoie_extension(const char *mmap, size_t mmap_size)
 {
        /*
         * The end of index entries (EOIE) extension is guaranteed to be last
@@ -3274,7 +3273,6 @@ static unsigned long read_eoie_extension(void *mmap_, 
size_t mmap_size)
         * <4-byte offset>
         * <20-byte hash>
         */
-       const char *mmap = mmap_;
        const char *index, *eoie;
        uint32_t extsize;
        unsigned long offset, src_offset;
@@ -3327,8 +3325,7 @@ static unsigned long read_eoie_extension(void *mmap_, 
size_t mmap_size)
                 * in 4-byte network byte order.
                 */
                uint32_t extsize;
-               memcpy(&extsize, (char *)mmap + src_offset + 4, 4);
-               extsize = ntohl(extsize);
+               extsize = get_be32(mmap + src_offset + 4);
 
                /* verify the extension size isn't so large it will wrap around 
*/
                if (src_offset + 8 + extsize < src_offset)
-- 
2.18.0.windows.1

Reply via email to