When reading an OID in a SPNEGO token, use gssint_get_der_length()
rather than assuming the length fits in one byte. Although OID
lengths greater than 127 are unlikely, some NetApp products have been
observed to incorrectly encode the length in multiple bytes. Reported
by Richard Sharpe.
ticket: 8932 (new)
OM_uint32 status;
gss_OID_desc toid;
gss_OID mech_out = NULL;
- unsigned char *start, *end;
+ unsigned int bytes;
+ int oid_length;
if (length < 1 || **buff_in != MECH_OID)
return (NULL);
-
- start = *buff_in;
- end = start + length;
-
(*buff_in)++;
- toid.length = *(*buff_in)++;
+ length--;
- if ((*buff_in + toid.length) > end)
+ oid_length = gssint_get_der_length(buff_in, length, &bytes);
+ if (oid_length < 0 || length - bytes < (size_t)oid_length)
return (NULL);
+ toid.length = oid_length;
toid.elements = *buff_in;
*buff_in += toid.length;