This looks correct. Adding my Ack unless Scott has objections Acked-by: Jonathan Derrick <jonathan.derrick@xxxxxxxxx> On Thu, 2018-03-01 at 14:26 +0100, Jonas Rabenstein wrote: > Tokens are prefixed by a variable length of bytes. If a bytestring is > not stored in an tiny or short atom, we have to skip more than one > byte > in order to have the actual bytes not prefixed by the bytes > describing > the actual length of the string. > > Signed-off-by: Jonas Rabenstein <jonas.rabenstein@xxxxxxxxxxx-erlange > n.de> > --- > block/sed-opal.c | 26 +++++++++++++++++++++++--- > 1 file changed, 23 insertions(+), 3 deletions(-) > > diff --git a/block/sed-opal.c b/block/sed-opal.c > index 525506bed399..33052d0111de 100644 > --- a/block/sed-opal.c > +++ b/block/sed-opal.c > @@ -876,6 +876,9 @@ static int response_parse(const u8 *buf, size_t > length, > static size_t response_get_string(const struct parsed_resp *resp, > int n, > const char **store) > { > + u8 skip; > + const struct opal_resp_tok *token; > + > *store = NULL; > if (!resp) { > pr_debug("Response is NULL\n"); > @@ -888,13 +891,30 @@ static size_t response_get_string(const struct > parsed_resp *resp, int n, > return 0; > } > > - if (resp->toks[n].type != OPAL_DTA_TOKENID_BYTESTRING) { > + token = &resp->toks[n]; > + if (token->type != OPAL_DTA_TOKENID_BYTESTRING) { > pr_debug("Token is not a byte string!\n"); > return 0; > } > > - *store = resp->toks[n].pos + 1; > - return resp->toks[n].len - 1; > + switch (token->width) { > + case OPAL_WIDTH_TINY: > + case OPAL_WIDTH_SHORT: > + skip = 1; > + break; > + case OPAL_WIDTH_MEDIUM: > + skip = 2; > + break; > + case OPAL_WIDTH_LONG: > + skip = 4; > + break; > + default: > + pr_debug("Token has invalid width!\n"); > + return 0; > + } > + > + *store = token->pos + skip; > + return token->len - skip; > } > > static u64 response_get_u64(const struct parsed_resp *resp, int n)
Attachment:
smime.p7s
Description: S/MIME cryptographic signature