Skip to content

Commit 3b90028

Browse files
committed
change oidc_cfg cleanup procedures
to better accomodate server rec merging Signed-off-by: Hans Zandbelt <[email protected]>
1 parent dec66b7 commit 3b90028

File tree

5 files changed

+27
-39
lines changed

5 files changed

+27
-39
lines changed

ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
03/10/2023
22
- shm cache: increase default maximum number of active sessions from 500 to 2000
33
- shm cache: allow configuration of max 1Mb of session data for a single session
4+
- change oidc_cfg cleanup procedures to better accomodate server rec merging
45

56
03/09/2023
67
- add support for OP "signed_jwks_uri" with "OIDCProviderSignedJwksUri <uri> <jwk>"

src/config.c

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -797,15 +797,6 @@ static const char* oidc_set_session_max_duration(cmd_parms *cmd,
797797
return OIDC_CONFIG_DIR_RV(cmd, rv);
798798
}
799799

800-
static apr_status_t oidc_cleanup_keys(void *data) {
801-
apr_array_header_t *keys_list = (apr_array_header_t*) data;
802-
oidc_jwk_t **jwk = NULL;
803-
while ((jwk = apr_array_pop(keys_list))) {
804-
oidc_jwk_destroy(*jwk);
805-
}
806-
return APR_SUCCESS;
807-
}
808-
809800
/*
810801
* add a public key from an X.509 file to our list of JWKs with public keys
811802
*/
@@ -837,11 +828,8 @@ static const char* oidc_set_public_key_files(cmd_parms *cmd, void *struct_ptr,
837828
kid, fname, oidc_jose_e2s(cmd->pool, err));
838829
}
839830

840-
if (*public_keys == NULL) {
831+
if (*public_keys == NULL)
841832
*public_keys = apr_array_make(cmd->pool, 4, sizeof(const oidc_jwk_t*));
842-
apr_pool_cleanup_register(cmd->pool, *public_keys, oidc_cleanup_keys,
843-
oidc_cleanup_keys);
844-
}
845833

846834
*(const oidc_jwk_t**) apr_array_push(*public_keys) = jwk;
847835

@@ -910,12 +898,9 @@ static const char* oidc_set_private_key_files_enc(cmd_parms *cmd, void *dummy,
910898
kid, fname, oidc_jose_e2s(cmd->pool, err));
911899
}
912900

913-
if (cfg->private_keys == NULL) {
901+
if (cfg->private_keys == NULL)
914902
cfg->private_keys = apr_array_make(cmd->pool, 4,
915903
sizeof(const oidc_jwk_t*));
916-
apr_pool_cleanup_register(cmd->pool, cfg->private_keys,
917-
oidc_cleanup_keys, oidc_cleanup_keys);
918-
}
919904

920905
*(const oidc_jwk_t**) apr_array_push(cfg->private_keys) = jwk;
921906

@@ -1468,11 +1453,26 @@ void oidc_cfg_provider_init(oidc_provider_t *provider) {
14681453
provider->auth_request_method = OIDC_DEFAULT_AUTH_REQUEST_METHOD;
14691454
}
14701455

1456+
static apr_status_t oidc_destroy_server_config(void *data) {
1457+
oidc_cfg *cfg = (oidc_cfg *)data;
1458+
// can do this even though we haven't got a deep copy
1459+
// since references within the oidc_jwk_t object will be set to NULL
1460+
if (cfg->provider.jwks_uri.jwk)
1461+
oidc_jwk_destroy(cfg->provider.jwks_uri.jwk);
1462+
oidc_jwk_list_destroy(cfg->provider.verify_public_keys);
1463+
oidc_jwk_list_destroy(cfg->oauth.verify_public_keys);
1464+
oidc_jwk_list_destroy_hash(cfg->oauth.verify_shared_keys);
1465+
oidc_jwk_list_destroy(cfg->public_keys);
1466+
oidc_jwk_list_destroy(cfg->private_keys);
1467+
return APR_SUCCESS;
1468+
}
1469+
14711470
/*
14721471
* create a new server config record with defaults
14731472
*/
14741473
void* oidc_create_server_config(apr_pool_t *pool, server_rec *svr) {
14751474
oidc_cfg *c = apr_pcalloc(pool, sizeof(oidc_cfg));
1475+
apr_pool_cleanup_register(pool, c, oidc_destroy_server_config, oidc_destroy_server_config);
14761476

14771477
c->merged = FALSE;
14781478

@@ -1603,6 +1603,7 @@ void* oidc_create_server_config(apr_pool_t *pool, server_rec *svr) {
16031603
*/
16041604
void* oidc_merge_server_config(apr_pool_t *pool, void *BASE, void *ADD) {
16051605
oidc_cfg *c = apr_pcalloc(pool, sizeof(oidc_cfg));
1606+
apr_pool_cleanup_register(pool, c, oidc_destroy_server_config, oidc_destroy_server_config);
16061607
oidc_cfg *base = BASE;
16071608
oidc_cfg *add = ADD;
16081609

@@ -2705,20 +2706,6 @@ static apr_status_t oidc_cleanup_child(void *data) {
27052706
oidc_serror(sp, "cache destroy function failed");
27062707
}
27072708
}
2708-
2709-
// can do this even though we haven't got a deep copy
2710-
// since references within the oidc_jwk_t object will be set to NULL
2711-
if (cfg->provider.jwks_uri.jwk)
2712-
oidc_jwk_destroy(cfg->provider.jwks_uri.jwk);
2713-
oidc_jwk_list_destroy(sp->process->pool,
2714-
cfg->provider.verify_public_keys);
2715-
oidc_jwk_list_destroy(sp->process->pool,
2716-
cfg->oauth.verify_public_keys);
2717-
oidc_jwk_list_destroy_hash(sp->process->pool,
2718-
cfg->oauth.verify_shared_keys);
2719-
oidc_jwk_list_destroy(sp->process->pool, cfg->public_keys);
2720-
oidc_jwk_list_destroy(sp->process->pool, cfg->private_keys);
2721-
27222709
sp = sp->next;
27232710
}
27242711

src/jose.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -394,18 +394,18 @@ void oidc_jwk_destroy(oidc_jwk_t *jwk) {
394394
/*
395395
* destroy a list of JWKs structs
396396
*/
397-
void oidc_jwk_list_destroy_hash(apr_pool_t *pool, apr_hash_t *keys) {
397+
void oidc_jwk_list_destroy_hash(apr_hash_t *keys) {
398398
apr_hash_index_t *hi = NULL;
399399
if (keys == NULL)
400400
return;
401-
for (hi = apr_hash_first(pool, keys); hi; hi = apr_hash_next(hi)) {
401+
for (hi = apr_hash_first(NULL, keys); hi; hi = apr_hash_next(hi)) {
402402
oidc_jwk_t *jwk = NULL;
403403
apr_hash_this(hi, NULL, NULL, (void**) &jwk);
404404
oidc_jwk_destroy(jwk);
405405
}
406406
}
407407

408-
void oidc_jwk_list_destroy(apr_pool_t *pool, apr_array_header_t *keys_list) {
408+
void oidc_jwk_list_destroy(apr_array_header_t *keys_list) {
409409
if (keys_list == NULL)
410410
return;
411411
oidc_jwk_t **jwk = NULL;

src/jose.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,8 @@ apr_byte_t oidc_jwk_to_json(apr_pool_t *pool, const oidc_jwk_t *jwk,
174174
/* destroy resources allocated for a JWK struct */
175175
void oidc_jwk_destroy(oidc_jwk_t *jwk);
176176
/* destroy a list of JWKs structs */
177-
void oidc_jwk_list_destroy_hash(apr_pool_t *pool, apr_hash_t *key);
178-
void oidc_jwk_list_destroy(apr_pool_t *pool, apr_array_header_t *keys_list);
177+
void oidc_jwk_list_destroy_hash(apr_hash_t *key);
178+
void oidc_jwk_list_destroy(apr_array_header_t *keys_list);
179179
/* create an "oct" symmetric JWK */
180180
oidc_jwk_t* oidc_jwk_create_symmetric_key(apr_pool_t *pool, const char *kid,
181181
const unsigned char *key, unsigned int key_len, apr_byte_t set_kid,

src/proto.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,7 +1568,7 @@ apr_byte_t oidc_proto_jwt_verify(request_rec *r, oidc_cfg *cfg, oidc_jwt_t *jwt,
15681568
/* get the key from the JWKs that corresponds with the key specified in the header */
15691569
if (oidc_proto_get_keys_from_jwks_uri(r, cfg, jwt, jwks_uri,
15701570
ssl_validate_server, dynamic_keys, &force_refresh) == FALSE) {
1571-
oidc_jwk_list_destroy_hash(r->pool, dynamic_keys);
1571+
oidc_jwk_list_destroy_hash(dynamic_keys);
15721572
return FALSE;
15731573
}
15741574
}
@@ -1580,15 +1580,15 @@ apr_byte_t oidc_proto_jwt_verify(request_rec *r, oidc_cfg *cfg, oidc_jwt_t *jwt,
15801580
&err) == FALSE) {
15811581
oidc_error(r, "JWT signature verification failed: %s",
15821582
oidc_jose_e2s(r->pool, err));
1583-
oidc_jwk_list_destroy_hash(r->pool, dynamic_keys);
1583+
oidc_jwk_list_destroy_hash(dynamic_keys);
15841584
return FALSE;
15851585
}
15861586

15871587
oidc_debug(r,
15881588
"JWT signature verification with algorithm \"%s\" was successful",
15891589
jwt->header.alg);
15901590

1591-
oidc_jwk_list_destroy_hash(r->pool, dynamic_keys);
1591+
oidc_jwk_list_destroy_hash(dynamic_keys);
15921592
return TRUE;
15931593
}
15941594

0 commit comments

Comments
 (0)