storage_conf: Use uid_t/gid_t instead of int to cast the value

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.
This commit is contained in:
Osier Yang 2013-05-22 20:05:22 +08:00
parent ec2b81c68b
commit 6c89768da4

View File

@ -44,6 +44,7 @@
#include "viralloc.h" #include "viralloc.h"
#include "virfile.h" #include "virfile.h"
#include "virstring.h" #include "virstring.h"
#include "virlog.h"
#define VIR_FROM_THIS VIR_FROM_STORAGE #define VIR_FROM_THIS VIR_FROM_STORAGE
@ -747,7 +748,7 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt,
int defaultmode) int defaultmode)
{ {
char *mode; char *mode;
long v; long val;
int ret = -1; int ret = -1;
xmlNodePtr relnode; xmlNodePtr relnode;
xmlNodePtr node; xmlNodePtr node;
@ -784,23 +785,28 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt,
if (virXPathNode("./owner", ctxt) == NULL) { if (virXPathNode("./owner", ctxt) == NULL) {
perms->uid = (uid_t) -1; perms->uid = (uid_t) -1;
} else { } else {
if (virXPathLong("number(./owner)", ctxt, &v) < 0) { if (virXPathLong("number(./owner)", ctxt, &val) < 0 ||
((uid_t)val != val &&
val != -1)) {
virReportError(VIR_ERR_XML_ERROR, "%s", virReportError(VIR_ERR_XML_ERROR, "%s",
_("malformed owner element")); _("malformed owner element"));
goto error; goto error;
} }
perms->uid = (int)v;
perms->uid = val;
} }
if (virXPathNode("./group", ctxt) == NULL) { if (virXPathNode("./group", ctxt) == NULL) {
perms->gid = (gid_t) -1; perms->gid = (gid_t) -1;
} else { } else {
if (virXPathLong("number(./group)", ctxt, &v) < 0) { if (virXPathLong("number(./group)", ctxt, &val) < 0 ||
((gid_t) val != val &&
val != -1)) {
virReportError(VIR_ERR_XML_ERROR, "%s", virReportError(VIR_ERR_XML_ERROR, "%s",
_("malformed group element")); _("malformed group element"));
goto error; goto error;
} }
perms->gid = (int)v; perms->gid = val;
} }
/* NB, we're ignoring missing labels here - they'll simply inherit */ /* NB, we're ignoring missing labels here - they'll simply inherit */