From 23cd855116ded52f3aeee8480bf9073b12f29a8f Mon Sep 17 00:00:00 2001 From: Chunyang Hui Date: Thu, 8 Aug 2019 22:07:21 +0800 Subject: [PATCH] opal: Fix get string for bigger length Skip token header length which varies for short, medium and long atom. Fix Issue #898 Signed-off-by: Chunyang Hui Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/464502 (master) (cherry picked from commit a4516ad2edd16cc7d8d7b02006e5af14399713f2) Change-Id: I2351193e5a43608495f3d816ff4e5932399a6312 Signed-off-by: Tomasz Zawadzki Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/467129 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Chunyang Hui Reviewed-by: Ben Walker --- lib/nvme/nvme_opal.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/nvme/nvme_opal.c b/lib/nvme/nvme_opal.c index 6f31fd3b6..deca3a902 100644 --- a/lib/nvme/nvme_opal.c +++ b/lib/nvme/nvme_opal.c @@ -549,6 +549,9 @@ static size_t opal_response_get_string(const struct spdk_opal_resp_parsed *resp, int n, const char **store) { + uint8_t header_len; + struct spdk_opal_resp_token token = resp->resp_tokens[n]; + *store = NULL; if (!resp) { SPDK_ERRLOG("Response is NULL\n"); @@ -561,13 +564,28 @@ opal_response_get_string(const struct spdk_opal_resp_parsed *resp, int n, return 0; } - if (resp->resp_tokens[n].type != OPAL_DTA_TOKENID_BYTESTRING) { + if (token.type != OPAL_DTA_TOKENID_BYTESTRING) { SPDK_ERRLOG("Token is not a byte string!\n"); return 0; } - *store = resp->resp_tokens[n].pos + 1; - return resp->resp_tokens[n].len - 1; + switch (token.width) { + case OPAL_WIDTH_SHORT: + header_len = 1; + break; + case OPAL_WIDTH_MEDIUM: + header_len = 2; + break; + case OPAL_WIDTH_LONG: + header_len = 4; + break; + default: + SPDK_ERRLOG("Can't get string from this Token\n"); + return 0; + } + + *store = token.pos + header_len; + return token.len - header_len; } static int