applied with the following fixup commit we talked about off-list:

---8<---
>From c22040264ebe7b5b8b1dcd16c1af8d174600b1ea Mon Sep 17 00:00:00 2001
From: Wolfgang Bumiller <w.bumil...@proxmox.com>
Date: Fri, 30 Aug 2019 10:09:46 +0200
Subject: [PATCH cluster] pmxcfs: cleanup remaining_size calculation

using an end-pointer it's a bit more readable and gets rid
of an (int) cast

Signed-off-by: Wolfgang Bumiller <w.bumil...@proxmox.com>
---
 data/src/status.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/data/src/status.c b/data/src/status.c
index 1dfde53..e9983b7 100644
--- a/data/src/status.c
+++ b/data/src/status.c
@@ -803,8 +803,9 @@ cfs_create_vmlist_msg(GString *str)
 static char *
 _get_property_value(char *conf, int conf_size, const char *prop, int prop_len)
 {
+       const char *const conf_end = conf + conf_size;
        char *line = conf;
-       int remaining_size;
+       size_t remaining_size;
 
        char *next_newline = memchr(conf, '\n', conf_size);
        if (next_newline == NULL) {
@@ -838,11 +839,11 @@ _get_property_value(char *conf, int conf_size, const char 
*prop, int prop_len)
                        return v_start;
                }
 next:
-               remaining_size = conf_size - (int) (next_newline - conf);
-               if (remaining_size <= 1 || remaining_size <= prop_len) {
+               line = next_newline + 1;
+               remaining_size = conf_end - line;
+               if (remaining_size <= prop_len) {
                        return NULL;
                }
-               line = next_newline + 1;
                next_newline = memchr(line, '\n', remaining_size);
                if (next_newline == NULL) {
                        return NULL; // valid property lines end with \n, but 
none in the config
-- 
2.20.1

---8<---

On Thu, Aug 29, 2019 at 02:45:08PM +0200, Thomas Lamprecht wrote:
> pmxcfs files need to be treated as blobs, while we can have some
> assumptions on certain files, like the $vmid.conf ones, we should
> still cope with problematic files.
> Especially, the files may not end with \0, so always ensure that we
> read at most file-size bytes.
> 
> Replace strtok_r, which assumes that the data is NUL terminated, and
> use memchr, with logic ensuring that we never read over the size
> returned by memdb_read.
> 
> Signed-off-by: Thomas Lamprecht <t.lampre...@proxmox.com>
> ---
>  data/src/status.c | 29 ++++++++++++++++++++++-------
>  1 file changed, 22 insertions(+), 7 deletions(-)
> 
> diff --git a/data/src/status.c b/data/src/status.c
> index e437476..1dfde53 100644
> --- a/data/src/status.c
> +++ b/data/src/status.c
> @@ -801,15 +801,21 @@ cfs_create_vmlist_msg(GString *str)
>  // currently we only look at the current configuration in place, i.e., *no*
>  // snapshort and *no* pending changes
>  static char *
> -_get_property_value(char *conf, const char *prop, int prop_len)
> +_get_property_value(char *conf, int conf_size, const char *prop, int 
> prop_len)
>  {
> -     char *line = NULL, *temp = NULL;
> +     char *line = conf;
> +     int remaining_size;
> +
> +     char *next_newline = memchr(conf, '\n', conf_size);
> +     if (next_newline == NULL) {
> +             return NULL; // valid property lines end with \n, but none in 
> the config
> +     }
> +     *next_newline = '\0';
>  
> -     line = strtok_r(conf, "\n", &temp);
>       while (line != NULL) {
>               if (!line[0]) goto next;
>  
> -             // snapshot or pending section start and nothing found yet
> +             // snapshot or pending section start, but nothing found yet -> 
> not found
>               if (line[0] == '[') return NULL;
>               // properties start with /^[a-z]/, so continue early if not
>               if (line[0] < 'a' || line[0] > 'z') goto next;
> @@ -832,7 +838,16 @@ _get_property_value(char *conf, const char *prop, int 
> prop_len)
>                       return v_start;
>               }
>  next:
> -             line = strtok_r(NULL, "\n", &temp);
> +             remaining_size = conf_size - (int) (next_newline - conf);
> +             if (remaining_size <= 1 || remaining_size <= prop_len) {
> +                     return NULL;
> +             }
> +             line = next_newline + 1;
> +             next_newline = memchr(line, '\n', remaining_size);
> +             if (next_newline == NULL) {
> +                     return NULL; // valid property lines end with \n, but 
> none in the config
> +             }
> +             *next_newline = '\0';
>       }
>  
>       return NULL; // not found
> @@ -884,7 +899,7 @@ cfs_create_guest_conf_property_msg(GString *str, memdb_t 
> *memdb, const char *pro
>               if (tmp == NULL) goto err;
>               if (size <= prop_len) goto ret;
>  
> -             char *val = _get_property_value(tmp, prop, prop_len);
> +             char *val = _get_property_value(tmp, size, prop, prop_len);
>               if (val == NULL) goto ret;
>  
>               g_string_append_printf(str, "\"%u\":{", vmid);
> @@ -907,7 +922,7 @@ cfs_create_guest_conf_property_msg(GString *str, memdb_t 
> *memdb, const char *pro
>                       int size = memdb_read(memdb, path->str, &tmp);
>                       if (tmp == NULL || size <= prop_len) continue;
>  
> -                     char *val = _get_property_value(tmp, prop, prop_len);
> +                     char *val = _get_property_value(tmp, size, prop, 
> prop_len);
>                       if (val == NULL) continue;
>  
>                       if (!first) g_string_append_printf(str, ",\n");
> -- 
> 2.20.1

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to