libpldm: Fix validation in decode_get_firmware_parameters_resp

If the completion code is not PLDM_SUCCESS, typically the payload
just has the completion code. Correct the validation checks to
address this.

Tested: Updated the test cases and tests passed.

Signed-off-by: Tom Joseph <rushtotom@gmail.com>
Change-Id: I27f67c070140693ec0c60f8d79fa2fff96b3cc93
diff --git a/libpldm/firmware_update.c b/libpldm/firmware_update.c
index 12043a2..5427c95 100644
--- a/libpldm/firmware_update.c
+++ b/libpldm/firmware_update.c
@@ -450,10 +450,15 @@
 	if (msg == NULL || resp_data == NULL ||

 	    active_comp_image_set_ver_str == NULL ||

 	    pending_comp_image_set_ver_str == NULL ||

-	    comp_parameter_table == NULL) {

+	    comp_parameter_table == NULL || !payload_length) {

 		return PLDM_ERROR_INVALID_DATA;

 	}

 

+	resp_data->completion_code = msg->payload[0];

+	if (PLDM_SUCCESS != resp_data->completion_code) {

+		return PLDM_SUCCESS;

+	}

+

 	if (payload_length < sizeof(struct pldm_get_firmware_parameters_resp)) {

 		return PLDM_ERROR_INVALID_LENGTH;

 	}

@@ -461,12 +466,6 @@
 	struct pldm_get_firmware_parameters_resp *response =

 	    (struct pldm_get_firmware_parameters_resp *)msg->payload;

 

-	resp_data->completion_code = response->completion_code;

-

-	if (PLDM_SUCCESS != resp_data->completion_code) {

-		return PLDM_SUCCESS;

-	}

-

 	if (!is_string_type_valid(

 		response->active_comp_image_set_ver_str_type) ||

 	    (response->active_comp_image_set_ver_str_len == 0)) {