1111
1212int pk_oid_str_to_num (const char * OID , unsigned long * oid , unsigned long * oidlen )
1313{
14- unsigned long i , j , limit ;
14+ unsigned long i , j , limit , OID_len , oid_j ;
1515
16- LTC_ARGCHK (oid != NULL );
1716 LTC_ARGCHK (oidlen != NULL );
1817
1918 limit = * oidlen ;
2019 * oidlen = 0 ; /* make sure that we return zero oidlen on error */
2120 for (i = 0 ; i < limit ; i ++ ) oid [i ] = 0 ;
2221
23- if ((OID == NULL ) || (strlen (OID ) == 0 )) return CRYPT_OK ;
22+ if (OID == NULL ) return CRYPT_OK ;
23+
24+ OID_len = strlen (OID );
25+ if (OID_len == 0 ) return CRYPT_OK ;
2426
25- for (i = 0 , j = 0 ; i < strlen ( OID ) ; i ++ ) {
27+ for (i = 0 , j = 0 ; i < OID_len ; i ++ ) {
2628 if (OID [i ] == '.' ) {
27- if (++ j >= limit ) return CRYPT_ERROR ;
29+ if (++ j >= limit ) continue ;
2830 }
2931 else if ((OID [i ] >= '0' ) && (OID [i ] <= '9' )) {
32+ if ((j >= limit ) || (oid == NULL )) continue ;
33+ oid_j = oid [j ];
3034 oid [j ] = oid [j ] * 10 + (OID [i ] - '0' );
35+ if (oid [j ] < oid_j ) return CRYPT_OVERFLOW ;
3136 }
3237 else {
3338 return CRYPT_ERROR ;
3439 }
3540 }
3641 if (j == 0 ) return CRYPT_ERROR ;
42+ if (j >= limit ) {
43+ * oidlen = j ;
44+ return CRYPT_BUFFER_OVERFLOW ;
45+ }
3746 * oidlen = j + 1 ;
3847 return CRYPT_OK ;
3948}
@@ -43,7 +52,6 @@ int pk_oid_num_to_str(const unsigned long *oid, unsigned long oidlen, char *OID,
4352 int i ;
4453 unsigned long j , k ;
4554 char tmp [256 ] = { 0 };
46- unsigned long tmpsz = sizeof (tmp );
4755
4856 LTC_ARGCHK (oid != NULL );
4957 LTC_ARGCHK (OID != NULL );
@@ -53,18 +61,18 @@ int pk_oid_num_to_str(const unsigned long *oid, unsigned long oidlen, char *OID,
5361 j = oid [i ];
5462 if (j == 0 ) {
5563 tmp [k ] = '0' ;
56- if (++ k >= tmpsz ) return CRYPT_ERROR ;
64+ if (++ k >= sizeof ( tmp ) ) return CRYPT_ERROR ;
5765 }
5866 else {
5967 while (j > 0 ) {
6068 tmp [k ] = '0' + (j % 10 );
61- if (++ k >= tmpsz ) return CRYPT_ERROR ;
69+ if (++ k >= sizeof ( tmp ) ) return CRYPT_ERROR ;
6270 j /= 10 ;
6371 }
6472 }
6573 if (i > 0 ) {
6674 tmp [k ] = '.' ;
67- if (++ k >= tmpsz ) return CRYPT_ERROR ;
75+ if (++ k >= sizeof ( tmp ) ) return CRYPT_ERROR ;
6876 }
6977 }
7078 if (* outlen < k + 1 ) {
0 commit comments