summaryrefslogtreecommitdiffstats
path: root/src/power
diff options
context:
space:
mode:
authorRadek Novacek <rnovacek@redhat.com>2013-11-04 10:33:27 +0100
committerRadek Novacek <rnovacek@redhat.com>2013-11-04 11:08:55 +0100
commit03204e963d2a6a179ff725348ea76ced0e50228b (patch)
treee4da2e890df031369e5234a13e362b58a55f956f /src/power
parent8a39563a406a7a683b34725e64470a804ffa55bf (diff)
downloadopenlmi-providers-03204e963d2a6a179ff725348ea76ced0e50228b.tar.gz
openlmi-providers-03204e963d2a6a179ff725348ea76ced0e50228b.tar.xz
openlmi-providers-03204e963d2a6a179ff725348ea76ced0e50228b.zip
power: handle memory allocation failures properly
Diffstat (limited to 'src/power')
-rw-r--r--src/power/LMI_AssociatedPowerManagementServiceProvider.c3
-rw-r--r--src/power/LMI_PowerManagementCapabilitiesProvider.c3
-rw-r--r--src/power/LMI_PowerManagementServiceProvider.c7
-rw-r--r--src/power/power.c21
4 files changed, 30 insertions, 4 deletions
diff --git a/src/power/LMI_AssociatedPowerManagementServiceProvider.c b/src/power/LMI_AssociatedPowerManagementServiceProvider.c
index a7748cb..f02531c 100644
--- a/src/power/LMI_AssociatedPowerManagementServiceProvider.c
+++ b/src/power/LMI_AssociatedPowerManagementServiceProvider.c
@@ -84,6 +84,9 @@ static CMPIStatus LMI_AssociatedPowerManagementServiceEnumInstances(
int count;
unsigned short *list = power_available_requested_power_states(mi->hdl, &count);
+ if (list == NULL) {
+ CMReturn(CMPI_RC_ERR_FAILED);
+ }
LMI_AssociatedPowerManagementService_Init_AvailableRequestedPowerStates(&w, count);
for (int i = 0; i < count; i++) {
LMI_AssociatedPowerManagementService_Set_AvailableRequestedPowerStates(&w, i, list[i]);
diff --git a/src/power/LMI_PowerManagementCapabilitiesProvider.c b/src/power/LMI_PowerManagementCapabilitiesProvider.c
index 1024ea9..47632f2 100644
--- a/src/power/LMI_PowerManagementCapabilitiesProvider.c
+++ b/src/power/LMI_PowerManagementCapabilitiesProvider.c
@@ -75,6 +75,9 @@ static CMPIStatus LMI_PowerManagementCapabilitiesEnumInstances(
int count;
unsigned short *list = power_available_requested_power_states(mi->hdl, &count);
+ if (list == NULL) {
+ CMReturn(CMPI_RC_ERR_FAILED);
+ }
LMI_PowerManagementCapabilities_Init_PowerStatesSupported(&w, count);
for (int i = 0; i < count; i++) {
LMI_PowerManagementCapabilities_Set_PowerStatesSupported(&w, i, list[i]);
diff --git a/src/power/LMI_PowerManagementServiceProvider.c b/src/power/LMI_PowerManagementServiceProvider.c
index f5256bd..644af40 100644
--- a/src/power/LMI_PowerManagementServiceProvider.c
+++ b/src/power/LMI_PowerManagementServiceProvider.c
@@ -288,9 +288,10 @@ KUint32 LMI_PowerManagementService_RequestPowerStateChange(
KSetStatus2(_cb, status, ERR_INVALID_PARAMETER, "PowerState argument is missing");
return result;
}
- power_request_power_state(mi->hdl, PowerState->value);
-
- KSetStatus(status, OK);
+ status->rc = power_request_power_state(mi->hdl, PowerState->value);
+ if (status->rc != CMPI_RC_OK) {
+ KUint32_Set(&result, 4); // Failed
+ }
KUint32_Set(&result, 4096);
return result;
}
diff --git a/src/power/power.c b/src/power/power.c
index 646aa45..96960be 100644
--- a/src/power/power.c
+++ b/src/power/power.c
@@ -78,6 +78,9 @@ Power *power_new(const CMPIBroker *_cb, const CMPIContext *ctx)
{
lmi_init(provider_name, _cb, ctx, provider_config_defaults);
Power *power = malloc(sizeof(Power));
+ if (power == NULL) {
+ return NULL;
+ }
power->broker = _cb;
power->instances = 0;
power->requestedPowerState = LMI_AssociatedPowerManagementService_RequestedPowerState_Unknown;
@@ -104,7 +107,9 @@ void power_destroy(Power *power)
Power *power_ref(const CMPIBroker *_cb, const CMPIContext *ctx)
{
if (_power == NULL) {
- _power = power_new(_cb, ctx);
+ if ((_power = power_new(_cb, ctx)) == NULL) {
+ return NULL;
+ }
}
MUTEX_LOCK(_power);
_power->instances++;
@@ -114,6 +119,9 @@ Power *power_ref(const CMPIBroker *_cb, const CMPIContext *ctx)
void power_unref(Power *power)
{
+ if (power == NULL) {
+ return;
+ }
MUTEX_LOCK(power);
power->instances--;
MUTEX_UNLOCK(power);
@@ -246,6 +254,9 @@ int power_request_power_state(Power *power, unsigned short state)
int count, found = 0;
unsigned short *states = power_available_requested_power_states(power, &count);
+ if (states == NULL) {
+ return CMPI_RC_ERR_FAILED;
+ }
for (int i = 0; i < count; ++i) {
if (states[i] == state) {
found = 1;
@@ -259,6 +270,10 @@ int power_request_power_state(Power *power, unsigned short state)
}
PowerStateChangeJob *powerStateChangeJob = malloc(sizeof(PowerStateChangeJob));
+ if (powerStateChangeJob == NULL) {
+ error("Memory allocation failed");
+ return CMPI_RC_ERR_FAILED;
+ }
powerStateChangeJob->id = job_max_id++;
powerStateChangeJob->broker = power->broker;
powerStateChangeJob->power = power;
@@ -303,6 +318,10 @@ int power_request_power_state(Power *power, unsigned short state)
unsigned short *power_available_requested_power_states(Power *power, int *count)
{
unsigned short *list = malloc(17 * sizeof(unsigned short));
+ if (list == NULL) {
+ error("Memory allocation failed");
+ return NULL;
+ }
int i = 0;
/* 1 Other