[pve-devel] [PATCH cluster] use unsigned long for strtoul result

Dominik Csapak d.csapak at proxmox.com
Fri Mar 3 09:17:58 CET 2017


strtoul gives back an unsigned long int, which may or may not be wider
than a guint32 (depending on the platform)

when it is wider, the assignment would parse vmids bigger than 2^32 but
truncate them, giving back an invalid vmid

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 data/src/memdb.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/data/src/memdb.c b/data/src/memdb.c
index e10aac4..56044b4 100644
--- a/data/src/memdb.c
+++ b/data/src/memdb.c
@@ -210,19 +210,18 @@ name_is_vm_config(
 	if (!name || name[0] < '1' || name[0] > '9')
 		return FALSE;
 
-	
 	char *end = NULL;
 
 	errno = 0; /* see man strtoul */
-	
-	guint32 vmid =  strtoul(name, &end, 10);
+
+	unsigned long int vmid = strtoul(name, &end, 10);
 
 	if (!end || end[0] != '.' || end[1] != 'c'|| end[2] != 'o' || end[3] != 'n' ||
-	    end[4] != 'f' || end[5] != 0 || errno != 0)
+	    end[4] != 'f' || end[5] != 0 || errno != 0 || vmid > G_MAXUINT32)
 		return FALSE;
 
 	if (vmid_ret)
-		*vmid_ret = vmid;
+		*vmid_ret = (guint32)vmid;
 
 	return TRUE;
 }
-- 
2.1.4





More information about the pve-devel mailing list