/**
* virDomainGetSchedulerParameters:
* @domain: pointer to domain object
- * @params: pointer to scheduler parameter object
+ * @params: pointer to scheduler parameter objects
* (return value)
- * @nparams: pointer to number of scheduler parameter
- * (this value should be same than the returned value
+ * @nparams: pointer to number of scheduler parameter objects
+ * (this value must be at least as large as the returned value
* nparams of virDomainGetSchedulerType)
*
- * Get the scheduler parameters, the @params array will be filled with the
- * values.
+ * Get all scheduler parameters, the @params array will be filled with the
+ * values and @nparams will be updated to the number of valid elements in
+ * @params.
*
* Returns -1 in case of error, 0 in case of success.
*/
virDispatchError(NULL);
return -1;
}
+
+ if (params == NULL || nparams == NULL || *nparams <= 0) {
+ virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+ goto error;
+ }
+
conn = domain->conn;
if (conn->driver->domainGetSchedulerParameters) {
goto cleanup;
}
- if (*nparams != XEN_SCHED_CREDIT_NPARAM) {
+ if (*nparams < XEN_SCHED_CREDIT_NPARAM) {
libxlError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count"));
goto cleanup;
}
goto cleanup;
}
+ *nparams = XEN_SCHED_CREDIT_NPARAM;
ret = 0;
cleanup:
if (driver->cgroup == NULL)
return -1;
- if ((*nparams) != 1) {
+ if (*nparams < 1) {
lxcError(VIR_ERR_INVALID_ARG,
"%s", _("Invalid parameter count"));
return -1;
}
params[0].type = VIR_DOMAIN_SCHED_FIELD_ULLONG;
+ *nparams = 1;
ret = 0;
cleanup:
goto cleanup;
}
- if ((*nparams) != 1) {
+ if (*nparams < 1) {
qemuReportError(VIR_ERR_INVALID_ARG,
"%s", _("Invalid parameter count"));
goto cleanup;
goto cleanup;
}
+ *nparams = 1;
ret = 0;
cleanup:
goto cleanup;
}
- if (*nparams != 1) {
- testError(VIR_ERR_INVALID_ARG, "nparams");
+ if (*nparams < 1) {
+ testError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count"));
goto cleanup;
}
strcpy(params[0].field, "weight");
/* XXX */
/*params[0].value.ui = privdom->weight;*/
params[0].value.ui = 50;
+
+ *nparams = 1;
ret = 0;
cleanup:
# define XEND_DOMAINS_DIR "/var/lib/xend/domains"
+# define XEN_SCHED_SEDF_NPARAM 6
+# define XEN_SCHED_CRED_NPARAM 2
+
/* _xenUnifiedDriver:
*
* Entry points into the underlying Xen drivers. This structure
if (schedulertype == NULL)
virReportOOMError();
if (nparams)
- *nparams = 6;
+ *nparams = XEN_SCHED_SEDF_NPARAM;
break;
case XEN_SCHEDULER_CREDIT:
schedulertype = strdup("credit");
if (schedulertype == NULL)
virReportOOMError();
if (nparams)
- *nparams = 2;
+ *nparams = XEN_SCHED_CRED_NPARAM;
break;
default:
break;
* @domain: pointer to the Xen Hypervisor block
* @params: pointer to scheduler parameters.
* This memory area should be allocated before calling.
- * @nparams:this parameter should be same as
- * a given number of scheduler parameters.
+ * @nparams: this parameter must be at least as large as
+ * the given number of scheduler parameters.
* from xenHypervisorGetSchedulerType().
*
* Do a low level hypercall to get scheduler parameters
switch (op_sys.u.getschedulerid.sched_id){
case XEN_SCHEDULER_SEDF:
+ if (*nparams < XEN_SCHED_SEDF_NPARAM) {
+ virXenError(VIR_ERR_INVALID_ARG,
+ "%s", _("Invalid parameter count"));
+ return -1;
+ }
+
/* TODO: Implement for Xen/SEDF */
TODO
return(-1);
case XEN_SCHEDULER_CREDIT:
- if (*nparams < 2)
- return(-1);
+ if (*nparams < XEN_SCHED_CRED_NPARAM) {
+ virXenError(VIR_ERR_INVALID_ARG,
+ "%s", _("Invalid parameter count"));
+ return -1;
+ }
memset(&op_dom, 0, sizeof(op_dom));
op_dom.cmd = XEN_V2_OP_SCHEDULER;
op_dom.domain = (domid_t) domain->id;
params[1].type = VIR_DOMAIN_SCHED_FIELD_UINT;
params[1].value.ui = op_dom.u.getschedinfo.u.credit.cap;
- *nparams = 2;
+ *nparams = XEN_SCHED_CRED_NPARAM;
break;
default:
virXenErrorFunc(VIR_ERR_INVALID_ARG, __FUNCTION__,
/*
* The number of Xen scheduler parameters
*/
-#define XEN_SCHED_SEDF_NPARAM 6
-#define XEN_SCHED_CRED_NPARAM 2
#define XEND_RCV_BUF_MAX_LEN 65536
int sched_nparam = 0;
int ret = -1;
- if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
- || (params == NULL) || (nparams == NULL)) {
+ if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
return (-1);
}
switch (sched_nparam){
case XEN_SCHED_SEDF_NPARAM:
+ if (*nparams < XEN_SCHED_SEDF_NPARAM) {
+ virXendError(VIR_ERR_INVALID_ARG,
+ "%s", _("Invalid parameter count"));
+ goto error;
+ }
+
/* TODO: Implement for Xen/SEDF */
TODO
goto error;
case XEN_SCHED_CRED_NPARAM:
+ if (*nparams < XEN_SCHED_CRED_NPARAM) {
+ virXendError(VIR_ERR_INVALID_ARG,
+ "%s", _("Invalid parameter count"));
+ goto error;
+ }
+
/* get cpu_weight/cpu_cap from xend/domain */
if (sexpr_node(root, "domain/cpu_weight") == NULL) {
virXendError(VIR_ERR_INTERNAL_ERROR,