mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
cpu: Properly check input parameters
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@redhat.com>
This commit is contained in:
parent
a1b1fcdcfe
commit
7eca4a5b32
@ -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"));
|
||||
|
@ -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__ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user