git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Don't call fstat() on stdin in index-pack.

From
Sergey Vlasov <vsu@altlinux.ru>
Date
Jan 20, 2007, 15:35 UTC
Message-ID
<20070120183519.3a182064.vsu@altlinux.ru>
In-Reply-To
<45B034D2.6010007@fs.ei.tum.de>
On Fri, 19 Jan 2007 04:02:42 +0100 Simon 'corecode' Schubert wrote:
Show 22 quoted lines
> Bart Trojanowski wrote:
> >  	/* If input_fd is a file, we should have reached its end now. */
> > -	if (fstat(input_fd, &st))
> > -		die("cannot fstat packfile: %s", strerror(errno));
> > -	if (S_ISREG(st.st_mode) && st.st_size != consumed_bytes)
> > -		die("pack has junk at the end");
> > +        if (input_fd) {
> > +                if (fstat(input_fd, &st))
> > +                        die("cannot fstat packfile: %s", strerror(errno));
> > +                if (S_ISREG(st.st_mode) && st.st_size != consumed_bytes)
> > +                        die("pack has junk at the end");
> > +        }
>
> This is clearly the wrong fix.  input_fd being 0 doesn't mean that
> it is *not* a regular file.  Only doing a fstat can tell.  You are
> simply hiding your real issue there, which is that you can't fstat
> on a pipe or whatever input_fd is.
>
> The problem here is that your 64bit kernel can't fit the data into
> your struct stat provided by your 32bit libc.  Not a problem of git.
> However, it would be interesting to know what exactly produces the
> EOVERFLOW.

Most likely it is the st_ino field - the kernel assigns unique inode numbers for pipes from an "unsigned long" counter, which is 64-bit in this case, and *stat() calls must fail with EOVERFLOW if the inode number does not fit into ino_t, which is 32-bit here. This problem is known for some time, and there is even a kernel patch proposed as a workaround (which makes the counter 32-bit):

http://permalink.gmane.org/gmane.linux.file-systems/12526

AFAIK, that patch is not upstream yet - so upgrading the kernel did not really fix the issue, it will appear again once the system will use more than 4G of pipe inodes.

Compiling git with -D_FILE_OFFSET_BITS=64 will make ino_t 64-bit and therefore will fix the problem (however, I'm not sure whether the git code is ready for this).

Previous: Simon 'corecode' SchubertNext: Simon 'corecode' Schubert
Message 4 of 6 in “git push problem with v1.5.0-rc1”
  1. Bart TrojanowskiJan 18, 2007
  2. Don't call fstat() on stdin in index-pack.Bart Trojanowski, Jan 19, 2007
  3. Simon 'corecode' SchubertJan 19, 2007
  4. Sergey VlasovJan 20, 2007
  5. Simon 'corecode' SchubertJan 20, 2007
  6. Bart TrojanowskiJan 19, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.