Re: [PATCH] storage: Skip socket and fifo on pool-start

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Nov 24, 2011 at 15:22:10 +0100, Michal Privoznik wrote:
> If pool directory contains special files like FIFO or sockets
> we want to skip those on pool-start or pool-refresh otherwise
> open() will get an error.
> ---
>  src/storage/storage_backend.c |   25 ++++++++++++++++---------
>  1 files changed, 16 insertions(+), 9 deletions(-)
> 
> diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
> index 93c98d6..d30829d 100644
> --- a/src/storage/storage_backend.c
> +++ b/src/storage/storage_backend.c
> @@ -1013,9 +1013,24 @@ virStorageBackendVolOpenCheckMode(const char *path, unsigned int flags)
>      struct stat sb;
>      char *base = last_component(path);
>  
> +    if (lstat(path, &sb) < 0) {
> +        virReportSystemError(errno,
> +                             _("cannot stat file '%s'"),
> +                             path);
> +        return -1;
> +    }
> +
> +    if (S_ISFIFO(sb.st_mode)) {
> +        VIR_WARN("ignoring FIFO '%s'", path);
> +        return -2;
> +    } else if (S_ISSOCK(sb.st_mode)) {
> +        VIR_WARN("ignoring socket '%s'", path);
> +        return -2;
> +    }
> +
>      if ((fd = open(path, O_RDONLY|O_NONBLOCK|O_NOCTTY)) < 0) {
>          if ((errno == ENOENT || errno == ELOOP) &&
> -            lstat(path, &sb) == 0) {
> +            S_ISLNK(sb.st_mode)) {
>              VIR_WARN("ignoring dangling symlink '%s'", path);
>              return -2;
>          }
> @@ -1026,14 +1041,6 @@ virStorageBackendVolOpenCheckMode(const char *path, unsigned int flags)
>          return -1;
>      }
>  
> -    if (fstat(fd, &sb) < 0) {
> -        virReportSystemError(errno,
> -                             _("cannot stat file '%s'"),
> -                             path);
> -        VIR_FORCE_CLOSE(fd);
> -        return -1;
> -    }
> -

Oops, you can't remove this fstat since it operates on fd we got by opening
path. Information returned by lstat(path) doesn't have to be the same as what
fstat(fd) returns. Especially, if path is a symlink, the two calls will
provide different results. The following code needs to check st_mode of the
real file not a symlink...

>      if (S_ISREG(sb.st_mode))
>          mode = VIR_STORAGE_VOL_OPEN_REG;
>      else if (S_ISCHR(sb.st_mode))

Jirka

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]