
Daniel P. Berrange wrote:
On Tue, Oct 21, 2008 at 03:57:00PM +0200, Chris Lalancette wrote:
Because of my patch last week that converted the various virStorage*FromString and virStorage*ToString implementations to the generic VIR_ENUM_IMPL, there were a couple of places that didn't properly set errors when they failed. This patch fixes these places up. It also adds an additional check in virEnumFromString(), so that if a NULL type is passed in, it fails instead of SEGV'ing.
ACK to the setting of errors, but not....
diff -up ./src/storage_conf.c.p1 ./src/storage_conf.c --- ./src/storage_conf.c.p1 2008-10-21 14:48:10.000000000 +0200 +++ ./src/storage_conf.c 2008-10-21 14:56:59.000000000 +0200 @@ -276,6 +276,8 @@ virStoragePoolDefParseDoc(virConnectPtr if (options->formatFromString) { char *format = virXPathString(conn, "string(/pool/source/format/@type)", ctxt); if ((ret->source.format = (options->formatFromString)(format)) < 0) { + virStorageReportError(conn, VIR_ERR_XML_ERROR, + _("unknown pool format type %s"), format); VIR_FREE(format); goto cleanup; } @@ -521,8 +526,12 @@ virStoragePoolDefFormat(virConnectPtr co
if (options->formatToString) { const char *format = (options->formatToString)(def->source.format); - if (!format) + if (!format) { + virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, + _("unknown pool format number %d"), + def->source.format); goto cleanup; + } virBufferVSprintf(&buf," <format type='%s'/>\n", format); }
@@ -751,6 +760,8 @@ virStorageVolDefParseDoc(virConnectPtr c if (options->formatFromString) { char *format = virXPathString(conn, "string(/volume/target/format/@type)", ctxt); if ((ret->target.format = (options->formatFromString)(format)) < 0) { + virStorageReportError(conn, VIR_ERR_XML_ERROR, + _("unknown volume format type %s"), format); VIR_FREE(format); goto cleanup; } @@ -885,8 +896,12 @@ virStorageVolDefFormat(virConnectPtr con
if (options->formatToString) { const char *format = (options->formatToString)(def->target.format); - if (!format) + if (!format) { + virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, + _("unknown volume format number %d"), + def->target.format); goto cleanup; + } virBufferVSprintf(&buf," <format type='%s'/>\n", format); }
diff -up ./src/util.c.p1 ./src/util.c --- ./src/util.c.p1 2008-10-21 14:59:37.000000000 +0200 +++ ./src/util.c 2008-10-21 15:00:07.000000000 +0200 @@ -1018,6 +1018,10 @@ int virEnumFromString(const char *const* const char *type) { unsigned int i; + + if (type == NULL) + return -1; + for (i = 0 ; i < ntypes ; i++) if (STREQ(types[i], type)) return i;
But not to this hunk - its better handled by having an explicit default format for parsing, because we need to have a concept of defaults, to be able to distinguish it from truely unknown settings.
Committed this patch, minus the above hunk. I'll rework it to have the .default as Dan suggested in 3/5. Chris Lalancette -- Chris Lalancette