Re: git fsck complains about error: refs/tags/.cyg000000000559e25517156b51cf219f51/libgcj-2.95.0: badRefName: invalid refname format?!

Corinna Vinschen via Cygwin <[email protected]>
Newsgroups gmane.os.cygwin
Message-ID <[email protected]>
On Feb  3 22:14, Dan Shelton via Cygwin wrote:
> On Tue, 3 Feb 2026 at 13:20, Corinna Vinschen via Cygwin
> <[email protected]> wrote:
> >
> > On Feb  3 00:55, Dan Shelton via Cygwin wrote:
> > > On Mon, 2 Feb 2026 at 17:04, Corinna Vinschen via Cygwin
> > > <[email protected]> wrote:
> > > >
> > > > On Feb  2 14:47, Dan Shelton via Cygwin wrote:
> > > > > On Mon, 2 Feb 2026 at 14:40, Corinna Vinschen via Cygwin
> > > > > <[email protected]> wrote:
> > > > > >
> > > > > > On Feb  2 13:24, Dan Shelton via Cygwin wrote:
> > > > > > > I'm not sure whether the Cygwin code is correct. I did a peek with a
> > > > > > > kernel debugger, and I see that FILE_RENAME_INFORMATION.RootDirectory
> > > > > > > is always NULL if a file gets renamed to .cyg000000000xxxx. But if I
> > > > > > > try that with NTFS or SMB, the NtSetInformationFile() to set
> > > > > > > FileRenameInformation always fails.
> > > > > >
> > > > > > Your testcase is incorrect, unfortunately.
> > > > > >
> > > > > > >     fri->FileNameLength = (wcslen(dstfile)+1)*sizeof(wchar_t);
> > > > > >
> > > > > > For NT file paths, never count the trailing \0 to the length:
> > > > > >
> > > > > >       fri->FileNameLength = wcslen(dstfile) * sizeof (WCHAR);
> > > > > >
> > > > > > With that, your testcase works fine for me.
> > > > > >
> > > > > > On which filesystem did you see the problem?
> > > > >
> > > > > Windows NFSv3 client (the builtin one, not the newer NFSv4.1 one).
> > > >
> > > > The files in question are actually files which got renamed while
> > > > in use.  I don't know another way to implement removing in-use files
> > > > on remote file systems not supporting delete POSIX semantics.  If
> > > > somebody has a brilliant idea, https://cygwin.com/acronyms/#PTC.
> > >
> > > Did you see that these are directories, not files? How does that happen?
> >
> > Yes, I saw that.  Same as for files.  Basically something like this:
> >
> >   mkdir ("dir");
> >   fd = open ("dir", O_DIRECTORY);
> >   unlink ("dir");
> >   fd2 = openat (fd, "file", O_CREAT...);
> 
> I'm pretty sure this is a bug in Cygwin, unlink() should not work on dirs
> 1. unlink() is only defined for files, but not dirs. POSIX says ...
> The path argument shall not name a directory ...

Yeah, I was lazy.  unlink("dir") returns EISDIR.  Replace with
rmdir("dir").  Under the hood it's all a single function unlink_nt(),
though.

> 2. The /bin/unlink.exe utility says it can only work on files
> 3. Looking at the SystemV sources you see the NFS client code only
> creates .nfsXXXXX files for files, but NEVER for directories

See the code from
https://sourceware.org/cgit/newlib-cygwin/tree/winsup/cygwin/syscalls.cc#n880
to
https://sourceware.org/cgit/newlib-cygwin/tree/winsup/cygwin/syscalls.cc#n919

> 4. Testing this on Solaris 10 Update 8 says the dir is not empty

Testing what on Solaris?  In the above example the directory is created,
then unlinked (yes, rmdir'ed) while it's still empty, and only then a
file is created inside the dir via openat().  I didn't try this myself, it
was just off the top of my head to create an unlinked dir with a file in
it ¯\_(ツ)_/¯

> 5. It really breaks git and git's test suite

I tried the same locally on MSFT NFS3 (git clone gcc.git; git fsck) twice
and couldn't reproduce your problem.


Corinna

-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.