[libvirt] [PATCH] cpu: Properly check input parameters

Jiri Denemark jdenemar at redhat.com
Wed Mar 26 15:14:05 UTC 2014


Most of the APIs in CPU driver do not expect to get NULL for input
parameters. Let's mark them with ATTRIBUTE_NONNULL and also check for
some members of virCPUDef when the APIs expect them have some specific
values.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 src/cpu/cpu.c | 48 +++++++++++++++++++++++++++++++++++++-----------
 src/cpu/cpu.h | 36 ++++++++++++++++++++++++------------
 2 files changed, 61 insertions(+), 23 deletions(-)

diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
index 9cd2300..528e1a7 100644
--- a/src/cpu/cpu.c
+++ b/src/cpu/cpu.c
@@ -108,12 +108,6 @@ cpuCompareXML(virCPUDefPtr host,
     if (cpu == NULL)
         goto cleanup;
 
-    if (!cpu->model) {
-        virReportError(VIR_ERR_OPERATION_INVALID,
-                       "%s", _("no CPU model specified"));
-        goto cleanup;
-    }
-
     ret = cpuCompare(host, cpu);
 
  cleanup:
@@ -146,6 +140,12 @@ cpuCompare(virCPUDefPtr host,
 
     VIR_DEBUG("host=%p, cpu=%p", host, cpu);
 
+    if (!cpu->model) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("no guest CPU model specified"));
+        return VIR_CPU_COMPARE_ERROR;
+    }
+
     if ((driver = cpuGetSubDriver(host->arch)) == NULL)
         return VIR_CPU_COMPARE_ERROR;
 
@@ -203,14 +203,15 @@ cpuDecode(virCPUDefPtr cpu,
     }
 
     if (models == NULL && nmodels != 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "%s", _("nonzero nmodels doesn't match with NULL models"));
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("nonzero nmodels doesn't match with NULL models"));
         return -1;
     }
 
-    if (cpu == NULL) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "%s", _("invalid CPU definition"));
+    if (cpu->type > VIR_CPU_TYPE_GUEST ||
+        cpu->mode != VIR_CPU_MODE_CUSTOM) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("invalid CPU definition stub"));
         return -1;
     }
 
@@ -264,6 +265,12 @@ cpuEncode(virArch arch,
               virArchToString(arch), cpu, forced, required,
               optional, disabled, forbidden, vendor);
 
+    if (!cpu->model) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("no guest CPU model specified"));
+        return -1;
+    }
+
     if ((driver = cpuGetSubDriver(arch)) == NULL)
         return -1;
 
@@ -367,6 +374,12 @@ cpuGuestData(virCPUDefPtr host,
 
     VIR_DEBUG("host=%p, guest=%p, data=%p, msg=%p", host, guest, data, msg);
 
+    if (!guest->model) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("no guest CPU model specified"));
+        return VIR_CPU_COMPARE_ERROR;
+    }
+
     if ((driver = cpuGetSubDriver(host->arch)) == NULL)
         return VIR_CPU_COMPARE_ERROR;
 
@@ -529,6 +542,19 @@ cpuBaseline(virCPUDefPtr *cpus,
         return NULL;
     }
 
+    for (i = 0; i < ncpus; i++) {
+        if (!cpus[i]) {
+            virReportError(VIR_ERR_INVALID_ARG,
+                           _("invalid CPU definition at index %zu"), i);
+            return NULL;
+        }
+        if (!cpus[i]->model) {
+            virReportError(VIR_ERR_INVALID_ARG,
+                           _("no CPU model specified at index %zu"), i);
+            return NULL;
+        }
+    }
+
     if (models == NULL && nmodels != 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        "%s", _("nonzero nmodels doesn't match with NULL models"));
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
index 27169fe..e9f2713 100644
--- a/src/cpu/cpu.h
+++ b/src/cpu/cpu.h
@@ -119,18 +119,21 @@ struct cpuArchDriver {
 
 extern virCPUCompareResult
 cpuCompareXML(virCPUDefPtr host,
-              const char *xml);
+              const char *xml)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 extern virCPUCompareResult
 cpuCompare  (virCPUDefPtr host,
-             virCPUDefPtr cpu);
+             virCPUDefPtr cpu)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 extern int
 cpuDecode   (virCPUDefPtr cpu,
              const virCPUData *data,
              const char **models,
              unsigned int nmodels,
-             const char *preferred);
+             const char *preferred)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 extern int
 cpuEncode   (virArch arch,
@@ -140,7 +143,8 @@ cpuEncode   (virArch arch,
              virCPUDataPtr *optional,
              virCPUDataPtr *disabled,
              virCPUDataPtr *forbidden,
-             virCPUDataPtr *vendor);
+             virCPUDataPtr *vendor)
+    ATTRIBUTE_NONNULL(2);
 
 extern void
 cpuDataFree (virCPUDataPtr data);
@@ -152,7 +156,8 @@ extern virCPUCompareResult
 cpuGuestData(virCPUDefPtr host,
              virCPUDefPtr guest,
              virCPUDataPtr *data,
-             char **msg);
+             char **msg)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 extern char *
 cpuBaselineXML(const char **xmlCPUs,
@@ -166,30 +171,37 @@ cpuBaseline (virCPUDefPtr *cpus,
              unsigned int ncpus,
              const char **models,
              unsigned int nmodels,
-             unsigned int flags);
+             unsigned int flags)
+    ATTRIBUTE_NONNULL(1);
 
 extern int
 cpuUpdate   (virCPUDefPtr guest,
-             const virCPUDef *host);
+             const virCPUDef *host)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 extern int
 cpuHasFeature(const virCPUData *data,
-              const char *feature);
+              const char *feature)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 
 bool
 cpuModelIsAllowed(const char *model,
                   const char **models,
-                  unsigned int nmodels);
+                  unsigned int nmodels)
+    ATTRIBUTE_NONNULL(1);
 
 extern int
-cpuGetModels(const char *arch, char ***models);
+cpuGetModels(const char *arch, char ***models)
+    ATTRIBUTE_NONNULL(1);
 
 /* cpuDataFormat and cpuDataParse are implemented for unit tests only and
  * have no real-life usage
  */
-char *cpuDataFormat(const virCPUData *data);
+char *cpuDataFormat(const virCPUData *data)
+    ATTRIBUTE_NONNULL(1);
 virCPUDataPtr cpuDataParse(virArch arch,
-                           const char *xmlStr);
+                           const char *xmlStr)
+    ATTRIBUTE_NONNULL(2);
 
 #endif /* __VIR_CPU_H__ */
-- 
1.9.1




More information about the libvir-list mailing list