diff options
author | Tom Yu <tlyu@mit.edu> | 1998-12-04 00:45:04 +0000 |
---|---|---|
committer | Tom Yu <tlyu@mit.edu> | 1998-12-04 00:45:04 +0000 |
commit | c59d286be380ca39c1199c79466b87af5be4556d (patch) | |
tree | de806c8452c560e35be61a17cc5e92d7c164bb22 | |
parent | 82e2d8f51a8d81165489461d4a011bd4098fb018 (diff) | |
download | krb5-c59d286be380ca39c1199c79466b87af5be4556d.zip krb5-c59d286be380ca39c1199c79466b87af5be4556d.tar.gz krb5-c59d286be380ca39c1199c79466b87af5be4556d.tar.bz2 |
* asn1_k_decode.c (asn1_decode_krb5_flags): Modify to deal with
BIT STRING values that are not exactly 32 bits. Throw away bits
beyond number 31 in a bit string for now. Deal with masking out
unused bits.
[pullup from trunk]
git-svn-id: svn://anonsvn.mit.edu/krb5/branches/V1_0_BRANCH@11056 dc483132-0cff-0310-8789-dd5450dbe970
-rw-r--r-- | src/lib/krb5/asn.1/ChangeLog | 7 | ||||
-rw-r--r-- | src/lib/krb5/asn.1/asn1_k_decode.c | 22 |
2 files changed, 22 insertions, 7 deletions
diff --git a/src/lib/krb5/asn.1/ChangeLog b/src/lib/krb5/asn.1/ChangeLog index e4721fe..856b180 100644 --- a/src/lib/krb5/asn.1/ChangeLog +++ b/src/lib/krb5/asn.1/ChangeLog @@ -1,3 +1,10 @@ +Thu Dec 3 19:41:06 1998 Tom Yu <tlyu@mit.edu> + + * asn1_k_decode.c (asn1_decode_krb5_flags): Modify to deal with + BIT STRING values that are not exactly 32 bits. Throw away bits + beyond number 31 in a bit string for now. Deal with masking out + unused bits. + 1998-10-27 Marc Horowitz <marc@mit.edu> * asn1buf.c (asn1buf_sync): interoperation testing against heimdal diff --git a/src/lib/krb5/asn.1/asn1_k_decode.c b/src/lib/krb5/asn.1/asn1_k_decode.c index 475bc06..226b044 100644 --- a/src/lib/krb5/asn.1/asn1_k_decode.c +++ b/src/lib/krb5/asn.1/asn1_k_decode.c @@ -272,7 +272,7 @@ asn1_error_code asn1_decode_krb5_flags(buf, val) krb5_flags * val; { setup(); - asn1_octet o; + asn1_octet unused, o; int i; krb5_flags f=0; unused_var(taglen); @@ -281,16 +281,24 @@ asn1_error_code asn1_decode_krb5_flags(buf, val) if(retval) return retval; if(class != UNIVERSAL || construction != PRIMITIVE || tagnum != ASN1_BITSTRING) return ASN1_BAD_ID; - if(length != 5) return ASN1_BAD_LENGTH; - retval = asn1buf_remove_octet(buf,&o); /* # of padding bits */ - if(retval) return retval; /* should be 0 */ - if(o != 0) return ASN1_BAD_FORMAT; + retval = asn1buf_remove_octet(buf,&unused); /* # of padding bits */ + if(retval) return retval; + + /* Number of unused bits must be between 0 and 7. */ + if (unused > 7) return ASN1_BAD_FORMAT; + length--; - for(i=0; i<4; i++){ + for(i = 0; i < length; i++) { retval = asn1buf_remove_octet(buf,&o); if(retval) return retval; - f = (f<<8) | ((krb5_flags)o&0xFF); + /* ignore bits past number 31 */ + if (i < 4) + f = (f<<8) | ((krb5_flags)o&0xFF); + } + if (length <= 4) { + /* Mask out unused bits, but only if necessary. */ + f &= ~0 << unused; } *val = f; return 0; |