Add int casts as needed around STACK_OF(T) sizes and indices
We now ensure STACK_OF(T) sizes and indices fit in INT_MAX, so it's safe
to cast to int.
Bug: 516
Change-Id: I33dd1de6d60a852d510b9b5c3ac70e2eacbc8905
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/60066
Reviewed-by: Adam Langley <agl@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/crypto/x509/x509_att.c b/crypto/x509/x509_att.c
index 23e92f2..062168e 100644
--- a/crypto/x509/x509_att.c
+++ b/crypto/x509/x509_att.c
@@ -189,7 +189,7 @@
}
int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr) {
- return sk_ASN1_TYPE_num(attr->set);
+ return (int)sk_ASN1_TYPE_num(attr->set);
}
ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr) {
diff --git a/crypto/x509/x509_lu.c b/crypto/x509/x509_lu.c
index cd4ed12..929afff 100644
--- a/crypto/x509/x509_lu.c
+++ b/crypto/x509/x509_lu.c
@@ -423,9 +423,8 @@
}
if (pnmatch != NULL) {
- int tidx;
*pnmatch = 1;
- for (tidx = idx + 1; tidx < (int)sk_X509_OBJECT_num(h); tidx++) {
+ for (size_t tidx = idx + 1; tidx < sk_X509_OBJECT_num(h); tidx++) {
const X509_OBJECT *tobj = sk_X509_OBJECT_value(h, tidx);
if (x509_object_cmp(tobj, &stmp)) {
break;
@@ -434,7 +433,7 @@
}
}
- return idx;
+ return (int)idx;
}
int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type,
diff --git a/crypto/x509/x509_req.c b/crypto/x509/x509_req.c
index 69eb63c..385d8c0 100644
--- a/crypto/x509/x509_req.c
+++ b/crypto/x509/x509_req.c
@@ -161,7 +161,7 @@
}
int X509_REQ_get_attr_count(const X509_REQ *req) {
- return sk_X509_ATTRIBUTE_num(req->req_info->attributes);
+ return (int)sk_X509_ATTRIBUTE_num(req->req_info->attributes);
}
int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos) {
@@ -181,7 +181,7 @@
if (lastpos < 0) {
lastpos = 0;
}
- int n = sk_X509_ATTRIBUTE_num(req->req_info->attributes);
+ int n = (int)sk_X509_ATTRIBUTE_num(req->req_info->attributes);
for (; lastpos < n; lastpos++) {
const X509_ATTRIBUTE *attr =
sk_X509_ATTRIBUTE_value(req->req_info->attributes, lastpos);
diff --git a/crypto/x509/x509_v3.c b/crypto/x509/x509_v3.c
index 0d4ecfa..0f506c9 100644
--- a/crypto/x509/x509_v3.c
+++ b/crypto/x509/x509_v3.c
@@ -69,7 +69,7 @@
if (x == NULL) {
return 0;
}
- return (sk_X509_EXTENSION_num(x));
+ return (int)sk_X509_EXTENSION_num(x);
}
int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, int nid,
@@ -83,9 +83,6 @@
int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *sk,
const ASN1_OBJECT *obj, int lastpos) {
- int n;
- X509_EXTENSION *ex;
-
if (sk == NULL) {
return -1;
}
@@ -93,9 +90,9 @@
if (lastpos < 0) {
lastpos = 0;
}
- n = sk_X509_EXTENSION_num(sk);
+ int n = (int)sk_X509_EXTENSION_num(sk);
for (; lastpos < n; lastpos++) {
- ex = sk_X509_EXTENSION_value(sk, lastpos);
+ const X509_EXTENSION *ex = sk_X509_EXTENSION_value(sk, lastpos);
if (OBJ_cmp(ex->object, obj) == 0) {
return lastpos;
}
@@ -115,7 +112,7 @@
}
crit = !!crit;
- int n = sk_X509_EXTENSION_num(sk);
+ int n = (int)sk_X509_EXTENSION_num(sk);
for (; lastpos < n; lastpos++) {
const X509_EXTENSION *ex = sk_X509_EXTENSION_value(sk, lastpos);
if (X509_EXTENSION_get_critical(ex) == crit) {
@@ -146,13 +143,12 @@
STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x,
const X509_EXTENSION *ex, int loc) {
X509_EXTENSION *new_ex = NULL;
- int n;
STACK_OF(X509_EXTENSION) *sk = NULL;
int free_sk = 0;
if (x == NULL) {
OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
- goto err2;
+ goto err;
}
if (*x == NULL) {
@@ -164,7 +160,7 @@
sk = *x;
}
- n = sk_X509_EXTENSION_num(sk);
+ int n = (int)sk_X509_EXTENSION_num(sk);
if (loc > n) {
loc = n;
} else if (loc < 0) {
@@ -172,7 +168,7 @@
}
if ((new_ex = X509_EXTENSION_dup(ex)) == NULL) {
- goto err2;
+ goto err;
}
if (!sk_X509_EXTENSION_insert(sk, new_ex, loc)) {
goto err;
@@ -181,8 +177,8 @@
*x = sk;
}
return sk;
+
err:
-err2:
X509_EXTENSION_free(new_ex);
if (free_sk) {
sk_X509_EXTENSION_free(sk);
diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c
index ea9ff3c..a725d00 100644
--- a/crypto/x509/x509_vfy.c
+++ b/crypto/x509/x509_vfy.c
@@ -217,7 +217,7 @@
goto end;
}
- num = sk_X509_num(ctx->chain);
+ num = (int)sk_X509_num(ctx->chain);
x = sk_X509_value(ctx->chain, num - 1);
depth = param->depth;
@@ -284,7 +284,7 @@
do {
// Examine last certificate in chain and see if it is self signed.
- i = sk_X509_num(ctx->chain);
+ i = (int)sk_X509_num(ctx->chain);
x = sk_X509_value(ctx->chain, i - 1);
int is_self_signed;
@@ -396,7 +396,7 @@
X509_free(xtmp);
num--;
}
- ctx->last_untrusted = sk_X509_num(ctx->chain);
+ ctx->last_untrusted = (int)sk_X509_num(ctx->chain);
retry = 1;
break;
}
@@ -628,7 +628,7 @@
int i, j, rv;
int has_name_constraints = 0;
// Check name constraints for all certificates
- for (i = sk_X509_num(ctx->chain) - 1; i >= 0; i--) {
+ for (i = (int)sk_X509_num(ctx->chain) - 1; i >= 0; i--) {
X509 *x = sk_X509_value(ctx->chain, i);
// Ignore self issued certs unless last in chain
if (i && (x->ex_flags & EXFLAG_SI)) {
@@ -638,7 +638,7 @@
// including trust anchor. Trust anchor not strictly speaking needed
// but if it includes constraints it is to be assumed it expects them
// to be obeyed.
- for (j = sk_X509_num(ctx->chain) - 1; j > i; j--) {
+ for (j = (int)sk_X509_num(ctx->chain) - 1; j > i; j--) {
NAME_CONSTRAINTS *nc = sk_X509_value(ctx->chain, j)->nc;
if (nc) {
has_name_constraints = 1;
@@ -748,11 +748,10 @@
}
static int check_trust(X509_STORE_CTX *ctx) {
- size_t i;
int ok;
X509 *x = NULL;
// Check all trusted certificates in chain
- for (i = ctx->last_untrusted; i < sk_X509_num(ctx->chain); i++) {
+ for (size_t i = ctx->last_untrusted; i < sk_X509_num(ctx->chain); i++) {
x = sk_X509_value(ctx->chain, i);
ok = X509_check_trust(x, ctx->param->trust, 0);
// If explicitly trusted return trusted
@@ -762,7 +761,7 @@
// If explicitly rejected notify callback and reject if not
// overridden.
if (ok == X509_TRUST_REJECTED) {
- ctx->error_depth = i;
+ ctx->error_depth = (int)i;
ctx->current_cert = x;
ctx->error = X509_V_ERR_CERT_REJECTED;
ok = ctx->verify_cb(0, ctx);
@@ -794,12 +793,12 @@
}
static int check_revocation(X509_STORE_CTX *ctx) {
- int i, last, ok;
if (!(ctx->param->flags & X509_V_FLAG_CRL_CHECK)) {
return 1;
}
+ int last;
if (ctx->param->flags & X509_V_FLAG_CRL_CHECK_ALL) {
- last = sk_X509_num(ctx->chain) - 1;
+ last = (int)sk_X509_num(ctx->chain) - 1;
} else {
// If checking CRL paths this isn't the EE certificate
if (ctx->parent) {
@@ -807,9 +806,9 @@
}
last = 0;
}
- for (i = 0; i <= last; i++) {
+ for (int i = 0; i <= last; i++) {
ctx->error_depth = i;
- ok = check_cert(ctx);
+ int ok = check_cert(ctx);
if (!ok) {
return ok;
}
@@ -1478,9 +1477,9 @@
static int check_crl(X509_STORE_CTX *ctx, X509_CRL *crl) {
X509 *issuer = NULL;
EVP_PKEY *ikey = NULL;
- int ok = 0, chnum, cnum;
- cnum = ctx->error_depth;
- chnum = sk_X509_num(ctx->chain) - 1;
+ int ok = 0;
+ int cnum = ctx->error_depth;
+ int chnum = (int)sk_X509_num(ctx->chain) - 1;
// if we have an alternative CRL issuer cert use that
if (ctx->current_issuer) {
issuer = ctx->current_issuer;
@@ -1691,11 +1690,11 @@
}
static int internal_verify(X509_STORE_CTX *ctx) {
- int ok = 0, n;
+ int ok = 0;
X509 *xs, *xi;
EVP_PKEY *pkey = NULL;
- n = sk_X509_num(ctx->chain);
+ int n = (int)sk_X509_num(ctx->chain);
ctx->error_depth = n - 1;
n--;
xi = sk_X509_value(ctx->chain, n);
diff --git a/crypto/x509/x509name.c b/crypto/x509/x509name.c
index 25f7b8b..eec2c8e 100644
--- a/crypto/x509/x509name.c
+++ b/crypto/x509/x509name.c
@@ -99,7 +99,7 @@
if (name == NULL) {
return 0;
}
- return (sk_X509_NAME_ENTRY_num(name->entries));
+ return (int)sk_X509_NAME_ENTRY_num(name->entries);
}
int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid, int lastpos) {
@@ -109,26 +109,22 @@
if (obj == NULL) {
return -2;
}
- return (X509_NAME_get_index_by_OBJ(name, obj, lastpos));
+ return X509_NAME_get_index_by_OBJ(name, obj, lastpos);
}
// NOTE: you should be passsing -1, not 0 as lastpos
int X509_NAME_get_index_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj,
int lastpos) {
- int n;
- X509_NAME_ENTRY *ne;
- STACK_OF(X509_NAME_ENTRY) *sk;
-
if (name == NULL) {
return -1;
}
if (lastpos < 0) {
lastpos = -1;
}
- sk = name->entries;
- n = sk_X509_NAME_ENTRY_num(sk);
+ const STACK_OF(X509_NAME_ENTRY) *sk = name->entries;
+ int n = (int)sk_X509_NAME_ENTRY_num(sk);
for (lastpos++; lastpos < n; lastpos++) {
- ne = sk_X509_NAME_ENTRY_value(sk, lastpos);
+ const X509_NAME_ENTRY *ne = sk_X509_NAME_ENTRY_value(sk, lastpos);
if (OBJ_cmp(ne->object, obj) == 0) {
return lastpos;
}
@@ -153,9 +149,9 @@
STACK_OF(X509_NAME_ENTRY) *sk = name->entries;
X509_NAME_ENTRY *ret = sk_X509_NAME_ENTRY_delete(sk, loc);
- int n = sk_X509_NAME_ENTRY_num(sk);
+ size_t n = sk_X509_NAME_ENTRY_num(sk);
name->modified = 1;
- if (loc == n) {
+ if ((size_t)loc == n) {
return ret;
}
@@ -170,7 +166,7 @@
// If we removed a singleton RDN, update the RDN indices so they are
// consecutive again.
if (set_prev + 1 < set_next) {
- for (int i = loc; i < n; i++) {
+ for (size_t i = loc; i < n; i++) {
sk_X509_NAME_ENTRY_value(sk, i)->set--;
}
}
@@ -221,14 +217,14 @@
int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *entry, int loc,
int set) {
X509_NAME_ENTRY *new_name = NULL;
- int n, i, inc;
+ int i, inc;
STACK_OF(X509_NAME_ENTRY) *sk;
if (name == NULL) {
return 0;
}
sk = name->entries;
- n = sk_X509_NAME_ENTRY_num(sk);
+ int n = (int)sk_X509_NAME_ENTRY_num(sk);
if (loc > n) {
loc = n;
} else if (loc < 0) {
@@ -266,7 +262,7 @@
goto err;
}
if (inc) {
- n = sk_X509_NAME_ENTRY_num(sk);
+ n = (int)sk_X509_NAME_ENTRY_num(sk);
for (i = loc + 1; i < n; i++) {
sk_X509_NAME_ENTRY_value(sk, i)->set += 1;
}
diff --git a/crypto/x509/x_name.c b/crypto/x509/x_name.c
index a65c116..3063ce7 100644
--- a/crypto/x509/x_name.c
+++ b/crypto/x509/x_name.c
@@ -230,7 +230,7 @@
entries = sk_STACK_OF_X509_NAME_ENTRY_value(intname, i);
for (j = 0; j < sk_X509_NAME_ENTRY_num(entries); j++) {
entry = sk_X509_NAME_ENTRY_value(entries, j);
- entry->set = i;
+ entry->set = (int)i;
if (!sk_X509_NAME_ENTRY_push(nm->entries, entry)) {
goto err;
}
diff --git a/crypto/x509v3/v3_lib.c b/crypto/x509v3/v3_lib.c
index 61cbeea..d25b839 100644
--- a/crypto/x509v3/v3_lib.c
+++ b/crypto/x509v3/v3_lib.c
@@ -195,7 +195,6 @@
void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *extensions, int nid,
int *out_critical, int *out_idx) {
int lastpos;
- size_t i;
X509_EXTENSION *ex, *found_ex = NULL;
if (!extensions) {
if (out_idx) {
@@ -214,13 +213,13 @@
if (lastpos < 0) {
lastpos = 0;
}
- for (i = lastpos; i < sk_X509_EXTENSION_num(extensions); i++) {
+ for (size_t i = lastpos; i < sk_X509_EXTENSION_num(extensions); i++) {
ex = sk_X509_EXTENSION_value(extensions, i);
if (OBJ_obj2nid(ex->object) == nid) {
if (out_idx) {
// TODO(https://crbug.com/boringssl/379): Consistently reject
// duplicate extensions.
- *out_idx = i;
+ *out_idx = (int)i;
found_ex = ex;
break;
} else if (found_ex) {