perf tools: Fix rm_rf() to handle non-regular files correctly
authorMasami Hiramatsu <mhiramat@kernel.org>
Wed, 8 Jun 2016 09:29:11 +0000 (18:29 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 14 Jun 2016 12:29:54 +0000 (09:29 -0300)
Fix rm_rf() to handle non-regular files correctly. This fix includes two
changes;

 - Fix to use lstat(3) instead of stat(3) since if the target
   file is a symbolic link, rm_rf() should unlink the symbolic
   link itself, not the file which pointed by the symlink.
 - Fix to unlink non-regular files (except for directory),
   including symlink.

Even though the first one fixes to stat symlink itself, without second
fix, it still failed because the symlink is not a regular file.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20160608092911.3116.90929.stgit@devbox
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/util.c

index 23504ad..e08b9a0 100644 (file)
@@ -97,20 +97,17 @@ int rm_rf(char *path)
                scnprintf(namebuf, sizeof(namebuf), "%s/%s",
                          path, d->d_name);
 
-               ret = stat(namebuf, &statbuf);
+               /* We have to check symbolic link itself */
+               ret = lstat(namebuf, &statbuf);
                if (ret < 0) {
                        pr_debug("stat failed: %s\n", namebuf);
                        break;
                }
 
-               if (S_ISREG(statbuf.st_mode))
-                       ret = unlink(namebuf);
-               else if (S_ISDIR(statbuf.st_mode))
+               if (S_ISDIR(statbuf.st_mode))
                        ret = rm_rf(namebuf);
-               else {
-                       pr_debug("unknown file: %s\n", namebuf);
-                       ret = -1;
-               }
+               else
+                       ret = unlink(namebuf);
        }
        closedir(dir);