@@ -565,6 +565,7 @@ static int oidc_response_process(request_rec *r, oidc_cfg_t *c, oidc_session_t *
565565 oidc_http_hdr_out_location_set (r ,
566566 oidc_util_absolute_url (r , c , oidc_cfg_default_sso_url_get (c )));
567567 OIDC_METRICS_COUNTER_INC (r , c , OM_AUTHN_RESPONSE_ERROR_STATE_MISMATCH );
568+ oidc_cfg_provider_destroy (provider );
568569 return HTTP_MOVED_TEMPORARILY ;
569570 }
570571 oidc_error (r ,
@@ -577,7 +578,7 @@ static int oidc_response_process(request_rec *r, oidc_cfg_t *c, oidc_session_t *
577578 }
578579
579580 OIDC_METRICS_COUNTER_INC (r , c , OM_AUTHN_RESPONSE_ERROR_STATE_MISMATCH );
580-
581+ oidc_cfg_provider_destroy ( provider );
581582 return oidc_util_html_send_error (r , "Invalid Authorization Response" ,
582583 "Could not match the authorization response to an earlier request via "
583584 "the state parameter and corresponding state cookie" ,
@@ -587,18 +588,21 @@ static int oidc_response_process(request_rec *r, oidc_cfg_t *c, oidc_session_t *
587588 /* see if the response is an error response */
588589 if (apr_table_get (params , OIDC_PROTO_ERROR ) != NULL ) {
589590 OIDC_METRICS_COUNTER_INC (r , c , OM_AUTHN_RESPONSE_ERROR_PROVIDER );
591+ oidc_cfg_provider_destroy (provider );
590592 return oidc_response_authorization_error (r , c , proto_state , apr_table_get (params , OIDC_PROTO_ERROR ),
591593 apr_table_get (params , OIDC_PROTO_ERROR_DESCRIPTION ));
592594 }
593595
594596 /* handle the code, implicit or hybrid flow */
595597 if (oidc_response_flows (r , c , proto_state , provider , params , response_mode , & jwt ) == FALSE) {
596598 OIDC_METRICS_COUNTER_INC (r , c , OM_AUTHN_RESPONSE_ERROR_PROTOCOL );
599+ oidc_cfg_provider_destroy (provider );
597600 return oidc_response_authorization_error (r , c , proto_state , "Error in handling response type." , NULL );
598601 }
599602
600603 if (jwt == NULL ) {
601604 oidc_error (r , "no id_token was provided" );
605+ oidc_cfg_provider_destroy (provider );
602606 return oidc_response_authorization_error (r , c , proto_state , "No id_token was provided." , NULL );
603607 }
604608
@@ -634,6 +638,7 @@ static int oidc_response_process(request_rec *r, oidc_cfg_t *c, oidc_session_t *
634638 if (_oidc_strcmp (session -> remote_user , r -> user ) != 0 ) {
635639 oidc_warn (r , "user set from new id_token is different from current one" );
636640 oidc_jwt_destroy (jwt );
641+ oidc_cfg_provider_destroy (provider );
637642 return oidc_response_authorization_error (r , c , proto_state , "User changed!" , NULL );
638643 }
639644 }
@@ -647,6 +652,7 @@ static int oidc_response_process(request_rec *r, oidc_cfg_t *c, oidc_session_t *
647652 apr_table_get (params , OIDC_PROTO_STATE ), original_url , userinfo_jwt ) == FALSE) {
648653 oidc_proto_state_destroy (proto_state );
649654 oidc_jwt_destroy (jwt );
655+ oidc_cfg_provider_destroy (provider );
650656 return HTTP_INTERNAL_SERVER_ERROR ;
651657 }
652658
@@ -656,13 +662,15 @@ static int oidc_response_process(request_rec *r, oidc_cfg_t *c, oidc_session_t *
656662 oidc_error (r , "remote user could not be set" );
657663 oidc_jwt_destroy (jwt );
658664 OIDC_METRICS_COUNTER_INC (r , c , OM_AUTHN_RESPONSE_ERROR_REMOTE_USER );
665+ oidc_cfg_provider_destroy (provider );
659666 return oidc_response_authorization_error (
660667 r , c , proto_state , "Remote user could not be set: contact the website administrator" , NULL );
661668 }
662669
663670 /* cleanup */
664671 oidc_proto_state_destroy (proto_state );
665672 oidc_jwt_destroy (jwt );
673+ oidc_cfg_provider_destroy (provider );
666674
667675 /* check that we've actually authenticated a user; functions as error handling for oidc_get_remote_user */
668676 if (r -> user == NULL ) {
0 commit comments