In sha1-file.c:read_object_file_extended() we have the following pattern: errno = 0; data = read_object(r, repl, type, size); if (data) return data; if (errno && errno != ENOENT) die_errno(_("failed to read object %s"), oid_to_hex(oid)); That is, it is expected that read_object() does not change the value of errno in the non-error case. I find it intriguing that we expect a quite large call graph that is behind read_object() to behave this way. What if a subordinate callee starts doing if (some_syscall(...) < 0) { if (errno == EEXIST) { /* never mind, that's OK */ ... } } Would it be required to reset errno to its previous value in this failure-is-not-an-error case? The problem in my Windows build is that one of these subordinate syscalls is vsnprintf() (as part of a strbuf_add variant, I presume), and it fails with ERANGE when the buffer is too short. Do I have to modify the vsnprintf emulation to restore errno?