Commit d0d3dd47 authored by Nick Brook's avatar Nick Brook Committed by Fabio Baltieri
Browse files

mgmt/mcumgr: Add error logs for all error cases

Errors were logged for some cases in zephyr_img_mgmt.c, but not all.
This commit adds error logs for all error cases.

Signed-off-by: default avatarNick Brook <nrbrook@gmail.com>
parent b2b2963e
Loading
Loading
Loading
Loading
+26 −4
Changes for subsys/mgmt/mcumgr/grp/img_mgmt/src/zephyr_img_mgmt.c: 26 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -563,6 +563,7 @@ int img_mgmt_upload_inspect(const struct img_mgmt_upload_req *req,
	if (req->off == SIZE_MAX) {
		/* Request did not include an `off` field. */
		IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action, img_mgmt_err_str_hdr_malformed);
		LOG_DBG("Request did not include an `off` field");
		return IMG_MGMT_ERR_INVALID_OFFSET;
	}

@@ -588,12 +589,15 @@ int img_mgmt_upload_inspect(const struct img_mgmt_upload_req *req,
		if (req->img_data.len < sizeof(struct image_header)) {
			/*  Image header is the first thing in the image */
			IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action, img_mgmt_err_str_hdr_malformed);
			LOG_DBG("Image data too short: %u < %u", req->img_data.len,
				sizeof(struct image_header));
			return IMG_MGMT_ERR_INVALID_IMAGE_HEADER;
		}

		if (req->size == SIZE_MAX) {
			/* Request did not include a `len` field. */
			IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action, img_mgmt_err_str_hdr_malformed);
			LOG_DBG("Request did not include a `len` field");
			return IMG_MGMT_ERR_INVALID_LENGTH;
		}

@@ -602,10 +606,12 @@ int img_mgmt_upload_inspect(const struct img_mgmt_upload_req *req,
		hdr = (struct image_header *)req->img_data.value;
		if (hdr->ih_magic != IMAGE_MAGIC) {
			IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action, img_mgmt_err_str_magic_mismatch);
			LOG_DBG("Magic mismatch: %08X != %08X", hdr->ih_magic, IMAGE_MAGIC);
			return IMG_MGMT_ERR_INVALID_IMAGE_HEADER_MAGIC;
		}

		if (req->data_sha.len > IMG_MGMT_DATA_SHA_LEN) {
			LOG_DBG("Invalid hash length: %u", req->data_sha.len);
			return IMG_MGMT_ERR_INVALID_HASH;
		}

@@ -625,8 +631,9 @@ int img_mgmt_upload_inspect(const struct img_mgmt_upload_req *req,

		action->area_id = img_mgmt_get_unused_slot_area_id(req->image);
		if (action->area_id < 0) {
			/* No slot where to upload! */
			/* No slot available to upload to */
			IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action, img_mgmt_err_str_no_slot);
			LOG_DBG("No slot available to upload to");
			return IMG_MGMT_ERR_NO_FREE_SLOT;
		}

@@ -643,7 +650,8 @@ int img_mgmt_upload_inspect(const struct img_mgmt_upload_req *req,
			IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action,
				img_mgmt_err_str_image_too_large);
			flash_area_close(fa);
			LOG_ERR("Upload too large for slot: %u > %u", req->size, fa->fa_size);
			LOG_DBG("Upload too large for slot: %u > %u", req->size,
				fa->fa_size);
			return IMG_MGMT_ERR_INVALID_IMAGE_TOO_LARGE;
		}

@@ -695,7 +703,7 @@ int img_mgmt_upload_inspect(const struct img_mgmt_upload_req *req,
			IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action,
				img_mgmt_err_str_image_too_large);
			flash_area_close(fa);
			LOG_ERR("Upload too large for slot (with end offset): %u > %u", req->size,
			LOG_DBG("Upload too large for slot (with end offset): %u > %u", req->size,
				(fa->fa_size - CONFIG_MCUBOOT_UPDATE_FOOTER_SIZE));
			return IMG_MGMT_ERR_INVALID_IMAGE_TOO_LARGE;
		}
@@ -710,7 +718,7 @@ skip_size_check:
			IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action,
				img_mgmt_err_str_image_too_large);
			flash_area_close(fa);
			LOG_ERR("Upload too large for slot (with max image size): %u > %u",
			LOG_DBG("Upload too large for slot (with max image size): %u > %u",
				req->size, max_image_size);
			return IMG_MGMT_ERR_INVALID_IMAGE_TOO_LARGE;
		}
@@ -722,6 +730,8 @@ skip_size_check:
				IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action,
					img_mgmt_err_str_image_bad_flash_addr);
				flash_area_close(fa);
				LOG_DBG("Invalid flash address: %08X, expected: %08X",
					hdr->ih_load_addr, (int)fa->fa_off);
				return IMG_MGMT_ERR_INVALID_FLASH_ADDRESS;
			}
		}
@@ -735,12 +745,18 @@ skip_size_check:
			 */
			rc = img_mgmt_my_version(&cur_ver);
			if (rc != 0) {
				LOG_DBG("Version get failed: %d", rc);
				return IMG_MGMT_ERR_VERSION_GET_FAILED;
			}

			if (img_mgmt_vercmp(&cur_ver, &hdr->ih_ver) >= 0) {
				IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action,
					img_mgmt_err_str_downgrade);
				LOG_DBG("Downgrade: %d.%d.%d.%d, expected: %d.%d.%d.%d",
					cur_ver.iv_major, cur_ver.iv_minor, cur_ver.iv_revision,
					cur_ver.iv_build_num, hdr->ih_ver.iv_major,
					hdr->ih_ver.iv_minor, hdr->ih_ver.iv_revision,
					hdr->ih_ver.iv_build_num);
				return IMG_MGMT_ERR_CURRENT_VERSION_IS_NEWER;
			}
		}
@@ -748,6 +764,7 @@ skip_size_check:
#ifndef CONFIG_IMG_ERASE_PROGRESSIVELY
		rc = img_mgmt_flash_check_empty(action->area_id);
		if (rc < 0) {
			LOG_DBG("Flash check empty failed: %d", rc);
			return rc;
		}

@@ -763,6 +780,8 @@ skip_size_check:
			 * Invalid offset. Drop the data, and respond with the offset we're
			 * expecting data for.
			 */
			LOG_DBG("Invalid offset: %08x, expected: %08x", req->off,
				g_img_mgmt_state.off);
			return IMG_MGMT_ERR_OK;
		}

@@ -771,6 +790,8 @@ skip_size_check:
			 * of the image that the client originally sent
			 */
			IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action, img_mgmt_err_str_data_overrun);
			LOG_DBG("Data overrun: %u + %u > %llu", req->off, req->img_data.len,
				action->size);
			return IMG_MGMT_ERR_INVALID_IMAGE_DATA_OVERRUN;
		}
	}
@@ -789,6 +810,7 @@ int img_mgmt_erased_val(int slot, uint8_t *erased_val)
	int area_id = img_mgmt_flash_area_id(slot);

	if (area_id < 0) {
		LOG_DBG("Invalid slot: %d", area_id);
		return IMG_MGMT_ERR_INVALID_SLOT;
	}