Skip to content

Commit e318f6f

Browse files
committed
re-work pk_oid_str functions a bit
1 parent 1a90da8 commit e318f6f

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

src/pk/asn1/oid/pk_oid_str.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,38 @@
1111

1212
int 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

Comments
 (0)