This could be triggered by auto-mounting a recursive bind mount.
Reported by Michael Chapman in: https://bugzilla.redhat.com/
1188498
* lib/fts.c (fts_read): Avoid removing the original hash table item
when leaving a directory that caused a cycle, and preserve the FTS_DC
flag.
+2015-02-16 Kamil Dudka <kdudka@redhat.com>
+
+ fts: avoid crash when a cycle is added while traversing
+ This could be triggered by auto-mounting a recursive bind mount.
+ Reported by Michael Chapman in: https://bugzilla.redhat.com/1188498
+ * lib/fts.c (fts_read): Avoid removing the original hash table item
+ when leaving a directory that caused a cycle, and preserve the FTS_DC
+ flag.
+
2015-02-16 Daiki Ueno <ueno@gnu.org>
uniname/uniname: support character alias
p->fts_errno = errno;
SET(FTS_STOP);
}
- p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
- if (p->fts_errno == 0)
- LEAVE_DIR (sp, p, "3");
+
+ /* If the directory causes a cycle, preserve the FTS_DC flag and keep
+ the corresponding dev/ino pair in the hash table. It is going to be
+ removed when leaving the original directory. */
+ if (p->fts_info != FTS_DC) {
+ p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
+ if (p->fts_errno == 0)
+ LEAVE_DIR (sp, p, "3");
+ }
return ISSET(FTS_STOP) ? NULL : p;
}