david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[crypto] Avoid an error when asn1_shrink() is already at end of object

asn1_skip() will return an error on reaching the end of an object, and
so should not be used as the basis for asn1_shrink().

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2012-03-22 02:10:17 +00:00
parent 2d9d0adc4e
commit 2cd24473b8
1 changed files with 12 additions and 7 deletions

View File

@ -220,16 +220,21 @@ int asn1_skip ( struct asn1_cursor *cursor, unsigned int type ) {
* invalidated.
*/
int asn1_shrink ( struct asn1_cursor *cursor, unsigned int type ) {
struct asn1_cursor next;
int rc;
struct asn1_cursor temp;
const void *end;
int len;
/* Skip to next object */
memcpy ( &next, cursor, sizeof ( next ) );
if ( ( rc = asn1_skip ( &next, type ) ) != 0 )
return rc;
/* Find end of object */
memcpy ( &temp, cursor, sizeof ( temp ) );
len = asn1_start ( &temp, type );
if ( len < 0 ) {
asn1_invalidate_cursor ( cursor );
return len;
}
end = ( temp.data + len );
/* Shrink original cursor to contain only its first object */
cursor->len = ( next.data - cursor->data );
cursor->len = ( end - cursor->data );
return 0;
}