> +static int try_shm(struct index_state *istate)
> +{
> + void *new_mmap = NULL;
> + size_t old_size = istate->mmap_size;
> + ssize_t new_size;
> + const unsigned char *sha1;
> + struct stat st;
> + int fd;
> +
> + if (!is_main_index(istate) ||
> + old_size <= 20 ||
> + stat(git_path("index-helper.path"), &st))
> + return -1;
> + if (poke_daemon(istate, &st, 0))
> + return -1;
> + sha1 = (unsigned char *)istate->mmap + old_size - 20;
> +
> + fd = open(index_helper_path("git-index-%s", sha1_to_hex(sha1)),
> + O_RDONLY);
> + if (fd < 0)
> + goto fail;
> +
> + if (fstat(fd, &st))
> + goto fail;
> +
> + new_size = st.st_size;
> + new_mmap = mmap(NULL, new_size, PROT_READ, MAP_SHARED, fd, 0);
> + if (new_size <= 20 ||
> + hashcmp((unsigned char *)istate->mmap + old_size - 20,
> + (unsigned char *)new_mmap + new_size - 20)) {
> + if (new_mmap)
> + munmap(new_mmap, new_size);
> + goto fail;
coming from here
> + }
> +
> + /* The memory barrier here matches index-helper.c:share_index. */
> + __sync_synchronize();
> +
> + munmap(istate->mmap, istate->mmap_size);
> + istate->mmap = new_mmap;
> + istate->mmap_size = new_size;
> + istate->from_shm = 1;
> + return 0;
> +
> +fail:
fd may be leaking here?
> + poke_daemon(istate, &st, 1);
> + return -1;
> +}
> +
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html