> +static void refresh_by_watchman(struct index_state *istate)
> +{
> + void *shm = NULL;
> + int length;
> + int i;
> + struct stat st;
> + int fd = -1;
> + const char *path = index_helper_path("git-watchman-%s-%"PRIuMAX,
> + sha1_to_hex(istate->sha1),
> + (uintmax_t)getpid());
> +
> + fd = open(path, O_RDONLY);
> + if (fd < 0)
> + return;
> +
> + /*
> + * This watchman data is just for us -- no need to keep it
> + * around once we've got it open.
> + */
> + unlink(path);
> +
> + if (fstat(fd, &st) < 0)
> + goto done;
> +
> + length = st.st_size;
> + shm = mmap(NULL, length, PROT_READ, MAP_SHARED, fd, 0);
> +
> + if (shm == MAP_FAILED)
> + goto done;
> +
> + close(fd);
> + fd = -1;
> +
> + if (length <= 20 ||
> + hashcmp(istate->sha1, (unsigned char *)shm + length - 20) ||
> + /*
> + * No need to clear CE_WATCHMAN_DIRTY set by 'WAMA' on
> + * disk. Watchman can only set more, not clear any, so
> + * this is OR mask.
> + */
> + read_watchman_ext(istate, shm, length - 20))
> + goto done;
> +
> + /*
> + * Now that we've marked the invalid entries in the
> + * untracked-cache itself, we can erase them from the list of
> + * entries to be processed and mark the untracked cache for
> + * watchman usage.
> + */
> + if (istate->untracked) {
> + string_list_clear(&istate->untracked->invalid_untracked, 0);
> + istate->untracked->use_watchman = 1;
> + }
> +
> + for (i = 0; i < istate->cache_nr; i++) {
> + struct cache_entry *ce = istate->cache[i];
> + if (ce_stage(ce) || (ce->ce_flags & CE_WATCHMAN_DIRTY))
> + continue;
> + ce_mark_uptodate(ce);
> + }
> +done:
> + if (shm)
> + munmap(shm, length);
> +
> + if (fd > 0)
> + close(fd);
coverities opinion:
> off_by_one: Testing whether handle fd is strictly greater than zero is
> suspicious.
> fd leaks when it is zero. Did you intend to include equality with zero?
We can assert that fd is never 0, because that is where stdin is?
> +}
> +
--
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