diff options
| author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2026-01-03 10:09:51 +0100 |
|---|---|---|
| committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2026-01-03 10:10:23 +0100 |
| commit | 27894e20f140ee2729c14b589035870c8185b87d (patch) | |
| tree | 2249793d61500b4239ca792885c18215cde0c4f6 /lib | |
| parent | f86148d2777d4d7985ed8f4ae957c41c44bd2484 (diff) | |
libgeom: Fix segfault in 32-on-64 case
We were using strtoul() to parse object identifiers, which are kernel
pointers. This works fine as long as the kernel and userland match,
but in a 32-bit libgeom on a 64-bit kernel this will return ULONG_MAX
for all objects, resulting in memory corruption when we later pick the
wrong object while resolving consumer-producer references.
MFC after: 1 week
PR: 292127
Reviewed by: imp
Differential Revision: https://reviews.freebsd.org/D54452
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/libgeom/geom_xml2tree.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/libgeom/geom_xml2tree.c b/lib/libgeom/geom_xml2tree.c index 2d2c43e29e77..161425d9fadf 100644 --- a/lib/libgeom/geom_xml2tree.c +++ b/lib/libgeom/geom_xml2tree.c @@ -76,10 +76,10 @@ StartElement(void *userData, const char *name, const char **attr) ref = NULL; for (i = 0; attr[i] != NULL; i += 2) { if (!strcmp(attr[i], "id")) { - id = (void *)strtoul(attr[i + 1], NULL, 0); + id = (void *)strtoumax(attr[i + 1], NULL, 0); mt->nident++; } else if (!strcmp(attr[i], "ref")) { - ref = (void *)strtoul(attr[i + 1], NULL, 0); + ref = (void *)strtoumax(attr[i + 1], NULL, 0); } else printf("%*.*s[%s = %s]\n", mt->level + 1, mt->level + 1, "", |
