fts: avoid crash when a cycle is added while traversing 01/201501/1 accepted/tizen_5.0_base tizen_5.0_base accepted/tizen/5.0/base/20190318.110749 submit/tizen_5.0_base/20190315.082133
authorKamil Dudka <kdudka@redhat.com>
Wed, 11 Feb 2015 17:41:43 +0000 (18:41 +0100)
committerHyunjee Kim <hj0426.kim@samsung.com>
Fri, 15 Mar 2019 04:46:31 +0000 (13:46 +0900)
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.

Change-Id: I24bfd7a2f46197ec8dff5ddabca3cab3837b28be
Signed-off-by: Hyunjee Kim <hj0426.kim@samsung.com>
gnulib/lib/fts.c

index 1b5384b..501b334 100644 (file)
@@ -809,9 +809,16 @@ check_for_dir:
                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;
 }