Quellcode durchsuchen

re-work pk_oid_str functions a bit

Steffen Jaeckel vor 7 Jahren
Ursprung
Commit
e318f6f1e3
1 geänderte Dateien mit 17 neuen und 9 gelöschten Zeilen
  1. 17 9
      src/pk/asn1/oid/pk_oid_str.c

+ 17 - 9
src/pk/asn1/oid/pk_oid_str.c

@@ -11,29 +11,38 @@
 
 int pk_oid_str_to_num(const char *OID, unsigned long *oid, unsigned long *oidlen)
 {
-   unsigned long i, j, limit;
+   unsigned long i, j, limit, OID_len, oid_j;
 
-   LTC_ARGCHK(oid != NULL);
    LTC_ARGCHK(oidlen != NULL);
 
    limit = *oidlen;
    *oidlen = 0; /* make sure that we return zero oidlen on error */
    for (i = 0; i < limit; i++) oid[i] = 0;
 
-   if ((OID == NULL) || (strlen(OID) == 0)) return CRYPT_OK;
+   if (OID == NULL) return CRYPT_OK;
+
+   OID_len = strlen(OID);
+   if (OID_len == 0) return CRYPT_OK;
 
-   for (i = 0, j = 0; i < strlen(OID); i++) {
+   for (i = 0, j = 0; i < OID_len; i++) {
       if (OID[i] == '.') {
-         if (++j >= limit) return CRYPT_ERROR;
+         if (++j >= limit) continue;
       }
       else if ((OID[i] >= '0') && (OID[i] <= '9')) {
+         if ((j >= limit) || (oid == NULL)) continue;
+         oid_j = oid[j];
          oid[j] = oid[j] * 10 + (OID[i] - '0');
+         if (oid[j] < oid_j) return CRYPT_OVERFLOW;
       }
       else {
          return CRYPT_ERROR;
       }
    }
    if (j == 0) return CRYPT_ERROR;
+   if (j >= limit) {
+      *oidlen = j;
+      return CRYPT_BUFFER_OVERFLOW;
+   }
    *oidlen = j + 1;
    return CRYPT_OK;
 }
@@ -43,7 +52,6 @@ int pk_oid_num_to_str(const unsigned long *oid, unsigned long oidlen, char *OID,
    int i;
    unsigned long j, k;
    char tmp[256] = { 0 };
-   unsigned long tmpsz = sizeof(tmp);
 
    LTC_ARGCHK(oid != NULL);
    LTC_ARGCHK(OID != NULL);
@@ -53,18 +61,18 @@ int pk_oid_num_to_str(const unsigned long *oid, unsigned long oidlen, char *OID,
       j = oid[i];
       if (j == 0) {
          tmp[k] = '0';
-         if (++k >= tmpsz) return CRYPT_ERROR;
+         if (++k >= sizeof(tmp)) return CRYPT_ERROR;
       }
       else {
          while (j > 0) {
             tmp[k] = '0' + (j % 10);
-            if (++k >= tmpsz) return CRYPT_ERROR;
+            if (++k >= sizeof(tmp)) return CRYPT_ERROR;
             j /= 10;
          }
       }
       if (i > 0) {
         tmp[k] = '.';
-        if (++k >= tmpsz) return CRYPT_ERROR;
+        if (++k >= sizeof(tmp)) return CRYPT_ERROR;
       }
    }
    if (*outlen < k + 1) {