Const-correct X509_LOOKUP_METHOD
This avoids putting the method tables in writable memory.
Update-Note: Making X509_LOOKUP_file and X509_LOOKUP_hash_dir return
const pointers is not quite source-compatible, but code search suggests
nothing cares. If we have to, we can cast const away in those functions,
but let's try the more type-safe option first.
Change-Id: I562890f9db989c9991bc69b1c2e8174cd04d03a4
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/64249
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-by: Bob Beck <bbe@google.com>
diff --git a/crypto/x509/by_dir.c b/crypto/x509/by_dir.c
index 54e48b2..64cec53 100644
--- a/crypto/x509/by_dir.c
+++ b/crypto/x509/by_dir.c
@@ -92,14 +92,16 @@
static int add_cert_dir(BY_DIR *ctx, const char *dir, int type);
static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
X509_OBJECT *ret);
-static X509_LOOKUP_METHOD x509_dir_lookup = {
+static const X509_LOOKUP_METHOD x509_dir_lookup = {
new_dir, // new
free_dir, // free
dir_ctrl, // ctrl
get_cert_by_subject, // get_by_subject
};
-X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void) { return &x509_dir_lookup; }
+const X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void) {
+ return &x509_dir_lookup;
+}
static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
char **retp) {
diff --git a/crypto/x509/by_file.c b/crypto/x509/by_file.c
index 7bcf465..799e16d 100644
--- a/crypto/x509/by_file.c
+++ b/crypto/x509/by_file.c
@@ -65,14 +65,14 @@
static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, long argl,
char **ret);
-static X509_LOOKUP_METHOD x509_file_lookup = {
+static const X509_LOOKUP_METHOD x509_file_lookup = {
NULL, // new
NULL, // free
by_file_ctrl, // ctrl
NULL, // get_by_subject
};
-X509_LOOKUP_METHOD *X509_LOOKUP_file(void) { return &x509_file_lookup; }
+const X509_LOOKUP_METHOD *X509_LOOKUP_file(void) { return &x509_file_lookup; }
static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
char **ret) {
diff --git a/crypto/x509/internal.h b/crypto/x509/internal.h
index 25b6e5f..b67e558 100644
--- a/crypto/x509/internal.h
+++ b/crypto/x509/internal.h
@@ -345,7 +345,7 @@
// This is the functions plus an instance of the local variables.
struct x509_lookup_st {
- X509_LOOKUP_METHOD *method; // the functions
+ const X509_LOOKUP_METHOD *method; // the functions
void *method_data; // method data
X509_STORE *store_ctx; // who owns us
diff --git a/crypto/x509/x509_lu.c b/crypto/x509/x509_lu.c
index f9ed1c9..94f5565 100644
--- a/crypto/x509/x509_lu.c
+++ b/crypto/x509/x509_lu.c
@@ -73,12 +73,12 @@
X509_OBJECT *x);
static int X509_OBJECT_up_ref_count(X509_OBJECT *a);
-static X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method,
+static X509_LOOKUP *X509_LOOKUP_new(const X509_LOOKUP_METHOD *method,
X509_STORE *store);
static int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name,
X509_OBJECT *ret);
-static X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method,
+static X509_LOOKUP *X509_LOOKUP_new(const X509_LOOKUP_METHOD *method,
X509_STORE *store) {
X509_LOOKUP *ret = OPENSSL_zalloc(sizeof(X509_LOOKUP));
if (ret == NULL) {
@@ -191,7 +191,7 @@
OPENSSL_free(vfy);
}
-X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m) {
+X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, const X509_LOOKUP_METHOD *m) {
STACK_OF(X509_LOOKUP) *sk = v->get_cert_methods;
for (size_t i = 0; i < sk_X509_LOOKUP_num(sk); i++) {
X509_LOOKUP *lu = sk_X509_LOOKUP_value(sk, i);
diff --git a/include/openssl/x509.h b/include/openssl/x509.h
index 5a45a04..449f932 100644
--- a/include/openssl/x509.h
+++ b/include/openssl/x509.h
@@ -3240,10 +3240,10 @@
OPENSSL_EXPORT X509 *X509_STORE_CTX_get0_cert(X509_STORE_CTX *ctx);
OPENSSL_EXPORT X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v,
- X509_LOOKUP_METHOD *m);
+ const X509_LOOKUP_METHOD *m);
-OPENSSL_EXPORT X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void);
-OPENSSL_EXPORT X509_LOOKUP_METHOD *X509_LOOKUP_file(void);
+OPENSSL_EXPORT const X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void);
+OPENSSL_EXPORT const X509_LOOKUP_METHOD *X509_LOOKUP_file(void);
OPENSSL_EXPORT int X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
OPENSSL_EXPORT int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);