On Fri, 2016-04-15 at 17:04 -0700, Stefan Beller wrote: > > +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; > > +} > > + Good point. (It's also leaking on the happy path -- will fix all of those) -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html