[libvirt] [PATCH v2 1/5] security_dac: Resolve virSecurityDACSetOwnershipInternal const correctness
John Ferlan
jferlan at redhat.com
Mon Jan 9 20:38:09 UTC 2017
On 01/09/2017 07:58 AM, Michal Privoznik wrote:
> The code at the very bottom of the DAC secdriver that calls
> chown() should be fine with read-only data. If something needs to
> be prepared it should have been done beforehand.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/qemu/qemu_driver.c | 25 ++++++++++++++++---------
> src/security/security_dac.c | 4 ++--
> src/security/security_manager.h | 2 +-
> src/storage/storage_backend.h | 2 +-
> src/storage/storage_backend_fs.c | 2 +-
> src/storage/storage_backend_gluster.c | 2 +-
> src/storage/storage_driver.c | 6 +++---
> src/storage/storage_driver.h | 4 ++--
> src/util/virstoragefile.c | 2 +-
> src/util/virstoragefile.h | 2 +-
> 10 files changed, 29 insertions(+), 22 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 675a4d0e7..6a45ccd9b 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -329,10 +329,11 @@ qemuAutostartDomains(virQEMUDriverPtr driver)
>
>
> static int
> -qemuSecurityChownCallback(virStorageSourcePtr src,
> +qemuSecurityChownCallback(const virStorageSource *src,
> uid_t uid,
> gid_t gid)
> {
> + virStorageSourcePtr cpy = NULL;
> struct stat sb;
> int save_errno = 0;
> int ret = -1;
> @@ -355,22 +356,28 @@ qemuSecurityChownCallback(virStorageSourcePtr src,
> }
>
> return chown(src->path, uid, gid);
^^ v1 had a "ret = chown()"; goto cleanup;
hence why I suggested else logic.
Of course if you just return then the else isn't necessary. I just
envision someone coming along shortly and writing a patch to remove the
else because it's decidedly unnecessary now.
ACK - with either a ret = chown or just undoing the else now....
John
> - }
> + } else {
> + if (!(cpy = virStorageSourceCopy(src, false)))
> + goto cleanup;
>
> - /* storage file init reports errors, return -2 on failure */
> - if (virStorageFileInit(src) < 0)
> - return -2;
> + /* src file init reports errors, return -2 on failure */
> + if (virStorageFileInit(cpy) < 0) {
> + ret = -2;
> + goto cleanup;
> + }
>
> - if (virStorageFileChown(src, uid, gid) < 0) {
> - save_errno = errno;
> - goto cleanup;
> + if (virStorageFileChown(cpy, uid, gid) < 0) {
> + save_errno = errno;
> + goto cleanup;
> + }
> }
>
> ret = 0;
>
> cleanup:
> - virStorageFileDeinit(src);
> errno = save_errno;
> + virStorageFileDeinit(cpy);
> + virStorageSourceFree(cpy);
>
> return ret;
> }
> diff --git a/src/security/security_dac.c b/src/security/security_dac.c
> index 649219e52..b6f75fe1d 100644
> --- a/src/security/security_dac.c
> +++ b/src/security/security_dac.c
> @@ -279,8 +279,8 @@ virSecurityDACPreFork(virSecurityManagerPtr mgr)
> }
>
> static int
> -virSecurityDACSetOwnershipInternal(virSecurityDACDataPtr priv,
> - virStorageSourcePtr src,
> +virSecurityDACSetOwnershipInternal(const virSecurityDACData *priv,
> + const virStorageSource *src,
> const char *path,
> uid_t uid,
> gid_t gid)
> diff --git a/src/security/security_manager.h b/src/security/security_manager.h
> index 0d22cb15f..80fceddc8 100644
> --- a/src/security/security_manager.h
> +++ b/src/security/security_manager.h
> @@ -62,7 +62,7 @@ int virSecurityManagerStackAddNested(virSecurityManagerPtr stack,
> * @src. The callback shall return 0 on success, -1 on error and errno set (no
> * libvirt error reported) OR -2 and a libvirt error reported. */
> typedef int
> -(*virSecurityManagerDACChownCallback)(virStorageSourcePtr src,
> +(*virSecurityManagerDACChownCallback)(const virStorageSource *src,
> uid_t uid,
> gid_t gid);
>
> diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h
> index 28e1a6517..82fbbbf6d 100644
> --- a/src/storage/storage_backend.h
> +++ b/src/storage/storage_backend.h
> @@ -285,7 +285,7 @@ typedef int
> int mode);
>
> typedef int
> -(*virStorageFileBackendChown)(virStorageSourcePtr src,
> +(*virStorageFileBackendChown)(const virStorageSource *src,
> uid_t uid,
> gid_t gid);
>
> diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
> index de0e8d57d..9de0c17c0 100644
> --- a/src/storage/storage_backend_fs.c
> +++ b/src/storage/storage_backend_fs.c
> @@ -1600,7 +1600,7 @@ virStorageFileBackendFileAccess(virStorageSourcePtr src,
>
>
> static int
> -virStorageFileBackendFileChown(virStorageSourcePtr src,
> +virStorageFileBackendFileChown(const virStorageSource *src,
> uid_t uid,
> gid_t gid)
> {
> diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c
> index 8e867043e..ae0611543 100644
> --- a/src/storage/storage_backend_gluster.c
> +++ b/src/storage/storage_backend_gluster.c
> @@ -809,7 +809,7 @@ virStorageFileBackendGlusterGetUniqueIdentifier(virStorageSourcePtr src)
>
>
> static int
> -virStorageFileBackendGlusterChown(virStorageSourcePtr src,
> +virStorageFileBackendGlusterChown(const virStorageSource *src,
> uid_t uid,
> gid_t gid)
> {
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index 5fc706634..8f1d3f04c 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -2848,7 +2848,7 @@ int storageRegister(void)
>
> /* ----------- file handlers cooperating with storage driver --------------- */
> static bool
> -virStorageFileIsInitialized(virStorageSourcePtr src)
> +virStorageFileIsInitialized(const virStorageSource *src)
> {
> return src && src->drv;
> }
> @@ -2888,7 +2888,7 @@ virStorageFileSupportsBackingChainTraversal(virStorageSourcePtr src)
> * driver to perform labelling
> */
> bool
> -virStorageFileSupportsSecurityDriver(virStorageSourcePtr src)
> +virStorageFileSupportsSecurityDriver(const virStorageSource *src)
> {
> int actualType;
> virStorageFileBackendPtr backend;
> @@ -3179,7 +3179,7 @@ virStorageFileAccess(virStorageSourcePtr src,
> * by libvirt storage backend.
> */
> int
> -virStorageFileChown(virStorageSourcePtr src,
> +virStorageFileChown(const virStorageSource *src,
> uid_t uid,
> gid_t gid)
> {
> diff --git a/src/storage/storage_driver.h b/src/storage/storage_driver.h
> index 3f2549da5..682c9ff82 100644
> --- a/src/storage/storage_driver.h
> +++ b/src/storage/storage_driver.h
> @@ -44,9 +44,9 @@ ssize_t virStorageFileReadHeader(virStorageSourcePtr src,
> char **buf);
> const char *virStorageFileGetUniqueIdentifier(virStorageSourcePtr src);
> int virStorageFileAccess(virStorageSourcePtr src, int mode);
> -int virStorageFileChown(virStorageSourcePtr src, uid_t uid, gid_t gid);
> +int virStorageFileChown(const virStorageSource *src, uid_t uid, gid_t gid);
>
> -bool virStorageFileSupportsSecurityDriver(virStorageSourcePtr src);
> +bool virStorageFileSupportsSecurityDriver(const virStorageSource *src);
>
> int virStorageFileGetMetadata(virStorageSourcePtr src,
> uid_t uid, gid_t gid,
> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
> index ce6d21388..3d4bda700 100644
> --- a/src/util/virstoragefile.c
> +++ b/src/util/virstoragefile.c
> @@ -2082,7 +2082,7 @@ virStorageSourceGetActualType(const virStorageSource *def)
>
>
> bool
> -virStorageSourceIsLocalStorage(virStorageSourcePtr src)
> +virStorageSourceIsLocalStorage(const virStorageSource *src)
> {
> virStorageType type = virStorageSourceGetActualType(src);
>
> diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
> index 1f62244db..bea1c35a2 100644
> --- a/src/util/virstoragefile.h
> +++ b/src/util/virstoragefile.h
> @@ -349,7 +349,7 @@ int virStorageSourceInitChainElement(virStorageSourcePtr newelem,
> void virStorageSourcePoolDefFree(virStorageSourcePoolDefPtr def);
> void virStorageSourceClear(virStorageSourcePtr def);
> int virStorageSourceGetActualType(const virStorageSource *def);
> -bool virStorageSourceIsLocalStorage(virStorageSourcePtr src);
> +bool virStorageSourceIsLocalStorage(const virStorageSource *src);
> bool virStorageSourceIsEmpty(virStorageSourcePtr src);
> bool virStorageSourceIsBlockLocal(const virStorageSource *src);
> void virStorageSourceFree(virStorageSourcePtr def);
>
More information about the libvir-list
mailing list