This way users can provide mount options for for example NFS
storage pools.
---
src/storage/storage_backend_fs.c | 44 ++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 33551e7..66d7bec 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -377,6 +377,8 @@ static int
virStorageBackendFileSystemMount(virStoragePoolObjPtr pool)
{
char *src = NULL;
+ char *options = NULL;
+ char *optionsflag = NULL;
/* 'mount -t auto' doesn't seem to auto determine nfs (or cifs),
* while plain 'mount' does. We have to craft separate argvs to
* accommodate this */
@@ -385,8 +387,10 @@ virStorageBackendFileSystemMount(virStoragePoolObjPtr pool)
bool glusterfs = (pool->def->type == VIR_STORAGE_POOL_NETFS &&
pool->def->source.format ==
VIR_STORAGE_POOL_NETFS_GLUSTERFS);
virCommandPtr cmd = NULL;
+ virBuffer optionsbuf = VIR_BUFFER_INITIALIZER;
int ret = -1;
int rc;
+ int i;
if (pool->def->type == VIR_STORAGE_POOL_NETFS) {
if (pool->def->source.nhost != 1) {
@@ -432,9 +436,45 @@ virStorageBackendFileSystemMount(virStoragePoolObjPtr pool)
if (VIR_STRDUP(src, pool->def->source.devices[0].path) < 0)
return -1;
}
+
+ /*
+ * Mount options for NFS pool.
+ * For security reasons we do not simply build a string based on
+ * the given mount options. This is to prevent any shell injection
+ * or non-valid mount options.
+ */
+ if (pool->def->type == VIR_STORAGE_POOL_NETFS) {
+ if (pool->def->source.noptions > 0) {
+ for (i = 0; i < pool->def->source.noptions; i++) {
+ char *name = pool->def->source.options[i].name;
+ char *value = pool->def->source.options[i].value;
+ if (name != NULL && value == NULL)
+ virBufferAsprintf(&optionsbuf, "%s,", name);
+
+ if (name != NULL && value != NULL)
+ virBufferAsprintf(&optionsbuf, "%s=%s,", name,
value);
+ }
+
+ if (virBufferError(&optionsbuf))
+ goto no_memory;
+
+ /*
+ * Strip the last character from the options string since
+ * that will be a comma.
+ */
+ options = virBufferContentAndReset(&optionsbuf);
+ if (options != NULL) {
+ options[strlen(options)-1] = 0;
+ if (virAsprintf(&optionsflag, "%s", "-o") == -1)
+ return -1;
+ }
+ }
+ }
if (netauto)
cmd = virCommandNewArgList(MOUNT,
+ optionsflag,
+ options,
src,
pool->def->target.path,
NULL);
@@ -455,6 +495,8 @@ virStorageBackendFileSystemMount(virStoragePoolObjPtr pool)
(pool->def->type == VIR_STORAGE_POOL_FS ?
virStoragePoolFormatFileSystemTypeToString(pool->def->source.format) :
virStoragePoolFormatFileSystemNetTypeToString(pool->def->source.format)),
+ optionsflag,
+ options,
src,
pool->def->target.path,
NULL);
@@ -463,6 +505,8 @@ virStorageBackendFileSystemMount(virStoragePoolObjPtr pool)
goto cleanup;
ret = 0;
+ no_memory:
+ virReportOOMError();
cleanup:
virCommandFree(cmd);
VIR_FREE(src);
--
1.7.9.5