virt-aa-helper: resolve yet to be created paths

In certain cases a xml contains paths that do not yet exist, but
are valid as qemu will create them later on - for example
vhostuser mode=server sockets.

In any such cases so far the check to virFileExists failed and due to
that the paths stayed non-resolved in regard to symlinks.

But for apparmor those non-resolved rules are non functional as they
are evaluated after resolving any symlinks.

Therefore for non-existent files and partially non-existent paths
resolve as much as possible to get valid rules.

Example:
   <interface type='vhostuser'>
       <model type='virtio'/>
       <source type='unix' path='/var/run/symlinknet' mode='server'/>
   </interface>

Got rendered as:
  "/var/run/symlinknet" rw,

But correct with "/var/run" being a symlink to "/run" is:
  "/run/symlinknet" rw,
Signed-off-by: NChristian Ehrhardt <christian.ehrhardt@canonical.com>
Acked-by: NMichal Privoznik <mprivozn@redhat.com>
上级 87c991d5
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include "viralloc.h" #include "viralloc.h"
#include "vircommand.h" #include "vircommand.h"
#include "virlog.h" #include "virlog.h"
#include "dirname.h"
#include "driver.h" #include "driver.h"
#include "security_driver.h" #include "security_driver.h"
...@@ -752,6 +753,9 @@ vah_add_path(virBufferPtr buf, const char *path, const char *perms, bool recursi ...@@ -752,6 +753,9 @@ vah_add_path(virBufferPtr buf, const char *path, const char *perms, bool recursi
bool explicit_deny_rule = true; bool explicit_deny_rule = true;
char *sub = NULL; char *sub = NULL;
char *perms_new = NULL; char *perms_new = NULL;
char *pathdir = NULL;
char *pathtmp = NULL;
char *pathreal = NULL;
if (path == NULL) if (path == NULL)
return rc; return rc;
...@@ -766,14 +770,36 @@ vah_add_path(virBufferPtr buf, const char *path, const char *perms, bool recursi ...@@ -766,14 +770,36 @@ vah_add_path(virBufferPtr buf, const char *path, const char *perms, bool recursi
return 0; return 0;
} }
if (virFileExists(path)) { /* files might be created by qemu later on and not exist right now.
if ((tmp = realpath(path, NULL)) == NULL) { * But realpath needs a valid path to work on, therefore:
vah_error(NULL, 0, path); * 1. walk the path to find longest valid path
vah_error(NULL, 0, _("could not find realpath for disk")); * 2. get the realpath of that valid path
return rc; * 3. re-combine the realpath with the remaining suffix
* Note: A totally non existent path is used as-is
*/
if ((pathdir = mdir_name(path)) == NULL)
goto cleanup;
while (!virFileExists(pathdir)) {
if ((pathtmp = mdir_name(pathdir)) == NULL)
goto cleanup;
VIR_FREE(pathdir);
VIR_STEAL_PTR(pathdir, pathtmp);
}
if (strlen(pathdir) == 1) {
/* nothing of the path does exist yet */
if (VIR_STRDUP_QUIET(tmp, path) < 0)
goto cleanup;
} else {
if (VIR_STRDUP_QUIET(pathtmp, path+strlen(pathdir)) < 0)
goto cleanup;
if ((pathreal = realpath(pathdir, NULL)) == NULL) {
vah_error(NULL, 0, pathdir);
vah_error(NULL, 0, _("could not find realpath"));
goto cleanup;
} }
} else if (VIR_STRDUP_QUIET(tmp, path) < 0) { if (virAsprintfQuiet(&tmp, "%s%s", pathreal, pathtmp) < 0)
return rc; goto cleanup;
} }
if (VIR_STRDUP_QUIET(perms_new, perms) < 0) if (VIR_STRDUP_QUIET(perms_new, perms) < 0)
...@@ -814,6 +840,9 @@ vah_add_path(virBufferPtr buf, const char *path, const char *perms, bool recursi ...@@ -814,6 +840,9 @@ vah_add_path(virBufferPtr buf, const char *path, const char *perms, bool recursi
} }
cleanup: cleanup:
VIR_FREE(pathdir);
VIR_FREE(pathtmp);
VIR_FREE(pathreal);
VIR_FREE(perms_new); VIR_FREE(perms_new);
VIR_FREE(tmp); VIR_FREE(tmp);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册