Joachim Schmitz wrote: >> From: Paul Eggert [mailto:egg...@cs.ucla.edu] >> Sent: Thursday, December 15, 2011 7:07 PM >> To: Joachim Schmitz >> Cc: Jim Meyering; bug-coreut...@gnu.org; bug-gnulib@gnu.org >> Subject: Re: coreutils-8.14, "rm -r" fails with EBADF >> >> On 12/15/11 08:28, Jim Meyering wrote: >> > If you can debug it further to narrow down what/how it is failing, >> > eventually we'll find the cause. >> >> One way to do that might be to put a breakpoint on all the following > functions, >> and to let us know what their arguments are when called, and what they >> return. You also might try to compile coreutils with debugging turned > off, so >> that functions aren't inlined. > > I guess you meant turn of optimization rather than debugging? > >> diropen >> fts_build >> fts_safe_changedir >> restore_initial_cwd >> fchdir >> cwd_advance_fd > > OK here we go: > jojo@\hpitug:/home/jojo/Floss/coreutils-8.14/src $ run -debug -inspect=on > ./rm -r /tmp/foo ... > Stepping into fts_build shows that the dup(dir_fd) in line 1385 fails, with > errno being set to EBADF > > * 1375 if (continue_readdir) > (eInspect 1,840): > * 1381 else if (nlinks || type == BREAD) { > (eInspect 1,840): > * 1382 if (ISSET(FTS_CWDFD)) > (eInspect 1,840): > * 1384 dir_fd = dup (dir_fd); > (eInspect 1,840):p dir_fd > $3 = 3 > (eInspect 1,840):next > * 1385 if (0 <= dir_fd) > (eInspect 1,840):p dir_fd > $4 = -1 ... > So... it seems we can't dup() an fd for a directory here!
Right. Your config.h file suggests you're not using a gnulib dup replacement, so I suspect a bug in your system's dup implementation. I thought gnulib had pretty good dup* test coverage, but see that no dup* test uses a directory file descriptor.