[RTEMS Project] #4674: readdir skips entries after unlink

RTEMS trac trac at rtems.org
Tue Jul 5 17:30:51 UTC 2022


#4674: readdir skips entries after unlink
------------------------------+--------------------
  Reporter:  Alexandre Oliva  |      Owner:  (none)
      Type:  defect           |     Status:  new
  Priority:  normal           |  Milestone:
 Component:  admin            |    Version:  6
  Severity:  normal           |   Keywords:
Blocked By:                   |   Blocking:
------------------------------+--------------------
 Removing directory entries returned by readdir causes entries to be
 skipped in subsequent readdir calls.  AFAICT this behavior is not POSIX-
 conforming, and it breaks several of libstdc++-v3's std::filesystem tests.

 More specifically, consider a directory containing entries A, B and C.
 The first readdir call after opening the directory returns the entry for
 A, and advances the offset to B.
 The second readdir call is supposed to return B, and it does, unless
 (here's the problem) A is removed before the second call, in which case it
 returns C, and B is skipped entirely.

 It's as if the directory offset was an index into active entries, so that
 the removal decremented the indices for subsequent entries, leaving the
 offset for the current dir entry pointing past the entry that should be
 returned next.

 This affects at least the root, in-memory filesystem.  I haven't tested
 with on-disk filesystems.

 I've proposed a few possibilities of workarounds to libstdc++, so that
 remove_all would get the job done even under this implementation
 choice/limitation, but the recommendation I got from Sebastian Huber was
 to file this report instead, so here it is.
 https://gcc.gnu.org/pipermail/gcc-patches/2022-June/597525.html
 (the proposed workarounds are earlier posts in the same thread)

--
Ticket URL: <http://devel.rtems.org/ticket/4674>
RTEMS Project <http://www.rtems.org/>
RTEMS Project


More information about the bugs mailing list