summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-06-04 11:45:06 +0100
committerRichard Jones <rjones@redhat.com>2010-06-04 15:07:27 +0100
commit4df593496e116dfb635731c058b7627e81fc179c (patch)
treeb2b03040026c9c47d545cb18ecfa08880ce86a65 /src
parent74958b0ad44df6ed703cd3009983d04ade3a8e93 (diff)
downloadlibguestfs-4df593496e116dfb635731c058b7627e81fc179c.tar.gz
libguestfs-4df593496e116dfb635731c058b7627e81fc179c.tar.xz
libguestfs-4df593496e116dfb635731c058b7627e81fc179c.zip
file: Restrict to regular files (RHBZ#582484).
The file call can hang if called on char devices (because we are using the file -s option). This is hard to solve cleanly without adding another file API. However this restricts file to regular files, unless called explicitly with a /dev/ path. For non-regular files, it will now return a string like "directory". There is a small semantic change for symbolic links. Previously it would not have worked at all on absolute links (or rather, the results would have been undefined). It would have treated relative symlinks to regular files as the regular file itself. Now it will return the string "symbolic link" in both cases. This commit also makes the API safe when called on untrusted filesystems. Previously a filesystem might have been set up so that (eg) /etc/redhat-release was a char device, which would have caused virt-inspector and virt-v2v to hang. Now it will not hang.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/generator.ml23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/generator.ml b/src/generator.ml
index c7dbdfc7..37d63f2c 100755
--- a/src/generator.ml
+++ b/src/generator.ml
@@ -1632,19 +1632,32 @@ and physical volumes.");
InitISOFS, Always, TestOutput (
[["file"; "/known-1"]], "ASCII text");
InitISOFS, Always, TestLastFail (
- [["file"; "/notexists"]])],
+ [["file"; "/notexists"]]);
+ InitISOFS, Always, TestOutput (
+ [["file"; "/abssymlink"]], "symbolic link");
+ InitISOFS, Always, TestOutput (
+ [["file"; "/directory"]], "directory")],
"determine file type",
"\
This call uses the standard L<file(1)> command to determine
-the type or contents of the file. This also works on devices,
-for example to find out whether a partition contains a filesystem.
+the type or contents of the file.
This call will also transparently look inside various types
of compressed file.
-The exact command which runs is C<file -zbsL path>. Note in
+The exact command which runs is C<file -zbs path>. Note in
particular that the filename is not prepended to the output
-(the C<-b> option).");
+(the C<-b> option).
+
+This command can also be used on C</dev/> devices
+(and partitions, LV names). You can for example use this
+to determine if a device contains a filesystem, although
+it's usually better to use C<guestfs_vfs_type>.
+
+If the C<path> does not begin with C</dev/> then
+this command only works for the content of regular files.
+For other file types (directory, symbolic link etc) it
+will just return the string C<directory> etc.");
("command", (RString "output", [StringList "arguments"]), 50, [ProtocolLimitWarning],
[InitBasicFS, Always, TestOutput (