And error out if the casted value is not same with the original one, which prevents the bug on platform(s) where uid_t/gid_t has different size with long. --- src/conf/storage_conf.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index a62629e..a648c6d 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -747,7 +747,7 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt, int defaultmode) { char *mode; - long v; + long val; int ret = -1; xmlNodePtr relnode; xmlNodePtr node; @@ -784,23 +784,26 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt, if (virXPathNode("./owner", ctxt) == NULL) { perms->uid = (uid_t) -1; } else { - if (virXPathLong("number(./owner)", ctxt, &v) < 0) { + if (virXPathLong("number(./owner)", ctxt, &val) < 0 || + (uid_t)val != val) { virReportError(VIR_ERR_XML_ERROR, "%s", _("malformed owner element")); goto error; } - perms->uid = (int)v; + + perms->uid = (uid_t)val; } if (virXPathNode("./group", ctxt) == NULL) { perms->gid = (gid_t) -1; } else { - if (virXPathLong("number(./group)", ctxt, &v) < 0) { + if (virXPathLong("number(./group)", ctxt, &val) < 0 || + (gid_t)val != val) { virReportError(VIR_ERR_XML_ERROR, "%s", _("malformed group element")); goto error; } - perms->gid = (int)v; + perms->gid = (gid_t)val; } /* NB, we're ignoring missing labels here - they'll simply inherit */ -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list