
On 9/25/18 3:34 AM, Michal Privoznik wrote:
It may happen that in the list of paths/disk sources to relabel there is a disk source. If that is the case, the path is NULL. In that case, we shouldn't try to lock the path. It's likely a network disk anyway and therefore there is nothing to lock.
I think this needs a tweak to reference commit 6d855abc1 which only filtered if the provided @p was a directory. This adds another filter when @p is NULL such as would be the case with networked storage. NB: The storage source is only passed for DAC and not selinux. The DAC code makes a some valiant attempts at src->path if not Local too. The selinux code has lots of branches and callers which seem to validly pass a path, but I could have missed a path or some nuance. The "key" is chasing virSecurityDACChownListAppend and virSecuritySELinuxContextListAppend where the list->[n]items is populated via VIR_APPEND_ELEMENT. Expect to spend some time on the chase! You already have an R-by and I don't have anything else to provide on this particular one other than yeah, better safe than sorry and passing NULL. Although I have to imagine the stat(NULL, &s) in virFileIsDir wouldn't have been pleased. John
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/security/security_dac.c | 3 ++- src/security/security_selinux.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/security/security_dac.c b/src/security/security_dac.c index 876cca0f2f..04168feb3d 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -216,7 +216,8 @@ virSecurityDACTransactionRun(pid_t pid ATTRIBUTE_UNUSED, for (i = 0; i < list->nItems; i++) { const char *p = list->items[i]->path;
- if (virFileIsDir(p)) + if (!p || + virFileIsDir(p)) continue;
VIR_APPEND_ELEMENT_COPY_INPLACE(paths, npaths, p); diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index 3c847d8dcb..3adbeada14 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -227,7 +227,8 @@ virSecuritySELinuxTransactionRun(pid_t pid ATTRIBUTE_UNUSED, for (i = 0; i < list->nItems; i++) { const char *p = list->items[i]->path;
- if (virFileIsDir(p)) + if (!p || + virFileIsDir(p)) continue;
VIR_APPEND_ELEMENT_COPY_INPLACE(paths, npaths, p);