[PATCH] softmmu/physmem.c: Check return value from realpath()

Peter Maydell posted 1 patch 2 years, 8 months ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20210812151525.31456-1-peter.maydell@linaro.org
Maintainers: David Hildenbrand <david@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Peter Xu <peterx@redhat.com>
softmmu/physmem.c | 3 +++
1 file changed, 3 insertions(+)
[PATCH] softmmu/physmem.c: Check return value from realpath()
Posted by Peter Maydell 2 years, 8 months ago
The realpath() function can return NULL on error, so we need to check
for it to avoid crashing when we try to strstr() into it.
This can happen if we run out of memory, or if /sys/ is not mounted,
among other situations.

Fixes: Coverity 1459913, 1460474
Fixes: ce317be98db0 ("exec: fetch the alignment of Linux devdax pmem character device nodes")
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 softmmu/physmem.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/softmmu/physmem.c b/softmmu/physmem.c
index c47cb6da2e4..eb0595d57c4 100644
--- a/softmmu/physmem.c
+++ b/softmmu/physmem.c
@@ -1451,6 +1451,9 @@ static int64_t get_file_align(int fd)
         path = g_strdup_printf("/sys/dev/char/%d:%d",
                     major(st.st_rdev), minor(st.st_rdev));
         rpath = realpath(path, NULL);
+        if (!rpath) {
+            return -errno;
+        }
 
         rc = daxctl_new(&ctx);
         if (rc) {
-- 
2.20.1


Re: [PATCH] softmmu/physmem.c: Check return value from realpath()
Posted by Liu, Jingqi 2 years, 8 months ago
On 8/12/2021 11:15 PM, Peter Maydell wrote:
> The realpath() function can return NULL on error, so we need to check
> for it to avoid crashing when we try to strstr() into it.
> This can happen if we run out of memory, or if /sys/ is not mounted,
> among other situations.
> 
> Fixes: Coverity 1459913, 1460474
> Fixes: ce317be98db0 ("exec: fetch the alignment of Linux devdax pmem character device nodes")
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>   softmmu/physmem.c | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/softmmu/physmem.c b/softmmu/physmem.c
> index c47cb6da2e4..eb0595d57c4 100644
> --- a/softmmu/physmem.c
> +++ b/softmmu/physmem.c
> @@ -1451,6 +1451,9 @@ static int64_t get_file_align(int fd)
>           path = g_strdup_printf("/sys/dev/char/%d:%d",
>                       major(st.st_rdev), minor(st.st_rdev));
>           rpath = realpath(path, NULL);
> +        if (!rpath) {
> +            return -errno;
> +        }

Good find!

Reviewed-by: Jingqi Liu <jingqi.liu@intel.com>

Thanks,
Jingqi

Re: [PATCH] softmmu/physmem.c: Check return value from realpath()
Posted by Paolo Bonzini 2 years, 8 months ago
On 12/08/21 17:15, Peter Maydell wrote:
> The realpath() function can return NULL on error, so we need to check
> for it to avoid crashing when we try to strstr() into it.
> This can happen if we run out of memory, or if /sys/ is not mounted,
> among other situations.
> 
> Fixes: Coverity 1459913, 1460474
> Fixes: ce317be98db0 ("exec: fetch the alignment of Linux devdax pmem character device nodes")
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>   softmmu/physmem.c | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/softmmu/physmem.c b/softmmu/physmem.c
> index c47cb6da2e4..eb0595d57c4 100644
> --- a/softmmu/physmem.c
> +++ b/softmmu/physmem.c
> @@ -1451,6 +1451,9 @@ static int64_t get_file_align(int fd)
>           path = g_strdup_printf("/sys/dev/char/%d:%d",
>                       major(st.st_rdev), minor(st.st_rdev));
>           rpath = realpath(path, NULL);
> +        if (!rpath) {
> +            return -errno;
> +        }
>   
>           rc = daxctl_new(&ctx);
>           if (rc) {
> 

Queued, thanks.

Paolo