[Libguestfs] [PATCH] mknod: filter modes in mkfifo, mknod_b, mknod_c (RHBZ#1182463).
Richard W.M. Jones
rjones at redhat.com
Mon Jan 19 13:59:41 UTC 2015
On Thu, Jan 15, 2015 at 02:44:58PM +0100, Pino Toscano wrote:
> Since mkfifo, mknod_b, and mknod_c add the correct file type to the
> modes of the resulting file, make sure the specified mode contains only
> permissions bits.
> ---
> daemon/mknod.c | 15 +++++++++++++++
> generator/actions.ml | 21 ++++++++++++++++++---
> 2 files changed, 33 insertions(+), 3 deletions(-)
>
> diff --git a/daemon/mknod.c b/daemon/mknod.c
> index 7f71210..9af8701 100644
> --- a/daemon/mknod.c
> +++ b/daemon/mknod.c
> @@ -38,6 +38,15 @@ optgroup_mknod_available (void)
> return 1;
> }
>
> +#define CHECK_MODE \
> + do { \
> + if ((mode & ~07777) != 0) { \
> + reply_with_error ("%o: mode must specify only file permission bits", \
> + (unsigned int) mode); \
> + return -1; \
> + } \
> + } while (0)
> +
> int
> do_mknod (int mode, int devmajor, int devminor, const char *path)
> {
> @@ -63,18 +72,24 @@ do_mknod (int mode, int devmajor, int devminor, const char *path)
> int
> do_mkfifo (int mode, const char *path)
> {
> + CHECK_MODE;
> +
> return do_mknod (mode | S_IFIFO, 0, 0, path);
> }
>
> int
> do_mknod_b (int mode, int devmajor, int devminor, const char *path)
> {
> + CHECK_MODE;
> +
> return do_mknod (mode | S_IFBLK, devmajor, devminor, path);
> }
>
> int
> do_mknod_c (int mode, int devmajor, int devminor, const char *path)
> {
> + CHECK_MODE;
> +
> return do_mknod (mode | S_IFCHR, devmajor, devminor, path);
> }
>
> diff --git a/generator/actions.ml b/generator/actions.ml
> index 96a9dd6..c48ad1a 100644
> --- a/generator/actions.ml
> +++ b/generator/actions.ml
> @@ -6173,7 +6173,9 @@ The mode actually set is affected by the umask." };
> InitScratchFS, Always, TestResult (
> [["mkfifo"; "0o777"; "/mkfifo"];
> ["stat"; "/mkfifo"]],
> - "S_ISFIFO (ret->mode) && (ret->mode & 0777) == 0755"), []
> + "S_ISFIFO (ret->mode) && (ret->mode & 0777) == 0755"), [];
> + InitScratchFS, Always, TestLastFail (
> + [["mkfifo"; "0o20777"; "/mkfifo-2"]]), [];
> ];
> shortdesc = "make FIFO (named pipe)";
> longdesc = "\
> @@ -6181,6 +6183,9 @@ This call creates a FIFO (named pipe) called C<path> with
> mode C<mode>. It is just a convenient wrapper around
> C<guestfs_mknod>.
>
> +Unlike with C<guestfs_mknod>, C<mode> B<must> contain only permissions
> +bits.
> +
> The mode actually set is affected by the umask." };
>
> { defaults with
> @@ -6192,7 +6197,9 @@ The mode actually set is affected by the umask." };
> InitScratchFS, Always, TestResult (
> [["mknod_b"; "0o777"; "99"; "66"; "/mknod_b"];
> ["stat"; "/mknod_b"]],
> - "S_ISBLK (ret->mode) && (ret->mode & 0777) == 0755"), []
> + "S_ISBLK (ret->mode) && (ret->mode & 0777) == 0755"), [];
> + InitScratchFS, Always, TestLastFail (
> + [["mknod_b"; "0o10777"; "99"; "66"; "/mknod_b-2"]]), [];
> ];
> shortdesc = "make block device node";
> longdesc = "\
> @@ -6200,6 +6207,9 @@ This call creates a block device node called C<path> with
> mode C<mode> and device major/minor C<devmajor> and C<devminor>.
> It is just a convenient wrapper around C<guestfs_mknod>.
>
> +Unlike with C<guestfs_mknod>, C<mode> B<must> contain only permissions
> +bits.
> +
> The mode actually set is affected by the umask." };
>
> { defaults with
> @@ -6211,7 +6221,9 @@ The mode actually set is affected by the umask." };
> InitScratchFS, Always, TestResult (
> [["mknod_c"; "0o777"; "99"; "66"; "/mknod_c"];
> ["stat"; "/mknod_c"]],
> - "S_ISCHR (ret->mode) && (ret->mode & 0777) == 0755"), []
> + "S_ISCHR (ret->mode) && (ret->mode & 0777) == 0755"), [];
> + InitScratchFS, Always, TestLastFail (
> + [["mknod_c"; "0o20777"; "99"; "66"; "/mknod_c-2"]]), [];
> ];
> shortdesc = "make char device node";
> longdesc = "\
> @@ -6219,6 +6231,9 @@ This call creates a char device node called C<path> with
> mode C<mode> and device major/minor C<devmajor> and C<devminor>.
> It is just a convenient wrapper around C<guestfs_mknod>.
>
> +Unlike with C<guestfs_mknod>, C<mode> B<must> contain only permissions
> +bits.
> +
> The mode actually set is affected by the umask." };
>
> { defaults with
> --
> 1.9.3
ACK.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html
More information about the Libguestfs
mailing list