From bf4d8abd7ae3624a13967275dcbaea19f6b6ceb5 Mon Sep 17 00:00:00 2001 From: Kamil Dudka Date: Wed, 11 Feb 2015 13:48:12 +0100 Subject: [PATCH] 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. Bug: https://bugzilla.redhat.com/1188498 Bug: http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/34867 --- gl/lib/fts.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/gl/lib/fts.c b/gl/lib/fts.c index 500e92c..f76c015 100644 --- a/gl/lib/fts.c +++ b/gl/lib/fts.c @@ -1091,9 +1091,16 @@ cd_dot_dot: 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; } -- 2.1.0