oidc_cache_mutex_create:
   63|      4|oidc_cache_mutex_t *oidc_cache_mutex_create(apr_pool_t *pool, apr_byte_t global) {
   64|      4|	oidc_cache_mutex_t *ctx = apr_pcalloc(pool, sizeof(oidc_cache_mutex_t));
  ------------------
  |  |  465|      4|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
   65|      4|	ctx->gmutex = NULL;
   66|      4|	ctx->tmutex = NULL;
   67|      4|	ctx->mutex_filename = NULL;
   68|      4|	ctx->is_parent = TRUE;
  ------------------
  |  |   55|      4|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      4|#define FALSE 0
  |  |  ------------------
  ------------------
   69|      4|	ctx->is_global = global;
   70|      4|	return ctx;
   71|      4|}
oidc_cache_mutex_post_config:
  145|      4|apr_byte_t oidc_cache_mutex_post_config(apr_pool_t *pool, server_rec *s, oidc_cache_mutex_t *m, const char *type) {
  146|      4|	apr_byte_t rc = TRUE;
  ------------------
  |  |   55|      4|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      4|#define FALSE 0
  |  |  ------------------
  ------------------
  147|      4|	apr_status_t rv = APR_SUCCESS;
  ------------------
  |  |  225|      4|#define APR_SUCCESS 0
  ------------------
  148|       |
  149|      4|	if (m->is_global) {
  ------------------
  |  Branch (149:6): [True: 4, False: 0]
  ------------------
  150|      4|		rc = oidc_cache_mutex_global_create(pool, s, m, type);
  151|      4|		goto end;
  152|      4|	}
  153|       |
  154|       |	// NB: see the note above at apr_global_mutex_create on the pool/pre-cleanup ordering requirement
  155|      0|	rv = apr_thread_mutex_create(&m->tmutex, APR_THREAD_MUTEX_DEFAULT, pool);
  ------------------
  |  |   43|      0|#define APR_THREAD_MUTEX_DEFAULT  0x0   /**< platform-optimal lock behavior */
  ------------------
  156|      0|	if (rv != APR_SUCCESS) {
  ------------------
  |  |  225|      0|#define APR_SUCCESS 0
  ------------------
  |  Branch (156:6): [True: 0, False: 0]
  ------------------
  157|      0|		oidc_serror(s, "apr_thread_mutex_create failed: %s (%d)", oidc_cache_status2str(pool, rv), rv);
  ------------------
  |  |  177|      0|#define oidc_serror(s, fmt, ...) oidc_slog(s, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  167|      0|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  363|      0|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  366|      0|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  183|      0|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      0|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (183:13): [True: 0, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  184|      0|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  185|      0|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  626|      0|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  186|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  367|      0|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  368|      0|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  168|      0|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  |  |  ------------------
  ------------------
  158|      0|		rc = FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  159|      0|		goto end;
  160|      0|	}
  161|       |
  162|      4|end:
  163|       |
  164|      4|	return rc;
  165|      0|}
common.c:oidc_cache_mutex_global_create:
   88|      4|						 const char *type) {
   89|       |
   90|      4|	apr_status_t rv = APR_SUCCESS;
  ------------------
  |  |  225|      4|#define APR_SUCCESS 0
  ------------------
   91|      4|	const char *dir;
   92|       |
   93|       |	/* construct the mutex filename */
   94|      4|	rv = apr_temp_dir_get(&dir, pool);
   95|      4|	if (rv != APR_SUCCESS) {
  ------------------
  |  |  225|      4|#define APR_SUCCESS 0
  ------------------
  |  Branch (95:6): [True: 0, False: 4]
  ------------------
   96|      0|		oidc_serror(s, "apr_temp_dir_get failed: could not find a temp dir: %s",
  ------------------
  |  |  177|      0|#define oidc_serror(s, fmt, ...) oidc_slog(s, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  167|      0|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  363|      0|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  366|      0|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  183|      0|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      0|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (183:13): [True: 0, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  184|      0|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  185|      0|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  626|      0|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  186|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  367|      0|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  368|      0|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  168|      0|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  |  |  ------------------
  ------------------
   97|      0|			    oidc_cache_status2str(pool, rv));
   98|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
   99|      0|	}
  100|       |
  101|      4|	m->mutex_filename =
  102|      4|	    apr_psprintf(pool, "%s/mod_auth_openidc_%s_mutex.%ld.%pp", dir, type, (long int)getpid(), s);
  103|       |
  104|       |	/* set the lock type */
  105|      4|	apr_lockmech_e mech =
  106|       |#ifdef OIDC_LOCK
  107|       |	    OIDC_LOCK
  108|       |#elif APR_HAS_POSIXSEM_SERIALIZE
  109|       |	    APR_LOCK_POSIXSEM
  110|       |#else
  111|       |	    APR_LOCK_DEFAULT
  112|       |#endif
  113|      4|	    ;
  114|       |
  115|       |	/*
  116|       |	 * The server pre-cleanup must destroy this mutex before APR's regular cleanup tears down its
  117|       |	 * semaphore. Changing that order can crash graceful restarts.
  118|       |	 */
  119|      4|	rv = apr_global_mutex_create(&m->gmutex, (const char *)m->mutex_filename, mech, pool);
  120|       |
  121|      4|	if (rv != APR_SUCCESS) {
  ------------------
  |  |  225|      4|#define APR_SUCCESS 0
  ------------------
  |  Branch (121:6): [True: 0, False: 4]
  ------------------
  122|      0|		oidc_serror(s, "apr_global_mutex_create failed to create mutex (%d) on file %s: %s (%d)", mech,
  ------------------
  |  |  177|      0|#define oidc_serror(s, fmt, ...) oidc_slog(s, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  167|      0|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  363|      0|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  366|      0|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  183|      0|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      0|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (183:13): [True: 0, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  184|      0|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  185|      0|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  626|      0|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  186|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  367|      0|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  368|      0|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  168|      0|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  |  |  ------------------
  ------------------
  123|      0|			    m->mutex_filename, oidc_cache_status2str(pool, rv), rv);
  124|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  125|      0|	}
  126|       |
  127|       |	/* need this on Linux */
  128|      4|#ifdef AP_NEED_SET_MUTEX_PERMS
  129|      4|	rv = ap_unixd_set_global_mutex_perms(m->gmutex);
  130|      4|	if (rv != APR_SUCCESS) {
  ------------------
  |  |  225|      4|#define APR_SUCCESS 0
  ------------------
  |  Branch (130:6): [True: 0, False: 4]
  ------------------
  131|      0|		oidc_serror(s, "unixd_set_global_mutex_perms failed; could not set permissions: %s (%d)",
  ------------------
  |  |  177|      0|#define oidc_serror(s, fmt, ...) oidc_slog(s, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  167|      0|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  363|      0|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  366|      0|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  183|      0|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      0|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (183:13): [True: 0, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  184|      0|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  185|      0|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  626|      0|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  186|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  367|      0|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  368|      0|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  168|      0|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  |  |  ------------------
  ------------------
  132|      0|			    oidc_cache_status2str(pool, rv), rv);
  133|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  134|      0|	}
  135|      4|#endif
  136|       |
  137|      4|	oidc_slog(s, APLOG_TRACE1, "create: %pp (m=%pp,s=%pp, p=%d)", m, m->gmutex ? m->gmutex : 0, s, m->is_parent);
  ------------------
  |  |  167|      4|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  ------------------
  |  |  |  |  363|      4|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  366|      4|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      4|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   60|      4|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   48|      4|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (183:13): [Folded, False: 4]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  184|      4|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 4]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  185|      4|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  626|      4|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  621|      8|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 4]
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 4, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 4, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  622|      4|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  623|      4|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 4]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  186|      4|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   60|      4|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  367|      4|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (367:65): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  368|      4|    } while(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 4]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  168|      4|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  ------------------
  138|       |
  139|      4|	return TRUE;
  ------------------
  |  |   55|      4|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      4|#define FALSE 0
  |  |  ------------------
  ------------------
  140|      4|}

oidc_cache_shm_segment_size:
  121|      2|apr_byte_t oidc_cache_shm_segment_size(int size_max, int entry_size_max, apr_uint32_t nbuckets, apr_size_t *result) {
  122|       |	/* Calculate in 64 bits first: apr_size_t is only 32 bits on supported 32-bit APR builds. */
  123|      2|	const apr_uint64_t header_size = ((apr_uint64_t)sizeof(oidc_cache_shm_header_t) + 63) & ~63ULL;
  124|      2|	const apr_uint64_t bucket_size = ((apr_uint64_t)nbuckets * sizeof(apr_uint32_t) + 63) & ~63ULL;
  125|      2|	const apr_uint64_t slot_size = ((apr_uint64_t)entry_size_max + 63) & ~63ULL;
  126|      2|	const apr_uint64_t slots_size = slot_size * (apr_uint64_t)size_max;
  127|      2|	const apr_uint64_t total = 64 + header_size + bucket_size + slots_size;
  128|       |
  129|      2|	if ((result == NULL) || (size_max <= 0) || (entry_size_max <= 0) || (nbuckets == 0) ||
  ------------------
  |  Branch (129:6): [True: 0, False: 2]
  |  Branch (129:26): [True: 0, False: 2]
  |  Branch (129:45): [True: 0, False: 2]
  |  Branch (129:70): [True: 0, False: 2]
  ------------------
  130|      2|	    (slots_size / slot_size != (apr_uint64_t)size_max) || (total < slots_size) ||
  ------------------
  |  Branch (130:6): [True: 0, False: 2]
  |  Branch (130:60): [True: 0, False: 2]
  ------------------
  131|      2|	    (total > (apr_uint64_t)SIZE_MAX) || (total > OIDC_CACHE_SHM_SEGMENT_SIZE_MAX))
  ------------------
  |  |   60|      2|#define OIDC_CACHE_SHM_SEGMENT_SIZE_MAX ((apr_uint64_t)16 * 1024 * 1024 * 1024)
  ------------------
  |  Branch (131:6): [True: 0, False: 2]
  |  Branch (131:42): [True: 0, False: 2]
  ------------------
  132|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  133|       |
  134|      2|	*result = (apr_size_t)total;
  135|      2|	return TRUE;
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
  136|      2|}
shm.c:oidc_cache_shm_base:
  117|      2|static oidc_cache_shm_header_t *oidc_cache_shm_base(const oidc_cache_cfg_shm_t *context) {
  118|      2|	return (oidc_cache_shm_header_t *)APR_ALIGN((uintptr_t)apr_shm_baseaddr_get(context->shm), 64);
  ------------------
  |  |  137|      2|    (((size) + ((boundary) - 1)) & ~((boundary) - 1))
  ------------------
  119|      2|}
shm.c:oidc_cache_shm_buckets:
  102|  1.00k|static apr_uint32_t *oidc_cache_shm_buckets(oidc_cache_shm_header_t *hdr) {
  103|  1.00k|	return (apr_uint32_t *)((uint8_t *)hdr + APR_ALIGN(sizeof(oidc_cache_shm_header_t), 64));
  ------------------
  |  |  137|  1.00k|    (((size) + ((boundary) - 1)) & ~((boundary) - 1))
  ------------------
  104|  1.00k|}
shm.c:oidc_cache_shm_slot:
  106|  1.00k|static oidc_cache_shm_entry_t *oidc_cache_shm_slot(oidc_cache_shm_header_t *hdr, apr_uint32_t idx) {
  107|  1.00k|	uint8_t *slots =
  108|  1.00k|	    (uint8_t *)oidc_cache_shm_buckets(hdr) + APR_ALIGN((apr_size_t)hdr->nbuckets * sizeof(apr_uint32_t), 64);
  ------------------
  |  |  137|  1.00k|    (((size) + ((boundary) - 1)) & ~((boundary) - 1))
  ------------------
  109|  1.00k|	return (oidc_cache_shm_entry_t *)(slots + (apr_size_t)(idx - 1) * hdr->entry_size);
  110|  1.00k|}
shm.c:oidc_cache_shm_post_config:
  295|      2|static int oidc_cache_shm_post_config(apr_pool_t *pool, server_rec *s) {
  296|      2|	oidc_cfg_t *cfg = (oidc_cfg_t *)ap_get_module_config(s->module_config, &auth_openidc_module);
  ------------------
  |  |  551|      2|    (((void **)(v))[(m)->module_index])
  ------------------
  297|      2|	const int size_max = oidc_cfg_cache_shm_size_max_get(cfg);
  298|      2|	const int entry_size_max = oidc_cfg_cache_shm_entry_size_max_get(cfg);
  299|       |
  300|      2|	if (cfg->cache.cfg != NULL)
  ------------------
  |  Branch (300:6): [True: 0, False: 2]
  ------------------
  301|      0|		return OK;
  ------------------
  |  |  456|      0|#define OK 0                    /**< Module has handled this stage. */
  ------------------
  302|      2|	oidc_cache_cfg_shm_t *context = oidc_cache_shm_cfg_create(pool);
  303|      2|	cfg->cache.cfg = context;
  304|       |
  305|       |	/* a power-of-two number of hash buckets >= the number of slots */
  306|      2|	apr_uint32_t nbuckets = 1;
  307|     20|	while ((nbuckets < (apr_uint32_t)size_max) && (nbuckets <= UINT32_MAX / 2))
  ------------------
  |  Branch (307:9): [True: 18, False: 2]
  |  Branch (307:48): [True: 18, False: 0]
  ------------------
  308|     18|		nbuckets <<= 1;
  309|      2|	if (nbuckets < (apr_uint32_t)size_max) {
  ------------------
  |  Branch (309:6): [True: 0, False: 2]
  ------------------
  310|      0|		oidc_serror(s, "could not size the shared memory hash bucket array");
  ------------------
  |  |  177|      0|#define oidc_serror(s, fmt, ...) oidc_slog(s, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  167|      0|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  363|      0|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  366|      0|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  183|      0|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      0|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (183:13): [True: 0, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  184|      0|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  185|      0|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  626|      0|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  186|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  367|      0|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  368|      0|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  168|      0|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  |  |  ------------------
  ------------------
  311|      0|		return HTTP_INTERNAL_SERVER_ERROR;
  ------------------
  |  |  535|      0|#define HTTP_INTERNAL_SERVER_ERROR           500
  ------------------
  312|      0|	}
  313|       |
  314|      2|	apr_size_t segment_size = 0;
  315|      2|	if (oidc_cache_shm_segment_size(size_max, entry_size_max, nbuckets, &segment_size) == FALSE) {
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  |  Branch (315:6): [True: 0, False: 2]
  ------------------
  316|      0|		oidc_serror(s,
  ------------------
  |  |  177|      0|#define oidc_serror(s, fmt, ...) oidc_slog(s, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  167|      0|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  363|      0|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  366|      0|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  183|      0|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      0|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (183:13): [True: 0, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  184|      0|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  185|      0|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  626|      0|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  186|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  367|      0|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  368|      0|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  168|      0|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  |  |  ------------------
  ------------------
  317|      0|			    "requested shared memory cache is too large; reduce " OIDCCacheShmMax
  318|      0|			    " or " OIDCCacheShmEntrySizeMax " (maximum segment size is %" APR_UINT64_T_FMT " bytes)",
  319|      0|			    OIDC_CACHE_SHM_SEGMENT_SIZE_MAX);
  320|      0|		return HTTP_INTERNAL_SERVER_ERROR;
  ------------------
  |  |  535|      0|#define HTTP_INTERNAL_SERVER_ERROR           500
  ------------------
  321|      0|	}
  322|       |
  323|       |	/* create the shared memory segment */
  324|      2|	apr_status_t rv = apr_shm_create(&context->shm, segment_size, NULL, pool);
  325|      2|	if (rv != APR_SUCCESS) {
  ------------------
  |  |  225|      2|#define APR_SUCCESS 0
  ------------------
  |  Branch (325:6): [True: 0, False: 2]
  ------------------
  326|      0|		oidc_serror(s, "apr_shm_create failed to create shared memory segment");
  ------------------
  |  |  177|      0|#define oidc_serror(s, fmt, ...) oidc_slog(s, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  167|      0|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  363|      0|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  366|      0|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  183|      0|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      0|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (183:13): [True: 0, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  184|      0|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  185|      0|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  626|      0|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  186|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  367|      0|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  368|      0|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  168|      0|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  |  |  ------------------
  ------------------
  327|      0|		return HTTP_INTERNAL_SERVER_ERROR;
  ------------------
  |  |  535|      0|#define HTTP_INTERNAL_SERVER_ERROR           500
  ------------------
  328|      0|	}
  329|       |
  330|       |	/* initialize the header, the (empty) hash buckets and the free list holding all slots */
  331|      2|	oidc_cache_shm_header_t *hdr = oidc_cache_shm_base(context);
  332|      2|	hdr->nslots = (apr_uint32_t)size_max;
  333|      2|	hdr->nbuckets = nbuckets;
  334|       |	/* round the slot stride up to the entry's 64-byte alignment (see oidc_cache_shm_segment_size) */
  335|      2|	hdr->entry_size = (apr_uint32_t)APR_ALIGN((apr_size_t)entry_size_max, 64);
  ------------------
  |  |  137|      2|    (((size) + ((boundary) - 1)) & ~((boundary) - 1))
  ------------------
  336|      2|	if (apr_generate_random_bytes((unsigned char *)hdr->hash_key, sizeof(hdr->hash_key)) != APR_SUCCESS) {
  ------------------
  |  |  225|      2|#define APR_SUCCESS 0
  ------------------
  |  Branch (336:6): [True: 0, False: 2]
  ------------------
  337|      0|		oidc_serror(s, "apr_generate_random_bytes failed to seed the shared memory cache hash");
  ------------------
  |  |  177|      0|#define oidc_serror(s, fmt, ...) oidc_slog(s, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  167|      0|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  363|      0|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  366|      0|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  183|      0|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      0|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (183:13): [True: 0, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  184|      0|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  185|      0|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  626|      0|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  186|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  367|      0|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  368|      0|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  168|      0|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  |  |  ------------------
  ------------------
  338|      0|		return HTTP_INTERNAL_SERVER_ERROR;
  ------------------
  |  |  535|      0|#define HTTP_INTERNAL_SERVER_ERROR           500
  ------------------
  339|      0|	}
  340|      2|	hdr->last_pressure_warning = 0;
  341|      2|	_oidc_memset(oidc_cache_shm_buckets(hdr), 0, (apr_size_t)nbuckets * sizeof(apr_uint32_t));
  ------------------
  |  |   84|      2|#define _oidc_memset(b, c, __len) memset(b, c, __len)
  ------------------
  342|  1.00k|	for (apr_uint32_t i = 1; i <= hdr->nslots; i++) {
  ------------------
  |  Branch (342:27): [True: 1.00k, False: 2]
  ------------------
  343|  1.00k|		oidc_cache_shm_entry_t *t = oidc_cache_shm_slot(hdr, i);
  344|  1.00k|		t->section_key[0] = '\0';
  345|  1.00k|		t->access = 0;
  346|  1.00k|		t->next = i < hdr->nslots ? i + 1 : 0;
  ------------------
  |  Branch (346:13): [True: 998, False: 2]
  ------------------
  347|  1.00k|	}
  348|      2|	hdr->free_head = 1;
  349|       |
  350|      2|	if (oidc_cache_mutex_post_config(pool, s, context->mutex, "shm") == FALSE)
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  |  Branch (350:6): [True: 0, False: 2]
  ------------------
  351|      0|		return HTTP_INTERNAL_SERVER_ERROR;
  ------------------
  |  |  535|      0|#define HTTP_INTERNAL_SERVER_ERROR           500
  ------------------
  352|      2|	context->mutex_ready = TRUE;
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
  353|       |
  354|      2|	oidc_sdebug(s,
  ------------------
  |  |  175|      2|#define oidc_sdebug(s, fmt, ...) oidc_slog(s, OIDC_DEBUG, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  167|      2|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  363|      2|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  366|      2|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  183|      2|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      2|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      2|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (183:13): [Folded, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  184|      2|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  185|      2|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  626|      2|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      4|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 2, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 2, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      2|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      2|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  186|      2|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      2|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  367|      2|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  368|      2|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 2]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  168|      2|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  |  |  ------------------
  ------------------
  355|      2|		    "initialized shared memory with a cache size (# entries) of: %d, a max (single) entry size of: %d, "
  356|      2|		    "and a segment size of: %" APR_SIZE_T_FMT,
  357|      2|		    size_max, entry_size_max, segment_size);
  358|       |
  359|      2|	oidc_slog(s, APLOG_TRACE1, "create: %pp (shm=%pp,s=%pp, p=%d)", context, context ? context->shm : 0, s,
  ------------------
  |  |  167|      2|	ap_log_error(APLOG_MARK, level, 0, s, "%s: %s", __FUNCTION__,                                                  \
  |  |  ------------------
  |  |  |  |  363|      2|#define ap_log_error(...) ap_log_error__(__VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  366|      2|    do { const server_rec *sr__ = s; if (APLOG_MODULE_IS_LEVEL(sr__, mi, level)) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      2|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   60|      2|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   48|      2|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (183:13): [Folded, False: 2]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  184|      2|            (s == NULL) ||                                       \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (184:13): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  185|      2|            (ap_get_server_module_loglevel(s, module_index)      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  626|      2|    (ap_get_module_loglevel(&(s)->log,i))
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  621|      4|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 2, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 2, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  622|      2|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  623|      2|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (185:13): [True: 0, False: 2]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  186|      2|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   60|      2|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  367|      2|             ap_log_error_(file, line, mi, level, status, sr__, __VA_ARGS__);    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (367:40): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (367:65): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (367:65): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  368|      2|    } while(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (368:13): [Folded, False: 2]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  168|      2|		     apr_psprintf(s->process->pconf, fmt, ##__VA_ARGS__))
  ------------------
  360|      2|		  context ? context->is_parent : -1);
  361|       |
  362|      2|	return OK;
  ------------------
  |  |  456|      2|#define OK 0                    /**< Module has handled this stage. */
  ------------------
  363|      2|}
shm.c:oidc_cache_shm_cfg_create:
  284|      2|static void *oidc_cache_shm_cfg_create(apr_pool_t *pool) {
  285|      2|	oidc_cache_cfg_shm_t *context = apr_pcalloc(pool, sizeof(oidc_cache_cfg_shm_t));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  286|      2|	context->shm = NULL;
  287|      2|	context->mutex = oidc_cache_mutex_create(pool, TRUE);
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
  288|      2|	context->is_parent = TRUE;
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
  289|      2|	return context;
  290|      2|}

oidc_cfg_cache_shm_size_max_get:
   61|      2|	type oidc_cfg_cache_##member##_get(const oidc_cfg_t *cfg) {                                                    \
   62|      2|		if (cfg->cache.member == unset_val)                                                                    \
  ------------------
  |  Branch (62:7): [True: 0, False: 2]
  ------------------
   63|      2|			return def_val;                                                                                \
   64|      2|		return cfg->cache.member;                                                                              \
   65|      2|	}
oidc_cfg_cache_shm_entry_size_max_get:
   61|      2|	type oidc_cfg_cache_##member##_get(const oidc_cfg_t *cfg) {                                                    \
   62|      2|		if (cfg->cache.member == unset_val)                                                                    \
  ------------------
  |  Branch (62:7): [True: 0, False: 2]
  ------------------
   63|      2|			return def_val;                                                                                \
   64|      2|		return cfg->cache.member;                                                                              \
   65|      2|	}
oidc_cfg_cache_create_server_config:
  267|      2|void oidc_cfg_cache_create_server_config(oidc_cfg_t *c) {
  268|      2|	c->cache.impl = NULL;
  269|      2|	c->cache.cfg = NULL;
  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  ------------------
  |  |  111|      2|	INT(int, encrypt)                                                                                              \
  |  |  ------------------
  |  |  |  |  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  261|      2|#define OIDC_CACHE_M_CREATE_INT(type, name) c->cache.name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|      2|	/* shm: size of the segment (max number of cached entries) and max size in bytes of one entry */               \
  |  |  113|      2|	INT(int, shm_size_max)                                                                                         \
  |  |  ------------------
  |  |  |  |  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  261|      2|#define OIDC_CACHE_M_CREATE_INT(type, name) c->cache.name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  114|      2|	INT(int, shm_entry_size_max)                                                                                   \
  |  |  ------------------
  |  |  |  |  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  261|      2|#define OIDC_CACHE_M_CREATE_INT(type, name) c->cache.name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  115|      2|	/* file: directory holding the cache files (OS default like "/tmp" if unset) + clean interval */               \
  |  |  116|      2|	PTR(char *, file_dir)                                                                                          \
  |  |  ------------------
  |  |  |  |  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  260|      2|#define OIDC_CACHE_M_CREATE_PTR(type, name) c->cache.name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|      2|	INT(int, file_clean_interval)                                                                                  \
  |  |  ------------------
  |  |  |  |  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  261|      2|#define OIDC_CACHE_M_CREATE_INT(type, name) c->cache.name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  118|      2|	OIDC_CACHE_CFG_MEMCACHE_MEMBERS(PTR, INT, TIMEOUT)                                                             \
  |  |  ------------------
  |  |  |  |   81|      2|	PTR(char *, memcache_servers)                                                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  260|      2|#define OIDC_CACHE_M_CREATE_PTR(type, name) c->cache.name = NULL;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   82|      2|	/* cache_type= memcache: minimum number of connections to each memcache server per process*/                   \
  |  |  |  |   83|      2|	INT(int, memcache_min)                                                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  |  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  261|      2|#define OIDC_CACHE_M_CREATE_INT(type, name) c->cache.name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|      2|	/* cache_type= memcache: soft maximum number of connections to each memcache server per process */             \
  |  |  |  |   85|      2|	INT(int, memcache_smax)                                                                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  261|      2|#define OIDC_CACHE_M_CREATE_INT(type, name) c->cache.name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   86|      2|	/* cache_type= memcache: hard maximum number of connections to each memcache server per process */             \
  |  |  |  |   87|      2|	INT(int, memcache_hmax)                                                                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  261|      2|#define OIDC_CACHE_M_CREATE_INT(type, name) c->cache.name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   88|      2|	/* cache_type= memcache: maximum time in microseconds a connection to a memcache server can be idle before     \
  |  |  |  |   89|      2|	 * being closed */                                                                                             \
  |  |  |  |   90|      2|	TIMEOUT(memcache_ttl)
  |  |  |  |  ------------------
  |  |  |  |  |  |  270|      2|	OIDC_CACHE_CFG_SIMPLE_MEMBERS(OIDC_CACHE_M_CREATE_PTR, OIDC_CACHE_M_CREATE_INT, OIDC_CACHE_M_CREATE_TIMEOUT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  262|      2|#define OIDC_CACHE_M_CREATE_TIMEOUT(name) c->cache.name = OIDC_CONFIG_POS_TIMEOUT_UNSET;
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      2|#define OIDC_CONFIG_POS_TIMEOUT_UNSET (apr_interval_time_t) - 2
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      2|	OIDC_CACHE_CFG_REDIS_MEMBERS(PTR, INT, TIMEOUT)
  ------------------
  271|      2|}

oidc_cfg_server_create:
  862|      2|void *oidc_cfg_server_create(apr_pool_t *pool, server_rec *svr) {
  863|      2|	oidc_cfg_t *c = oidc_cfg_server_alloc(pool, svr);
  864|      2|	c->svr = svr;
  865|       |
  866|      2|	c->merged = FALSE;
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  867|       |	/* nothing to inherit from: whatever OIDCRedirectURI this config ends up with is its own */
  868|      2|	c->redirect_uri_inherited = FALSE;
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  869|       |
  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  ------------------
  |  |  138|      2|	PTR(char *, redirect_uri)                                                                                      \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  139|      2|	/* (optional) default URL for 3rd-party initiated SSO */                                                       \
  |  |  140|      2|	PTR(char *, default_sso_url)                                                                                   \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      2|	/* (optional) default URL to go to after logout */                                                             \
  |  |  142|      2|	PTR(char *, default_slo_url)                                                                                   \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  143|      2|	/* Javascript template to preserve POST data */                                                                \
  |  |  144|      2|	PTR(char *, post_preserve_template)                                                                            \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  145|      2|	/* Javascript template to restore POST data */                                                                 \
  |  |  146|      2|	PTR(char *, post_restore_template)                                                                             \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      2|	/* type of session management/storage */                                                                       \
  |  |  148|      2|	INT(session_type)                                                                                              \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      2|	/* whether secrets/tokens are masked in the debug log */                                                       \
  |  |  150|      2|	INT(debug_mask_secrets)                                                                                        \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      2|	INT(session_cache_fallback_to_cookie)                                                                          \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  152|      2|	/* session cookie or persistent cookie */                                                                      \
  |  |  153|      2|	INT(persistent_session_cookie)                                                                                 \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  154|      2|	/* store the id_token in the session */                                                                        \
  |  |  155|      2|	INT(store_id_token)                                                                                            \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  156|      2|	/* session cookie chunk size */                                                                                \
  |  |  157|      2|	INT(session_cookie_chunk_size)                                                                                 \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  158|      2|	PTR(char *, cookie_domain)                                                                                     \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  159|      2|	INT(cookie_http_only)                                                                                          \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  160|      2|	/* samesite cookie settings */                                                                                 \
  |  |  161|      2|	INT(cookie_same_site_session)                                                                                  \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  162|      2|	INT(cookie_same_site_state)                                                                                    \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      2|	INT(cookie_same_site_discovery_csrf)                                                                           \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  164|      2|	INT(state_timeout)                                                                                             \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      2|	INT(max_number_of_state_cookies)                                                                               \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  166|      2|	INT(delete_oldest_state_cookies)                                                                               \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  167|      2|	INT(state_input_headers)                                                                                       \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  168|      2|	INT(session_inactivity_timeout)                                                                                \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  169|      2|	INT(provider_metadata_refresh_interval)                                                                        \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  170|      2|	PTR(char *, claim_delimiter)                                                                                   \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  171|      2|	PTR(char *, claim_prefix)                                                                                      \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|      2|	PTR(char *, ca_bundle_path)                                                                                    \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  173|      2|	PTR(char *, logout_x_frame_options)                                                                            \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  174|      2|	INT(x_forwarded_headers)                                                                                       \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  175|      2|	INT(action_on_userinfo_error)                                                                                  \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  176|      2|	INT(trace_parent)                                                                                              \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      2|	PTR(char *, metrics_path)                                                                                      \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  178|      2|	INT(metrics_cache_storage_interval)                                                                            \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      2|	INT(metrics_cache_json_max)                                                                                    \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  180|      2|	INT(dpop_api_enabled)                                                                                          \
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  858|      2|#define OIDC_SVR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  181|      2|	/* directory that holds the provider & client metadata files */                                                \
  |  |  182|      2|	PTR(char *, metadata_dir)
  |  |  ------------------
  |  |  |  |  870|      2|	OIDC_SVR_CFG_SIMPLE_MEMBERS(OIDC_SVR_M_CREATE_PTR, OIDC_SVR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  857|      2|#define OIDC_SVR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  871|      2|	c->public_keys = NULL;
  872|      2|	c->private_keys = NULL;
  873|       |
  874|      2|	c->provider = oidc_cfg_provider_create(pool);
  875|      2|	c->oauth = oidc_cfg_oauth_create(pool);
  876|      2|	oidc_cfg_cache_create_server_config(c);
  877|       |
  878|      2|	c->http_timeout_long.request_timeout = OIDC_CONFIG_POS_INT_UNSET;
  ------------------
  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  ------------------
  879|      2|	c->http_timeout_long.connect_timeout = OIDC_DEFAULT_HTTP_CONNECT_TIMEOUT_LONG;
  ------------------
  |  |   90|      2|#define OIDC_DEFAULT_HTTP_CONNECT_TIMEOUT_LONG 10
  ------------------
  880|      2|	c->http_timeout_long.retries = OIDC_DEFAULT_HTTP_RETRIES_LONG;
  ------------------
  |  |   92|      2|#define OIDC_DEFAULT_HTTP_RETRIES_LONG 1
  ------------------
  881|      2|	c->http_timeout_long.retry_interval = OIDC_DEFAULT_HTTP_RETRY_INTERVAL_LONG;
  ------------------
  |  |   94|      2|#define OIDC_DEFAULT_HTTP_RETRY_INTERVAL_LONG 500
  ------------------
  882|      2|	c->http_timeout_short.request_timeout = OIDC_CONFIG_POS_INT_UNSET;
  ------------------
  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  ------------------
  883|      2|	c->http_timeout_short.connect_timeout = OIDC_DEFAULT_HTTP_CONNECT_TIMEOUT_SHORT;
  ------------------
  |  |   98|      2|#define OIDC_DEFAULT_HTTP_CONNECT_TIMEOUT_SHORT 2
  ------------------
  884|      2|	c->http_timeout_short.retries = OIDC_DEFAULT_HTTP_RETRIES_SHORT;
  ------------------
  |  |  100|      2|#define OIDC_DEFAULT_HTTP_RETRIES_SHORT 1
  ------------------
  885|      2|	c->http_timeout_short.retry_interval = OIDC_DEFAULT_HTTP_RETRY_INTERVAL_SHORT;
  ------------------
  |  |  102|      2|#define OIDC_DEFAULT_HTTP_RETRY_INTERVAL_SHORT 300
  ------------------
  886|       |
  887|      2|	c->remote_user_claim.claim_name = NULL;
  888|      2|	c->remote_user_claim.reg_exp = NULL;
  889|      2|	c->remote_user_claim.replace = NULL;
  890|       |
  891|      2|	c->outgoing_proxy.host_port = NULL;
  892|      2|	c->outgoing_proxy.username_password = NULL;
  893|      2|	c->outgoing_proxy.auth_type = OIDC_CONFIG_POS_INT_UNSET;
  ------------------
  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  ------------------
  894|       |
  895|      2|	c->crypto_passphrase.secret1 = NULL;
  896|      2|	c->crypto_passphrase.secret2 = NULL;
  897|      2|	c->crypto_passphrase.derived_key1_set = FALSE;
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  898|      2|	c->crypto_passphrase.derived_key2_set = FALSE;
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  899|       |
  900|      2|	c->info_hook_data = NULL;
  901|      2|	c->metrics_hook_data = NULL;
  902|       |
  903|      2|	c->black_listed_claims = NULL;
  904|      2|	c->white_listed_claims = NULL;
  905|      2|	c->filter_claims_expr = NULL;
  906|       |
  907|      2|	c->redirect_urls_allowed = NULL;
  908|      2|	c->discover_issuers_allowed = NULL;
  909|       |
  910|      2|	return c;
  911|      2|}
oidc_pre_config_init:
 1024|      2|void oidc_pre_config_init(void) {
 1025|      2|#if OPENSSL_API_COMPAT < 0x10100000L
 1026|      2|	ERR_load_crypto_strings();
 1027|      2|	OpenSSL_add_all_algorithms();
 1028|      2|	OpenSSL_add_all_digests();
 1029|       |#else
 1030|       |	OPENSSL_init_crypto(0, NULL);
 1031|       |#endif
 1032|      2|}
oidc_cfg_provider_get:
 1034|      6|oidc_provider_t *oidc_cfg_provider_get(oidc_cfg_t *cfg) {
 1035|      6|	return cfg->provider;
 1036|      6|}
oidc_cfg_post_config:
 1052|      2|int oidc_cfg_post_config(apr_pool_t *pool, oidc_cfg_t *cfg, server_rec *s) {
 1053|      2|	if (cfg->cache.impl == NULL)
  ------------------
  |  Branch (1053:6): [True: 0, False: 2]
  ------------------
 1054|      0|		cfg->cache.impl = &oidc_cache_shm;
 1055|      2|	if ((cfg->cache.impl->post_config != NULL) && (cfg->cache.impl->post_config(pool, s) != OK))
  ------------------
  |  |  456|      2|#define OK 0                    /**< Module has handled this stage. */
  ------------------
  |  Branch (1055:6): [True: 2, False: 0]
  |  Branch (1055:48): [True: 0, False: 2]
  ------------------
 1056|      0|		return HTTP_INTERNAL_SERVER_ERROR;
  ------------------
  |  |  535|      0|#define HTTP_INTERNAL_SERVER_ERROR           500
  ------------------
 1057|      2|	if (_oidc_refresh_mutex == NULL) {
  ------------------
  |  Branch (1057:6): [True: 2, False: 0]
  ------------------
 1058|       |		// NB: use the process pool here as the mutex is a process-wide singleton
 1059|      2|		_oidc_refresh_mutex = oidc_cache_mutex_create(s->process->pool, TRUE);
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
 1060|      2|		if (oidc_cache_mutex_post_config(s->process->pool, s, _oidc_refresh_mutex, "refresh") != TRUE)
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
  |  Branch (1060:7): [True: 0, False: 2]
  ------------------
 1061|      0|			return HTTP_INTERNAL_SERVER_ERROR;
  ------------------
  |  |  535|      0|#define HTTP_INTERNAL_SERVER_ERROR           500
  ------------------
 1062|      2|	}
 1063|      2|	if ((cfg->metrics_hook_data != NULL) && (oidc_metrics_post_config(pool, s) != TRUE))
  ------------------
  |  |   55|      0|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      0|#define FALSE 0
  |  |  ------------------
  ------------------
  |  Branch (1063:6): [True: 0, False: 2]
  |  Branch (1063:42): [True: 0, False: 0]
  ------------------
 1064|      0|		return HTTP_INTERNAL_SERVER_ERROR;
  ------------------
  |  |  535|      0|#define HTTP_INTERNAL_SERVER_ERROR           500
  ------------------
 1065|      2|	return OK;
  ------------------
  |  |  456|      2|#define OK 0                    /**< Module has handled this stage. */
  ------------------
 1066|      2|}
cfg.c:oidc_cfg_server_alloc:
  835|      2|static oidc_cfg_t *oidc_cfg_server_alloc(apr_pool_t *pool, server_rec *s) {
  836|      2|	oidc_cfg_t *c = apr_pcalloc(pool, sizeof(oidc_cfg_t));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  837|      2|	oidc_cfg_cleanup_ctx_t *ctx = apr_pcalloc(pool, sizeof(oidc_cfg_cleanup_ctx_t));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  838|      2|	ctx->cfg = c;
  839|       |	// pconf pool used at destruction time
  840|      2|	ctx->pool = pool;
  841|      2|	ctx->svr = s;
  842|       |	// register a cleanup handler on the config pool to handle graceful restarts without increasing
  843|       |	// memory consumption; this MUST be a *pre*-cleanup: libapr registers its own regular cleanups
  844|       |	// for the cache global mutex's POSIX semaphore and the shm segment on this same pool when they
  845|       |	// are created at post_config time, and regular cleanups run in reverse order of registration,
  846|       |	// so a regular registration here (which happens much earlier, at config-parse time) would run
  847|       |	// only AFTER libapr has already closed/unmapped those objects, making the mutex unlock/destroy
  848|       |	// in oidc_cache_shm_destroy() dereference an unmapped semaphore and segfault the parent process
  849|       |	// on a graceful restart; pre-cleanups are guaranteed to run before all regular cleanups
  850|      2|	apr_pool_pre_cleanup_register(pool, ctx, oidc_cfg_server_cleanup);
  851|      2|	return c;
  852|      2|}

oidc_cfg_state_input_headers_get:
  256|  3.49k|	type oidc_cfg_##member##_get(const oidc_cfg_t *cfg) {                                                          \
  257|  3.49k|		if (cfg->member == OIDC_CONFIG_POS_INT_UNSET)                                                          \
  ------------------
  |  |   57|  3.49k|#define OIDC_CONFIG_POS_INT_UNSET -1
  ------------------
  |  Branch (257:7): [True: 3.49k, False: 0]
  ------------------
  258|  3.49k|			return def_val;                                                                                \
  259|  3.49k|		return cfg->member;                                                                                    \
  260|  3.49k|	}
oidc_cfg_debug_mask_secrets_get:
  256|  3.49k|	type oidc_cfg_##member##_get(const oidc_cfg_t *cfg) {                                                          \
  257|  3.49k|		if (cfg->member == OIDC_CONFIG_POS_INT_UNSET)                                                          \
  ------------------
  |  |   57|  3.49k|#define OIDC_CONFIG_POS_INT_UNSET -1
  ------------------
  |  Branch (257:7): [True: 3.49k, False: 0]
  ------------------
  258|  3.49k|			return def_val;                                                                                \
  259|  3.49k|		return cfg->member;                                                                                    \
  260|  3.49k|	}

oidc_cfg_dir_post_config:
  611|      2|int oidc_cfg_dir_post_config(server_rec *s) {
  612|      2|	oidc_pass_user_info_as_t *p = NULL;
  613|      2|	if (pass_userinfo_as_default != NULL)
  ------------------
  |  Branch (613:6): [True: 0, False: 2]
  ------------------
  614|      0|		return OK;
  ------------------
  |  |  456|      0|#define OK 0                    /**< Module has handled this stage. */
  ------------------
  615|      2|	pass_userinfo_as_default = apr_array_make(s->process->pool, 3, sizeof(const oidc_pass_user_info_as_t *));
  616|      2|	if (oidc_cfg_dir_parse_pass_userinfo_as(s->process->pool, OIDC_DEFAULT_PASS_USERINFO_AS, &p) != NULL)
  ------------------
  |  |  602|      2|#define OIDC_DEFAULT_PASS_USERINFO_AS OIDC_PASS_USERINFO_AS_CLAIMS_STR
  |  |  ------------------
  |  |  |  |  136|      2|#define OIDC_PASS_USERINFO_AS_CLAIMS_STR "claims"
  |  |  ------------------
  ------------------
  |  Branch (616:6): [True: 0, False: 2]
  ------------------
  617|      0|		return HTTP_INTERNAL_SERVER_ERROR;
  ------------------
  |  |  535|      0|#define HTTP_INTERNAL_SERVER_ERROR           500
  ------------------
  618|      2|	APR_ARRAY_PUSH(pass_userinfo_as_default, const oidc_pass_user_info_as_t *) = p;
  ------------------
  |  |  150|      2|#define APR_ARRAY_PUSH(ary,type) (*((type *)apr_array_push(ary)))
  ------------------
  619|      2|	return OK;
  ------------------
  |  |  456|      2|#define OK 0                    /**< Module has handled this stage. */
  ------------------
  620|      2|}
oidc_cfg_dir_config_create:
  646|      2|void *oidc_cfg_dir_config_create(apr_pool_t *pool, char *path) {
  647|      2|	oidc_dir_cfg_t *c = apr_pcalloc(pool, sizeof(oidc_dir_cfg_t));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  ------------------
  |  |   60|      2|	PTR(char *, discover_url)                                                                                      \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      2|	PTR(char *, cookie_path)                                                                                       \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   62|      2|	PTR(char *, cookie)                                                                                            \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   63|      2|	PTR(char *, authn_header)                                                                                      \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   64|      2|	PTR(char *, unauthz_arg)                                                                                       \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   65|      2|	PTR(apr_array_header_t *, pass_cookies)                                                                        \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   66|      2|	PTR(apr_array_header_t *, strip_cookies)                                                                       \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   67|      2|	PTR(oidc_apr_expr_t *, path_auth_request_expr)                                                                 \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|      2|	PTR(oidc_apr_expr_t *, path_scope_expr)                                                                        \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   69|      2|	PTR(oidc_apr_expr_t *, unauth_expression)                                                                      \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   70|      2|	PTR(oidc_apr_expr_t *, userinfo_claims_expr)                                                                   \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   71|      2|	PTR(char *, state_cookie_prefix)                                                                               \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   72|      2|	PTR(apr_array_header_t *, pass_userinfo_as)                                                                    \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   87|      2|#define OIDC_DIR_M_CREATE_PTR(type, name) c->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   73|      2|	INT(unauth_action)                                                                                             \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   74|      2|	INT(unautz_action)                                                                                             \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   75|      2|	INT(pass_info_in)                                                                                              \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   76|      2|	INT(pass_info_encoding)                                                                                        \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   77|      2|	INT(oauth_accept_token_in)                                                                                     \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   78|      2|	INT(preserve_post)                                                                                             \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   79|      2|	INT(pass_access_token)                                                                                         \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   80|      2|	INT(pass_refresh_token)                                                                                        \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   81|      2|	INT(refresh_access_token_before_expiry)                                                                        \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   82|      2|	INT(action_on_error_refresh)                                                                                   \
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   83|      2|	INT(pass_idtoken_as)
  |  |  ------------------
  |  |  |  |  648|      2|	OIDC_DIR_CFG_SIMPLE_MEMBERS(OIDC_DIR_M_CREATE_PTR, OIDC_DIR_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   88|      2|#define OIDC_DIR_M_CREATE_INT(name) c->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  649|      2|	c->oauth_accept_token_options = apr_hash_make(pool);
  650|      2|	c->oauth_token_introspect_interval = OIDC_INTROSPECT_INTERVAL_UNSET;
  ------------------
  |  |   53|      2|#define OIDC_INTROSPECT_INTERVAL_UNSET -2
  ------------------
  651|      2|	return c;
  652|      2|}
dir.c:oidc_cfg_dir_parse_pass_userinfo_as:
  145|      2|						       oidc_pass_user_info_as_t **result) {
  146|      2|	const char *rv = NULL;
  147|       |	/* only read when the parse below succeeds and has written it; seeded so the optimizer does not
  148|       |	 * have to prove that across the call (-Wmaybe-uninitialized) */
  149|      2|	oidc_pass_userinfo_enum_t type = OIDC_PASS_USERINFO_AS_CLAIMS;
  150|      2|	static const oidc_cfg_option_t options[] = {
  151|      2|	    {OIDC_PASS_USERINFO_AS_CLAIMS, OIDC_PASS_USERINFO_AS_CLAIMS_STR},
  ------------------
  |  |  136|      2|#define OIDC_PASS_USERINFO_AS_CLAIMS_STR "claims"
  ------------------
  152|      2|	    {OIDC_PASS_USERINFO_AS_JSON_OBJECT, OIDC_PASS_USERINFO_AS_JSON_OBJECT_STR},
  ------------------
  |  |  137|      2|#define OIDC_PASS_USERINFO_AS_JSON_OBJECT_STR "json"
  ------------------
  153|      2|	    {OIDC_PASS_USERINFO_AS_JWT, OIDC_PASS_USERINFO_AS_JWT_STR},
  ------------------
  |  |  138|      2|#define OIDC_PASS_USERINFO_AS_JWT_STR "jwt"
  ------------------
  154|      2|	    {OIDC_PASS_USERINFO_AS_SIGNED_JWT, OIDC_PASS_USERINFO_AS_SIGNED_JWT_STR}};
  ------------------
  |  |  139|      2|#define OIDC_PASS_USERINFO_AS_SIGNED_JWT_STR "signed_jwt"
  ------------------
  155|       |
  156|       |	/* split "<type>:<name>" without writing into `v`: oidc_cfg_dir_post_config passes the default
  157|       |	 * as a string literal, so truncating it in place would write to read-only memory. Copying out
  158|       |	 * just the type also avoids duplicating the whole string when there is no separator at all. */
  159|      2|	const char *sep = _oidc_strstr(v, ":");
  160|      2|	const char *value = (sep != NULL) ? apr_pstrndup(pool, v, (apr_size_t)(sep - v)) : v;
  ------------------
  |  Branch (160:22): [True: 0, False: 2]
  ------------------
  161|      2|	const char *name = (sep != NULL) ? sep + 1 : NULL;
  ------------------
  |  Branch (161:21): [True: 0, False: 2]
  ------------------
  162|       |
  163|      2|	rv = oidc_cfg_parse_option(pool, options, OIDC_CFG_OPTIONS_SIZE(options), value, (int *)&type);
  ------------------
  |  |  152|      2|#define OIDC_CFG_OPTIONS_SIZE(options) ((int)(sizeof(options) / sizeof(oidc_cfg_option_t)))
  ------------------
  164|      2|	if (rv != NULL)
  ------------------
  |  Branch (164:6): [True: 0, False: 2]
  ------------------
  165|      0|		return rv;
  166|       |
  167|      2|	*result = apr_pcalloc(pool, sizeof(oidc_pass_user_info_as_t));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  168|      2|	(*result)->type = type;
  169|      2|	if (name)
  ------------------
  |  Branch (169:6): [True: 0, False: 2]
  ------------------
  170|      0|		(*result)->name = apr_pstrdup(pool, name);
  171|       |
  172|       |	return NULL;
  173|      2|}

oidc_cfg_oauth_create:
  378|      2|oidc_oauth_t *oidc_cfg_oauth_create(apr_pool_t *pool) {
  379|      2|	oidc_oauth_t *o = apr_pcalloc(pool, sizeof(oidc_oauth_t));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  ------------------
  |  |   54|      2|	PTR(char *, metadata_url)                                                                                      \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   55|      2|	PTR(char *, verify_jwks_uri)                                                                                   \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   56|      2|	PTR(apr_array_header_t *, verify_aud_values)                                                                   \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   57|      2|	PTR(char *, verify_issuer)                                                                                     \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|      2|	PTR(apr_hash_t *, verify_shared_keys)                                                                          \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   59|      2|	PTR(apr_hash_t *, decrypt_shared_keys)                                                                         \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|      2|	PTR(char *, client_id)                                                                                         \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      2|	PTR(char *, client_secret)                                                                                     \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   62|      2|	PTR(char *, introspection_endpoint_url)                                                                        \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   63|      2|	INT(introspection_endpoint_method)                                                                             \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   77|      2|#define OIDC_OAUTH_M_CREATE_INT(name) o->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   64|      2|	PTR(char *, introspection_token_param_name)                                                                    \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   65|      2|	PTR(char *, introspection_endpoint_params)                                                                     \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   66|      2|	PTR(char *, introspection_endpoint_auth)                                                                       \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   67|      2|	PTR(char *, introspection_endpoint_auth_alg)                                                                   \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|      2|	PTR(const char *, introspection_client_auth_bearer_token)                                                      \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   69|      2|	PTR(char *, introspection_endpoint_tls_client_key)                                                             \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   70|      2|	PTR(char *, introspection_endpoint_tls_client_key_pwd)                                                         \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   71|      2|	PTR(char *, introspection_endpoint_tls_client_cert)                                                            \
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   76|      2|#define OIDC_OAUTH_M_CREATE_PTR(type, name) o->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   72|      2|	INT(ssl_validate_server)
  |  |  ------------------
  |  |  |  |  380|      2|	OIDC_OAUTH_CFG_SIMPLE_MEMBERS(OIDC_OAUTH_M_CREATE_PTR, OIDC_OAUTH_M_CREATE_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |   77|      2|#define OIDC_OAUTH_M_CREATE_INT(name) o->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  381|      2|	o->verify_public_keys = NULL;
  382|      2|	o->introspection_token_expiry_claim_name = NULL;
  383|      2|	o->introspection_token_expiry_claim_format = OIDC_TOKEN_EXPIRY_CLAIM_FORMAT_RELATIVE;
  384|      2|	o->introspection_token_expiry_claim_required = OIDC_TOKEN_EXPIRY_CLAIM_REQUIRED_MANDATORY;
  385|      2|	o->remote_user_claim.claim_name = NULL;
  386|      2|	o->remote_user_claim.reg_exp = NULL;
  387|       |	o->remote_user_claim.replace = NULL;
  388|      2|	return o;
  389|      2|}

oidc_cfg_parse_option:
  125|      2|char *oidc_cfg_parse_option(apr_pool_t *pool, const oidc_cfg_option_t options[], int n, const char *arg, int *v) {
  126|      2|	return oidc_cfg_parse_option_impl(pool, options, n, arg, v, _oidc_strcmp);
  127|      2|}
oidc_cfg_parse_is_valid_url:
  298|  1.74k|const char *oidc_cfg_parse_is_valid_url(apr_pool_t *pool, const char *arg, const char *scheme) {
  299|       |	return oidc_cfg_parse_is_valid_url_scheme(pool, arg, scheme, NULL);
  300|  1.74k|}
oidc_cfg_parse_is_valid_http_url:
  305|  1.75k|const char *oidc_cfg_parse_is_valid_http_url(apr_pool_t *pool, const char *arg) {
  306|  1.75k|	return oidc_cfg_parse_is_valid_url_scheme(pool, arg, "https", "http");
  307|  1.75k|}
parse.c:oidc_cfg_parse_option_impl:
  110|      2|					int *v, int (*fstrcmp)(const char *, const char *)) {
  111|      2|	int i = 0;
  112|      2|	while ((i < n) && (fstrcmp(arg, options[i].str) != 0))
  ------------------
  |  Branch (112:9): [True: 2, False: 0]
  |  Branch (112:20): [True: 0, False: 2]
  ------------------
  113|      0|		i++;
  114|      2|	if (i < n) {
  ------------------
  |  Branch (114:6): [True: 2, False: 0]
  ------------------
  115|      2|		*v = options[i].val;
  116|      2|		return NULL;
  117|      2|	}
  118|      0|	return apr_psprintf(pool, "invalid value %s%s%s, must be one of %s", OIDC_LIST_OPTIONS_QUOTE, arg,
  ------------------
  |  |   56|      0|#define OIDC_LIST_OPTIONS_QUOTE "'"
  ------------------
  119|      0|			    OIDC_LIST_OPTIONS_QUOTE, oidc_cfg_parse_options_flatten(pool, options, n));
  ------------------
  |  |   56|      0|#define OIDC_LIST_OPTIONS_QUOTE "'"
  ------------------
  120|      2|}
parse.c:oidc_cfg_parse_is_valid_url_scheme:
  265|  3.49k|						      const char *scheme2) {
  266|       |
  267|  3.49k|	apr_uri_t uri;
  268|       |
  269|  3.49k|	if (arg == NULL)
  ------------------
  |  Branch (269:6): [True: 0, False: 3.49k]
  ------------------
  270|      0|		return apr_psprintf(pool, "input cannot be empty");
  271|       |
  272|  3.49k|	if (apr_uri_parse(pool, arg, &uri) != APR_SUCCESS)
  ------------------
  |  |  225|  3.49k|#define APR_SUCCESS 0
  ------------------
  |  Branch (272:6): [True: 384, False: 3.11k]
  ------------------
  273|    384|		return apr_psprintf(pool, "'%s' cannot be parsed as a URL", arg);
  274|       |
  275|  3.11k|	if (uri.scheme == NULL)
  ------------------
  |  Branch (275:6): [True: 2.61k, False: 504]
  ------------------
  276|  2.61k|		return apr_psprintf(pool, "'%s' cannot be parsed as a URL (no scheme set)", arg);
  277|       |
  278|    504|	if ((scheme1 != NULL) && (_oidc_strnatcasecmp(uri.scheme, scheme1) != 0)) {
  ------------------
  |  Branch (278:6): [True: 504, False: 0]
  |  Branch (278:27): [True: 148, False: 356]
  ------------------
  279|    148|		if ((scheme2 != NULL) && (_oidc_strnatcasecmp(uri.scheme, scheme2) != 0)) {
  ------------------
  |  Branch (279:7): [True: 74, False: 74]
  |  Branch (279:28): [True: 71, False: 3]
  ------------------
  280|     71|			return apr_psprintf(pool, "'%s' cannot be parsed as a \"%s\" or \"%s\" URL (scheme == %s)!",
  281|     71|					    arg, scheme1, scheme2, uri.scheme);
  282|     77|		} else if (scheme2 == NULL) {
  ------------------
  |  Branch (282:14): [True: 74, False: 3]
  ------------------
  283|     74|			return apr_psprintf(pool, "'%s' cannot be parsed as a \"%s\" URL (scheme == %s)!", arg, scheme1,
  284|     74|					    uri.scheme);
  285|     74|		}
  286|    148|	}
  287|       |
  288|    359|	if (uri.hostname == NULL)
  ------------------
  |  Branch (288:6): [True: 71, False: 288]
  ------------------
  289|     71|		return apr_psprintf(pool, "'%s' cannot be parsed as a valid URL (no hostname set, check your slashes)",
  290|     71|				    arg);
  291|       |
  292|    288|	return NULL;
  293|    359|}

oidc_cfg_provider_authorization_endpoint_url_valid:
  188|      2|	const char *oidc_cfg_provider_##member##_valid(apr_pool_t *pool, const char *arg) {                            \
  189|      2|		return fvalid(pool, arg);                                                                              \
  190|      2|	}                                                                                                              \
oidc_cfg_provider_create:
  791|      2|oidc_provider_t *oidc_cfg_provider_create(apr_pool_t *pool) {
  792|      2|	oidc_provider_t *provider = apr_pcalloc(pool, sizeof(oidc_provider_t));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  793|      2|	oidc_cfg_provider_init(provider);
  794|      2|	return provider;
  795|      2|}
provider.c:oidc_cfg_provider_init:
  764|      2|static void oidc_cfg_provider_init(oidc_provider_t *provider) {
  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  ------------------
  |  |   53|      2|	PTR(char *, metadata_url)                                                                                      \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   54|      2|	PTR(char *, issuer)                                                                                            \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   55|      2|	PTR(char *, authorization_endpoint_url)                                                                        \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   56|      2|	PTR(char *, token_endpoint_url)                                                                                \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   57|      2|	PTR(char *, token_endpoint_auth)                                                                               \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|      2|	PTR(char *, token_endpoint_auth_alg)                                                                           \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   59|      2|	PTR(char *, token_endpoint_params)                                                                             \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|      2|	PTR(char *, userinfo_endpoint_url)                                                                             \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      2|	PTR(char *, revocation_endpoint_url)                                                                           \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   62|      2|	PTR(char *, registration_endpoint_url)                                                                         \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   63|      2|	PTR(char *, pushed_authorization_request_endpoint_url)                                                         \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   64|      2|	PTR(char *, check_session_iframe)                                                                              \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   65|      2|	PTR(char *, end_session_endpoint)                                                                              \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   66|      2|	PTR(char *, client_id)                                                                                         \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   67|      2|	PTR(char *, client_secret)                                                                                     \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|      2|	PTR(char *, token_endpoint_tls_client_key)                                                                     \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   69|      2|	PTR(char *, token_endpoint_tls_client_key_pwd)                                                                 \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   70|      2|	PTR(char *, token_endpoint_tls_client_cert)                                                                    \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   71|      2|	PTR(char *, client_name)                                                                                       \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   72|      2|	PTR(char *, client_contact)                                                                                    \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   73|      2|	PTR(char *, registration_token)                                                                                \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   74|      2|	PTR(char *, registration_endpoint_json)                                                                        \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   75|      2|	PTR(char *, scope)                                                                                             \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   76|      2|	PTR(char *, response_type)                                                                                     \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   77|      2|	PTR(char *, response_mode)                                                                                     \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   78|      2|	PTR(char *, auth_request_params)                                                                               \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   79|      2|	PTR(char *, logout_request_params)                                                                             \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   80|      2|	PTR(char *, client_jwks_uri)                                                                                   \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   81|      2|	PTR(char *, id_token_signed_response_alg)                                                                      \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   82|      2|	PTR(char *, id_token_encrypted_response_alg)                                                                   \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   83|      2|	PTR(char *, id_token_encrypted_response_enc)                                                                   \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   84|      2|	PTR(char *, userinfo_signed_response_alg)                                                                      \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   85|      2|	PTR(char *, userinfo_encrypted_response_alg)                                                                   \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   86|      2|	PTR(char *, userinfo_encrypted_response_enc)                                                                   \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   87|      2|	PTR(char *, request_object)                                                                                    \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   88|      2|	PTR(oidc_proto_pkce_t *, pkce)                                                                                 \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   89|      2|	PTR(apr_array_header_t *, id_token_aud_values)                                                                 \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  105|      2|#define OIDC_PROVIDER_M_INIT_PTR(type, name) provider->name = NULL;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   90|      2|	INT(int, backchannel_logout_supported)                                                                         \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   91|      2|	INT(int, ssl_validate_server)                                                                                  \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   92|      2|	INT(int, validate_issuer)                                                                                      \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   93|      2|	INT(int, idtoken_iat_slack)                                                                                    \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   94|      2|	INT(int, session_max_duration)                                                                                 \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   95|      2|	INT(oidc_dpop_mode_t, dpop_mode)                                                                               \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|      2|	INT(oidc_cert_bound_tokens_t, cert_bound_tokens)                                                               \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   97|      2|	INT(int, dpop_supported)                                                                                       \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   98|      2|	INT(int, userinfo_refresh_interval)                                                                            \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   99|      2|	INT(oidc_userinfo_token_method_t, userinfo_token_method)                                                       \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  100|      2|	INT(oidc_auth_request_method_t, auth_request_method)                                                           \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  101|      2|	INT(oidc_profile_t, profile)                                                                                   \
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  102|      2|	INT(int, response_require_iss)
  |  |  ------------------
  |  |  |  |  765|      2|	OIDC_PROVIDER_CFG_SIMPLE_MEMBERS(OIDC_PROVIDER_M_INIT_PTR, OIDC_PROVIDER_M_INIT_INT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  106|      2|#define OIDC_PROVIDER_M_INIT_INT(type, name) provider->name = OIDC_CONFIG_POS_INT_UNSET;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  766|      2|	provider->jwks_uri.uri = NULL;
  767|      2|	provider->jwks_uri.refresh_interval = OIDC_CONFIG_POS_INT_UNSET;
  ------------------
  |  |   57|      2|#define OIDC_CONFIG_POS_INT_UNSET -1
  ------------------
  768|      2|	provider->jwks_uri.signed_uri = NULL;
  769|      2|	provider->jwks_uri.jwk_list = NULL;
  770|      2|	provider->verify_public_keys = NULL;
  771|       |	provider->client_keys = NULL;
  772|      2|}

util.c:_oidc_strlen:
   90|  24.4k|static inline size_t _oidc_strlen(const char *s) {
   91|  24.4k|	return (s ? strlen(s) : 0);
  ------------------
  |  Branch (91:10): [True: 24.4k, False: 0]
  ------------------
   92|  24.4k|}
util.c:_oidc_strcmp:
   98|  3.49k|static inline int _oidc_strcmp(const char *a, const char *b) {
   99|  3.49k|	return ((a && b) ? strcmp(a, b) : -1);
  ------------------
  |  Branch (99:11): [True: 3.49k, False: 0]
  |  Branch (99:16): [True: 3.49k, False: 0]
  ------------------
  100|  3.49k|}
util.c:_oidc_strnatcasecmp:
  101|  4.06k|static inline int _oidc_strnatcasecmp(const char *a, const char *b) {
  102|  4.06k|	return ((a && b) ? apr_strnatcasecmp(a, b) : -1);
  ------------------
  |  Branch (102:11): [True: 4.06k, False: 0]
  |  Branch (102:16): [True: 4.06k, False: 0]
  ------------------
  103|  4.06k|}
util.c:_oidc_strncmp:
  104|    139|static inline int _oidc_strncmp(const char *a, const char *b, size_t n) {
  105|    139|	return ((a && b) ? strncmp(a, b, n) : -1);
  ------------------
  |  Branch (105:11): [True: 139, False: 0]
  |  Branch (105:16): [True: 139, False: 0]
  ------------------
  106|    139|}
state.c:_oidc_strlen:
   90|  1.74k|static inline size_t _oidc_strlen(const char *s) {
   91|  1.74k|	return (s ? strlen(s) : 0);
  ------------------
  |  Branch (91:10): [True: 1.74k, False: 0]
  ------------------
   92|  1.74k|}
dir.c:_oidc_strstr:
  107|      2|static inline char *_oidc_strstr(const char *a, const char *b) {
  108|      2|	return ((a && b) ? (char *)strstr(a, b) : NULL);
  ------------------
  |  Branch (108:11): [True: 2, False: 0]
  |  Branch (108:16): [True: 2, False: 0]
  ------------------
  109|      2|}
parse.c:_oidc_strcmp:
   98|      2|static inline int _oidc_strcmp(const char *a, const char *b) {
   99|      2|	return ((a && b) ? strcmp(a, b) : -1);
  ------------------
  |  Branch (99:11): [True: 2, False: 0]
  |  Branch (99:16): [True: 2, False: 0]
  ------------------
  100|      2|}
parse.c:_oidc_strnatcasecmp:
  101|    578|static inline int _oidc_strnatcasecmp(const char *a, const char *b) {
  102|    578|	return ((a && b) ? apr_strnatcasecmp(a, b) : -1);
  ------------------
  |  Branch (102:11): [True: 578, False: 0]
  |  Branch (102:16): [True: 578, False: 0]
  ------------------
  103|    578|}
jwt.c:_oidc_strstr:
  107|  3.49k|static inline char *_oidc_strstr(const char *a, const char *b) {
  108|  3.49k|	return ((a && b) ? (char *)strstr(a, b) : NULL);
  ------------------
  |  Branch (108:11): [True: 3.49k, False: 0]
  |  Branch (108:16): [True: 3.49k, False: 0]
  ------------------
  109|  3.49k|}
jwt.c:_oidc_strlen:
   90|  1.99k|static inline size_t _oidc_strlen(const char *s) {
   91|  1.99k|	return (s ? strlen(s) : 0);
  ------------------
  |  Branch (91:10): [True: 1.99k, False: 0]
  ------------------
   92|  1.99k|}
base64.c:_oidc_strlen:
   90|    996|static inline size_t _oidc_strlen(const char *s) {
   91|    996|	return (s ? strlen(s) : 0);
  ------------------
  |  Branch (91:10): [True: 996, False: 0]
  ------------------
   92|    996|}
html.c:_oidc_strlen:
   90|  16.4M|static inline size_t _oidc_strlen(const char *s) {
   91|  16.4M|	return (s ? strlen(s) : 0);
  ------------------
  |  Branch (91:10): [True: 16.4M, False: 0]
  ------------------
   92|  16.4M|}
key.c:_oidc_strlen:
   90|      4|static inline size_t _oidc_strlen(const char *s) {
   91|      4|	return (s ? strlen(s) : 0);
  ------------------
  |  Branch (91:10): [True: 4, False: 0]
  ------------------
   92|      4|}
http.c:_oidc_strlen:
   90|  3.13M|static inline size_t _oidc_strlen(const char *s) {
   91|  3.13M|	return (s ? strlen(s) : 0);
  ------------------
  |  Branch (91:10): [True: 3.13M, False: 0]
  ------------------
   92|  3.13M|}
http.c:_oidc_strstr:
  107|  21.3k|static inline char *_oidc_strstr(const char *a, const char *b) {
  108|  21.3k|	return ((a && b) ? (char *)strstr(a, b) : NULL);
  ------------------
  |  Branch (108:11): [True: 21.3k, False: 0]
  |  Branch (108:16): [True: 21.3k, False: 0]
  ------------------
  109|  21.3k|}
http.c:_oidc_strcmp:
   98|  13.9k|static inline int _oidc_strcmp(const char *a, const char *b) {
   99|  13.9k|	return ((a && b) ? strcmp(a, b) : -1);
  ------------------
  |  Branch (99:11): [True: 13.9k, False: 0]
  |  Branch (99:16): [True: 13.9k, False: 0]
  ------------------
  100|  13.9k|}
http.c:_oidc_strncmp:
  104|  3.01M|static inline int _oidc_strncmp(const char *a, const char *b, size_t n) {
  105|  3.01M|	return ((a && b) ? strncmp(a, b, n) : -1);
  ------------------
  |  Branch (105:11): [True: 3.01M, False: 0]
  |  Branch (105:16): [True: 3.01M, False: 0]
  ------------------
  106|  3.01M|}

oidc_http_url_encode:
   72|  3.49k|char *oidc_http_url_encode(const request_rec *r, const char *str) {
   73|  3.49k|	static const char hex[] = "0123456789ABCDEF";
   74|  3.49k|	char *rv = NULL;
   75|  3.49k|	char *p = NULL;
   76|  3.49k|	size_t len = 0;
   77|       |
   78|  3.49k|	if (str == NULL)
  ------------------
  |  Branch (78:6): [True: 0, False: 3.49k]
  ------------------
   79|      0|		return "";
   80|       |
   81|  3.49k|	len = _oidc_strlen(str);
   82|       |
   83|       |	/* worst case each input byte expands to a 3-byte %XX sequence */
   84|  3.49k|	rv = apr_palloc(r->pool, len * 3 + 1);
   85|  3.49k|	p = rv;
   86|  56.5M|	for (size_t i = 0; i < len; i++) {
  ------------------
  |  Branch (86:21): [True: 56.5M, False: 3.49k]
  ------------------
   87|  56.5M|		const unsigned char c = (unsigned char)str[i];
   88|  56.5M|		if (((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')) || ((c >= '0') && (c <= '9')) ||
  ------------------
  |  Branch (88:8): [True: 24.0M, False: 32.5M]
  |  Branch (88:22): [True: 10.7M, False: 13.3M]
  |  Branch (88:38): [True: 13.1M, False: 32.6M]
  |  Branch (88:52): [True: 6.22M, False: 6.92M]
  |  Branch (88:68): [True: 20.7M, False: 18.8M]
  |  Branch (88:82): [True: 13.2M, False: 7.48M]
  ------------------
   89|  30.3M|		    (c == '-') || (c == '.') || (c == '_') || (c == '~')) {
  ------------------
  |  Branch (89:7): [True: 62.8k, False: 26.2M]
  |  Branch (89:21): [True: 67.2k, False: 26.2M]
  |  Branch (89:35): [True: 40.5k, False: 26.1M]
  |  Branch (89:49): [True: 3.14k, False: 26.1M]
  ------------------
   90|  30.3M|			*p++ = (char)c;
   91|  30.3M|		} else {
   92|  26.1M|			*p++ = '%';
   93|  26.1M|			*p++ = hex[c >> 4];
   94|  26.1M|			*p++ = hex[c & 0x0f];
   95|  26.1M|		}
   96|  56.5M|	}
   97|  3.49k|	*p = '\0';
   98|       |
   99|  3.49k|	return rv;
  100|  3.49k|}
oidc_http_url_decode:
  117|  3.49k|char *oidc_http_url_decode(const request_rec *r, const char *str) {
  118|  3.49k|	char *rv = NULL;
  119|  3.49k|	char *p = NULL;
  120|  3.49k|	size_t i = 0;
  121|  3.49k|	size_t len = 0;
  122|       |
  123|  3.49k|	if (str == NULL)
  ------------------
  |  Branch (123:6): [True: 0, False: 3.49k]
  ------------------
  124|      0|		return "";
  125|       |
  126|  3.49k|	len = _oidc_strlen(str);
  127|       |
  128|  3.49k|	rv = apr_palloc(r->pool, len + 1);
  129|  3.49k|	p = rv;
  130|  56.5M|	while (i < len) {
  ------------------
  |  Branch (130:9): [True: 56.5M, False: 3.49k]
  ------------------
  131|  56.5M|		const char c = str[i];
  132|  56.5M|		if (c == '+') {
  ------------------
  |  Branch (132:7): [True: 27.6k, False: 56.5M]
  ------------------
  133|  27.6k|			*p++ = ' ';
  134|  27.6k|			i++;
  135|  56.5M|		} else if (c == '%') {
  ------------------
  |  Branch (135:14): [True: 13.2M, False: 43.3M]
  ------------------
  136|       |			/* str[i + 1] is within bounds (at worst the NUL terminator); str[i + 2] is only
  137|       |			 * read when str[i + 1] is a hex digit and thus not the terminator */
  138|  13.2M|			const int hi = oidc_http_url_decode_hex_digit(str[i + 1]);
  139|  13.2M|			const int lo = (hi >= 0) ? oidc_http_url_decode_hex_digit(str[i + 2]) : -1;
  ------------------
  |  Branch (139:19): [True: 13.1M, False: 61.0k]
  ------------------
  140|  13.2M|			if (lo >= 0) {
  ------------------
  |  Branch (140:8): [True: 13.0M, False: 109k]
  ------------------
  141|  13.0M|				*p++ = (char)((hi << 4) | lo);
  142|  13.0M|				i += 3;
  143|  13.0M|			} else {
  144|   109k|				*p++ = c;
  145|   109k|				i++;
  146|   109k|			}
  147|  43.3M|		} else {
  148|  43.3M|			*p++ = c;
  149|  43.3M|			i++;
  150|  43.3M|		}
  151|  56.5M|	}
  152|  3.49k|	*p = '\0';
  153|       |
  154|  3.49k|	return rv;
  155|  3.49k|}
oidc_http_hdr_in_user_agent_get:
  300|  1.74k|const char *oidc_http_hdr_in_user_agent_get(const request_rec *r) {
  301|  1.74k|	return oidc_http_hdr_in_get(r, OIDC_HTTP_HDR_USER_AGENT);
  ------------------
  |  |   68|  1.74k|#define OIDC_HTTP_HDR_USER_AGENT "User-Agent"
  ------------------
  302|  1.74k|}
oidc_http_hdr_in_accept_contains:
  356|  1.74k|apr_byte_t oidc_http_hdr_in_accept_contains(const request_rec *r, const char *needle) {
  357|  1.74k|	return oidc_http_hdr_in_contains(r, OIDC_HTTP_HDR_ACCEPT, OIDC_STR_COMMA, OIDC_CHAR_SEMI_COLON, needle);
  ------------------
  |  |   75|  1.74k|#define OIDC_HTTP_HDR_ACCEPT "Accept"
  ------------------
              	return oidc_http_hdr_in_contains(r, OIDC_HTTP_HDR_ACCEPT, OIDC_STR_COMMA, OIDC_CHAR_SEMI_COLON, needle);
  ------------------
  |  |  209|  1.74k|#define OIDC_STR_COMMA ","
  ------------------
              	return oidc_http_hdr_in_contains(r, OIDC_HTTP_HDR_ACCEPT, OIDC_STR_COMMA, OIDC_CHAR_SEMI_COLON, needle);
  ------------------
  |  |  198|  1.74k|#define OIDC_CHAR_SEMI_COLON ';'
  ------------------
  358|  1.74k|}
oidc_http_hdr_normalize_name:
  450|  1.74k|char *oidc_http_hdr_normalize_name(const request_rec *r, const char *str) {
  451|       |	/* token = 1*<any CHAR except CTLs or separators>
  452|       |	 * CTL = <any US-ASCII control character
  453|       |	 *          (octets 0 - 31) and DEL (127)>
  454|       |	 * separators = "(" | ")" | "<" | ">" | "@"
  455|       |	 *              | "," | ";" | ":" | "\" | <">
  456|       |	 *              | "/" | "[" | "]" | "?" | "="
  457|       |	 *              | "{" | "}" | SP | HT */
  458|  1.74k|	const char *separators = "()<>@,;:\\\"/[]?={} \t";
  459|       |
  460|  1.74k|	char *ns = apr_pstrdup(r->pool, str);
  461|  1.74k|	const size_t len = _oidc_strlen(ns);
  462|  28.2M|	for (size_t i = 0; i < len; i++) {
  ------------------
  |  Branch (462:21): [True: 28.2M, False: 1.74k]
  ------------------
  463|  28.2M|		if (ns[i] < 32 || ns[i] == 127)
  ------------------
  |  Branch (463:7): [True: 2.29M, False: 25.9M]
  |  Branch (463:21): [True: 1.57M, False: 24.4M]
  ------------------
  464|  3.87M|			ns[i] = '-';
  465|  24.4M|		else if (strchr(separators, ns[i]) != NULL)
  ------------------
  |  Branch (465:12): [True: 5.84M, False: 18.5M]
  ------------------
  466|  5.84M|			ns[i] = '-';
  467|  28.2M|	}
  468|  1.74k|	return ns;
  469|  1.74k|}
oidc_http_param_is_sensitive:
  580|  1.74k|apr_byte_t oidc_http_param_is_sensitive(const char *key) {
  581|  15.7k|	for (int i = 0; _oidc_http_sensitive_params[i] != NULL; i++)
  ------------------
  |  Branch (581:18): [True: 13.9k, False: 1.74k]
  ------------------
  582|  13.9k|		if (_oidc_strcmp(key, _oidc_http_sensitive_params[i]) == 0)
  ------------------
  |  Branch (582:7): [True: 5, False: 13.9k]
  ------------------
  583|      5|			return TRUE;
  ------------------
  |  |   55|      5|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      5|#define FALSE 0
  |  |  ------------------
  ------------------
  584|  1.74k|	return FALSE;
  ------------------
  |  |   51|  1.74k|#define FALSE 0
  ------------------
  585|  1.74k|}
oidc_http_redact_body_for_log:
  604|  1.74k|const char *oidc_http_redact_body_for_log(request_rec *r, const char *data) {
  605|  1.74k|	size_t n_params = 1;
  606|       |
  607|  1.74k|	if (data == NULL)
  ------------------
  |  Branch (607:6): [True: 0, False: 1.74k]
  ------------------
  608|      0|		return NULL;
  609|       |	/* OIDCDebugMaskSecrets Off, or no request pool to build the redacted copy in */
  610|  1.74k|	if ((r == NULL) || (oidc_util_log_mask_secrets(r) == FALSE))
  ------------------
  |  |   51|  1.74k|#define FALSE 0
  ------------------
  |  Branch (610:6): [True: 0, False: 1.74k]
  |  Branch (610:21): [True: 0, False: 1.74k]
  ------------------
  611|      0|		return data;
  612|  1.74k|	apr_pool_t *pool = r->pool;
  613|       |
  614|       |	/*
  615|       |	 * one pass over the "&"-separated parameters into a single buffer: rewriting the whole
  616|       |	 * string with an apr_psprintf() per redacted value made the work quadratic in the number
  617|       |	 * of sensitive parameters, which a request-sized body turned into an OOM (OSS-Fuzz
  618|       |	 * 554483423); a redacted value only ever grows to the 3 bytes of "***", so the result fits
  619|       |	 * in the input length plus 3 bytes per parameter
  620|       |	 */
  621|  28.2M|	for (const char *c = data; *c != '\0'; c++)
  ------------------
  |  Branch (621:29): [True: 28.2M, False: 1.74k]
  ------------------
  622|  28.2M|		if (*c == OIDC_CHAR_AMP)
  ------------------
  |  |  197|  28.2M|#define OIDC_CHAR_AMP '&'
  ------------------
  |  Branch (622:7): [True: 3.16M, False: 25.1M]
  ------------------
  623|  3.16M|			n_params++;
  624|  1.74k|	char *result = apr_palloc(pool, _oidc_strlen(data) + (3 * n_params) + 1);
  625|  1.74k|	char *out = result;
  626|  1.74k|	const char *param = data;
  627|       |
  628|  3.16M|	for (;;) {
  629|  3.16M|		const char *param_end = strchr(param, OIDC_CHAR_AMP);
  ------------------
  |  |  197|  3.16M|#define OIDC_CHAR_AMP '&'
  ------------------
  630|  3.16M|		const size_t param_len = (param_end != NULL) ? (size_t)(param_end - param) : _oidc_strlen(param);
  ------------------
  |  Branch (630:28): [True: 3.16M, False: 1.74k]
  ------------------
  631|  3.16M|		const char *eq = memchr(param, OIDC_CHAR_EQUAL, param_len);
  ------------------
  |  |  187|  3.16M|#define OIDC_CHAR_EQUAL '='
  ------------------
  632|       |		/* only a "<name>=" at the parameter boundary is redacted, so that e.g. "xcode=" is not taken for
  633|       |		 * "code=" */
  634|  3.16M|		const apr_byte_t redact =
  635|  3.16M|		    ((eq != NULL) && (oidc_http_param_name_is_sensitive(param, (size_t)(eq - param)) == TRUE)) ? TRUE
  ------------------
  |  |   55|  10.4k|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|  10.4k|#define FALSE 0
  |  |  ------------------
  ------------------
              		    ((eq != NULL) && (oidc_http_param_name_is_sensitive(param, (size_t)(eq - param)) == TRUE)) ? TRUE
  ------------------
  |  |   55|    755|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|    755|#define FALSE 0
  |  |  ------------------
  ------------------
  |  Branch (635:8): [True: 10.4k, False: 3.15M]
  |  Branch (635:24): [True: 755, False: 9.68k]
  ------------------
  636|  3.16M|													       : FALSE;
  ------------------
  |  |   51|  6.33M|#define FALSE 0
  ------------------
  637|       |		/* everything up to and including the "<name>=" is kept */
  638|  3.16M|		const size_t keep = (redact == TRUE) ? (size_t)(eq - param) + 1 : param_len;
  ------------------
  |  |   55|  3.16M|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|  3.16M|#define FALSE 0
  |  |  ------------------
  ------------------
  |  Branch (638:23): [True: 755, False: 3.16M]
  ------------------
  639|       |
  640|  3.16M|		_oidc_memcpy(out, param, keep);
  ------------------
  |  |   85|  3.16M|#define _oidc_memcpy(__dst, __src, __n) memcpy(__dst, __src, __n)
  ------------------
  641|  3.16M|		out += keep;
  642|  3.16M|		if (redact == TRUE) {
  ------------------
  |  |   55|  3.16M|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|  3.16M|#define FALSE 0
  |  |  ------------------
  ------------------
  |  Branch (642:7): [True: 755, False: 3.16M]
  ------------------
  643|    755|			_oidc_memcpy(out, "***", 3);
  ------------------
  |  |   85|    755|#define _oidc_memcpy(__dst, __src, __n) memcpy(__dst, __src, __n)
  ------------------
  644|    755|			out += 3;
  645|    755|		}
  646|  3.16M|		if (param_end == NULL)
  ------------------
  |  Branch (646:7): [True: 1.74k, False: 3.16M]
  ------------------
  647|  1.74k|			break;
  648|  3.16M|		*out = OIDC_CHAR_AMP;
  ------------------
  |  |  197|  3.16M|#define OIDC_CHAR_AMP '&'
  ------------------
  649|  3.16M|		out++;
  650|  3.16M|		param = param_end + 1;
  651|  3.16M|	}
  652|  1.74k|	*out = '\0';
  653|       |
  654|  1.74k|	return result;
  655|  1.74k|}
oidc_http_redact_json_for_log:
  726|  1.74k|const char *oidc_http_redact_json_for_log(request_rec *r, const char *data) {
  727|  1.74k|	const char *result = NULL;
  728|       |
  729|  1.74k|	if (data == NULL)
  ------------------
  |  Branch (729:6): [True: 0, False: 1.74k]
  ------------------
  730|      0|		return NULL;
  731|       |	/* OIDCDebugMaskSecrets Off, or no request pool to build the redacted copy in */
  732|  1.74k|	if ((r == NULL) || (oidc_util_log_mask_secrets(r) == FALSE))
  ------------------
  |  |   51|  1.74k|#define FALSE 0
  ------------------
  |  Branch (732:6): [True: 0, False: 1.74k]
  |  Branch (732:21): [True: 0, False: 1.74k]
  ------------------
  733|      0|		return data;
  734|  1.74k|	apr_pool_t *pool = r->pool;
  735|       |
  736|  1.74k|	result = data;
  737|  10.4k|	for (int i = 0; _oidc_http_sensitive_json_members[i] != NULL; i++)
  ------------------
  |  Branch (737:18): [True: 8.74k, False: 1.74k]
  ------------------
  738|  8.74k|		result = oidc_http_redact_json_member(
  739|  8.74k|		    pool, result, apr_pstrcat(pool, "\"", _oidc_http_sensitive_json_members[i], "\"", NULL));
  740|       |
  741|  1.74k|	return result;
  742|  1.74k|}
oidc_http_curl_pool_init:
 1647|      2|void oidc_http_curl_pool_init(apr_pool_t *pool) {
 1648|      2|	if (_oidc_http_curl_pool_enabled == TRUE)
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
  |  Branch (1648:6): [True: 0, False: 2]
  ------------------
 1649|      0|		return;
 1650|      2|#if APR_HAS_THREADS
 1651|      2|	if (apr_thread_mutex_create(&_oidc_http_curl_pool_mutex, APR_THREAD_MUTEX_DEFAULT, pool) != APR_SUCCESS)
  ------------------
  |  |   43|      2|#define APR_THREAD_MUTEX_DEFAULT  0x0   /**< platform-optimal lock behavior */
  ------------------
              	if (apr_thread_mutex_create(&_oidc_http_curl_pool_mutex, APR_THREAD_MUTEX_DEFAULT, pool) != APR_SUCCESS)
  ------------------
  |  |  225|      2|#define APR_SUCCESS 0
  ------------------
  |  Branch (1651:6): [True: 0, False: 2]
  ------------------
 1652|      0|		return;
 1653|      2|#endif
 1654|      2|	_oidc_http_curl_pool_num = 0;
 1655|      2|	_oidc_http_curl_pool_enabled = TRUE;
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
 1656|       |	apr_pool_cleanup_register(pool, NULL, oidc_http_curl_pool_cleanup, apr_pool_cleanup_null);
 1657|      2|}
http.c:oidc_http_url_decode_hex_digit:
  102|  26.3M|static int oidc_http_url_decode_hex_digit(const char c) {
  103|  26.3M|	if ((c >= '0') && (c <= '9'))
  ------------------
  |  Branch (103:6): [True: 26.2M, False: 64.8k]
  |  Branch (103:20): [True: 17.4M, False: 8.85M]
  ------------------
  104|  17.4M|		return c - '0';
  105|  8.91M|	if ((c >= 'A') && (c <= 'F'))
  ------------------
  |  Branch (105:6): [True: 8.85M, False: 64.9k]
  |  Branch (105:20): [True: 8.76M, False: 91.3k]
  ------------------
  106|  8.76M|		return c - 'A' + 10;
  107|   156k|	if ((c >= 'a') && (c <= 'f'))
  ------------------
  |  Branch (107:6): [True: 90.5k, False: 65.8k]
  |  Branch (107:20): [True: 46.4k, False: 44.0k]
  ------------------
  108|  46.4k|		return c - 'a' + 10;
  109|   109k|	return -1;
  110|   156k|}
http.c:oidc_http_hdr_in_get:
  160|  3.49k|static const char *oidc_http_hdr_in_get(const request_rec *r, const char *name) {
  161|  3.49k|	const char *value = apr_table_get(r->headers_in, name);
  162|  3.49k|	if (value)
  ------------------
  |  Branch (162:6): [True: 3.49k, False: 0]
  ------------------
  163|       |		oidc_debug(r, "%s=%s", name, value);
  ------------------
  |  |  170|  3.49k|#define oidc_debug(r, fmt, ...) oidc_log(r, OIDC_DEBUG, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  165|  3.49k|	ap_log_rerror(APLOG_MARK, level, 0, r, "%s: %s", __FUNCTION__, apr_psprintf(r->pool, fmt, ##__VA_ARGS__))
  |  |  |  |  ------------------
  |  |  |  |  |  |  448|  3.49k|#define ap_log_rerror(...) ap_log_rerror__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  450|  3.49k|    do { if (APLOG_R_MODULE_IS_LEVEL(r, mi, level))                         \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  196|  3.49k|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|  3.49k|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|  3.49k|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (196:13): [Folded, False: 3.49k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  197|  3.49k|            (ap_get_request_module_loglevel(r, module_index)     \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  635|  3.49k|    (ap_get_module_loglevel(ap_get_request_logconf(r),i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|  13.9k|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 3.49k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 3.49k, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 3.49k, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 3.49k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 3.49k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|  13.9k|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 3.49k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 3.49k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|  3.49k|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (197:13): [True: 0, False: 3.49k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  198|  3.49k|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|  3.49k|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  451|  3.49k|             ap_log_rerror_(file, line, mi, level, status, r, __VA_ARGS__); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (451:41): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  452|  3.49k|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (452:13): [Folded, False: 3.49k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|  3.49k|	return value;
  165|  3.49k|}
http.c:oidc_http_hdr_in_contains:
  182|  1.74k|					    const char postfix_separator, const char *needle) {
  183|  1.74k|	char *ctx = NULL;
  184|  1.74k|	const char *elem = NULL;
  185|  1.74k|	const char *value = oidc_http_hdr_in_get(r, name);
  186|  1.74k|	apr_byte_t rc = FALSE;
  ------------------
  |  |   51|  1.74k|#define FALSE 0
  ------------------
  187|  1.74k|	if (value) {
  ------------------
  |  Branch (187:6): [True: 1.74k, False: 0]
  ------------------
  188|  1.74k|		elem = apr_strtok(apr_pstrdup(r->pool, value), separator, &ctx);
  189|  3.01M|		while (elem != NULL) {
  ------------------
  |  Branch (189:10): [True: 3.01M, False: 1.74k]
  ------------------
  190|  3.01M|			while (*elem == OIDC_CHAR_SPACE)
  ------------------
  |  |  190|  3.01M|#define OIDC_CHAR_SPACE ' '
  ------------------
  |  Branch (190:11): [True: 405, False: 3.01M]
  ------------------
  191|    405|				elem++;
  192|  3.01M|			if ((_oidc_strncmp(elem, needle, _oidc_strlen(needle)) == 0) &&
  ------------------
  |  Branch (192:8): [True: 256, False: 3.01M]
  ------------------
  193|    256|			    ((elem[_oidc_strlen(needle)] == '\0') ||
  ------------------
  |  Branch (193:9): [True: 3, False: 253]
  ------------------
  194|    253|			     (elem[_oidc_strlen(needle)] == postfix_separator))) {
  ------------------
  |  Branch (194:9): [True: 2, False: 251]
  ------------------
  195|      5|				rc = TRUE;
  ------------------
  |  |   55|      5|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      5|#define FALSE 0
  |  |  ------------------
  ------------------
  196|      5|				break;
  197|      5|			}
  198|  3.01M|			elem = apr_strtok(NULL, separator, &ctx);
  199|  3.01M|		}
  200|  1.74k|	}
  201|  1.74k|	return rc;
  202|  1.74k|}
http.c:oidc_http_param_name_is_sensitive:
  590|  10.4k|static apr_byte_t oidc_http_param_name_is_sensitive(const char *name, size_t name_len) {
  591|  89.9k|	for (int i = 0; _oidc_http_sensitive_params[i] != NULL; i++)
  ------------------
  |  Branch (591:18): [True: 80.2k, False: 9.68k]
  ------------------
  592|  80.2k|		if ((_oidc_strlen(_oidc_http_sensitive_params[i]) == name_len) &&
  ------------------
  |  Branch (592:7): [True: 3.40k, False: 76.8k]
  ------------------
  593|  3.40k|		    (_oidc_strncmp(name, _oidc_http_sensitive_params[i], name_len) == 0))
  ------------------
  |  Branch (593:7): [True: 755, False: 2.64k]
  ------------------
  594|    755|			return TRUE;
  ------------------
  |  |   55|    755|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|    755|#define FALSE 0
  |  |  ------------------
  ------------------
  595|  9.68k|	return FALSE;
  ------------------
  |  |   51|  9.68k|#define FALSE 0
  ------------------
  596|  10.4k|}
http.c:oidc_http_redact_json_member:
  672|  8.74k|static const char *oidc_http_redact_json_member(apr_pool_t *pool, const char *data, const char *needle) {
  673|  8.74k|	const apr_size_t needle_len = _oidc_strlen(needle);
  674|  8.74k|	const apr_size_t data_len = _oidc_strlen(data);
  675|  8.74k|	char *result = apr_palloc(pool, data_len + (3 * ((data_len / (needle_len + 2)) + 1)) + 1);
  676|  8.74k|	char *out = result;
  677|       |	/* the input up to here has been copied to the output */
  678|  8.74k|	const char *copied = data;
  679|       |	/* the scan cursor */
  680|  8.74k|	const char *pos = data;
  681|  8.74k|	size_t len = 0;
  682|       |
  683|  21.3k|	for (;;) {
  684|  21.3k|		const char *match = _oidc_strstr(pos, needle);
  685|  21.3k|		if (match == NULL)
  ------------------
  |  Branch (685:7): [True: 8.74k, False: 12.5k]
  ------------------
  686|  8.74k|			break;
  687|       |		/* step over the member name and expect ": " then a quoted value; anything
  688|       |		 * else (a non-string value, a member name appearing inside a value) is
  689|       |		 * skipped rather than guessed at */
  690|  12.5k|		const char *p = match + needle_len;
  691|  13.2k|		while ((*p == ' ') || (*p == '\t'))
  ------------------
  |  Branch (691:10): [True: 356, False: 12.8k]
  |  Branch (691:25): [True: 314, False: 12.5k]
  ------------------
  692|    670|			p++;
  693|  12.5k|		if (*p != OIDC_CHAR_COLON) {
  ------------------
  |  |  188|  12.5k|#define OIDC_CHAR_COLON ':'
  ------------------
  |  Branch (693:7): [True: 2.45k, False: 10.1k]
  ------------------
  694|  2.45k|			pos = match + needle_len;
  695|  2.45k|			continue;
  696|  2.45k|		}
  697|  10.1k|		p++;
  698|  10.5k|		while ((*p == ' ') || (*p == '\t'))
  ------------------
  |  Branch (698:10): [True: 243, False: 10.3k]
  |  Branch (698:25): [True: 189, False: 10.1k]
  ------------------
  699|    432|			p++;
  700|  10.1k|		if (*p != OIDC_CHAR_DQUOTE) {
  ------------------
  |  |  199|  10.1k|#define OIDC_CHAR_DQUOTE '"'
  ------------------
  |  Branch (700:7): [True: 272, False: 9.84k]
  ------------------
  701|    272|			pos = match + needle_len;
  702|    272|			continue;
  703|    272|		}
  704|  9.84k|		p++;
  705|       |		/* copy everything up to and including the opening quote, then the mask */
  706|  9.84k|		len = (size_t)(p - copied);
  707|  9.84k|		_oidc_memcpy(out, copied, len);
  ------------------
  |  |   85|  9.84k|#define _oidc_memcpy(__dst, __src, __n) memcpy(__dst, __src, __n)
  ------------------
  708|  9.84k|		out += len;
  709|  9.84k|		_oidc_memcpy(out, "***", 3);
  ------------------
  |  |   85|  9.84k|#define _oidc_memcpy(__dst, __src, __n) memcpy(__dst, __src, __n)
  ------------------
  710|  9.84k|		out += 3;
  711|       |		/* If the closing quote is missing, mask to the end rather than leak a partial token; the
  712|       |		 * closing quote itself is copied with the next chunk and the scan resumes after the mask. */
  713|  9.84k|		const char *value_end = strchr(p, OIDC_CHAR_DQUOTE);
  ------------------
  |  |  199|  9.84k|#define OIDC_CHAR_DQUOTE '"'
  ------------------
  714|  9.84k|		copied = (value_end != NULL) ? value_end : p + _oidc_strlen(p);
  ------------------
  |  Branch (714:12): [True: 9.84k, False: 2]
  ------------------
  715|  9.84k|		pos = copied;
  716|  9.84k|	}
  717|       |
  718|  8.74k|	len = _oidc_strlen(copied);
  719|  8.74k|	_oidc_memcpy(out, copied, len);
  ------------------
  |  |   85|  8.74k|#define _oidc_memcpy(__dst, __src, __n) memcpy(__dst, __src, __n)
  ------------------
  720|  8.74k|	out += len;
  721|  8.74k|	*out = '\0';
  722|       |
  723|  8.74k|	return result;
  724|  8.74k|}

oidc_jose_hash_bytes:
  535|  1.74k|				oidc_jose_error_t *err) {
  536|  1.74k|	apr_byte_t rv = FALSE;
  ------------------
  |  |   51|  1.74k|#define FALSE 0
  ------------------
  537|  1.74k|	unsigned char md_value[EVP_MAX_MD_SIZE];
  538|  1.74k|	const EVP_MD *evp_digest = NULL;
  539|  1.74k|	EVP_MD_CTX *ctx = EVP_MD_CTX_new();
  540|  1.74k|	EVP_MD_CTX_init(ctx);
  541|       |
  542|  1.74k|	if ((evp_digest = EVP_get_digestbyname(s_digest)) == NULL) {
  ------------------
  |  Branch (542:6): [True: 0, False: 1.74k]
  ------------------
  543|      0|		oidc_jose_error(err, "no OpenSSL digest algorithm found for algorithm \"%s\"", s_digest);
  ------------------
  |  |  124|      0|#define oidc_jose_error(err, msg, ...) _oidc_jose_error_set(err, __FILE__, __LINE__, __FUNCTION__, msg, ##__VA_ARGS__)
  ------------------
  544|      0|		goto end;
  545|      0|	}
  546|       |
  547|  1.74k|	if (!EVP_DigestInit_ex(ctx, evp_digest, NULL)) {
  ------------------
  |  Branch (547:6): [True: 0, False: 1.74k]
  ------------------
  548|      0|		oidc_jose_error_openssl(err, "EVP_DigestInit_ex");
  ------------------
  |  |  126|      0|	_oidc_jose_error_set(err, __FILE__, __LINE__, __FUNCTION__, "%s() failed: %s", msg,                            \
  |  |  127|      0|			     ERR_error_string(ERR_get_error(), NULL), ##__VA_ARGS__)
  ------------------
  549|      0|		goto end;
  550|      0|	}
  551|       |
  552|  1.74k|	if (!EVP_DigestUpdate(ctx, input, input_len)) {
  ------------------
  |  Branch (552:6): [True: 0, False: 1.74k]
  ------------------
  553|      0|		oidc_jose_error_openssl(err, "EVP_DigestUpdate");
  ------------------
  |  |  126|      0|	_oidc_jose_error_set(err, __FILE__, __LINE__, __FUNCTION__, "%s() failed: %s", msg,                            \
  |  |  127|      0|			     ERR_error_string(ERR_get_error(), NULL), ##__VA_ARGS__)
  ------------------
  554|      0|		goto end;
  555|      0|	}
  556|       |
  557|  1.74k|	if (!EVP_DigestFinal(ctx, md_value, output_len)) {
  ------------------
  |  Branch (557:6): [True: 0, False: 1.74k]
  ------------------
  558|      0|		oidc_jose_error_openssl(err, "EVP_DigestFinal");
  ------------------
  |  |  126|      0|	_oidc_jose_error_set(err, __FILE__, __LINE__, __FUNCTION__, "%s() failed: %s", msg,                            \
  |  |  127|      0|			     ERR_error_string(ERR_get_error(), NULL), ##__VA_ARGS__)
  ------------------
  559|      0|		goto end;
  560|      0|	}
  561|       |
  562|  1.74k|	*output = apr_pmemdup(pool, md_value, *output_len);
  563|       |
  564|  1.74k|	rv = TRUE;
  ------------------
  |  |   55|  1.74k|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|  1.74k|#define FALSE 0
  |  |  ------------------
  ------------------
  565|       |
  566|  1.74k|end:
  567|       |
  568|  1.74k|	if (ctx)
  ------------------
  |  Branch (568:6): [True: 1.74k, False: 0]
  ------------------
  569|  1.74k|		EVP_MD_CTX_free(ctx);
  570|       |
  571|  1.74k|	return rv;
  572|  1.74k|}

oidc_json_decref:
  107|    642|void oidc_json_decref(oidc_json_t *json) {
  108|    642|	json_decref(json);
  109|    642|}
oidc_json_is_object:
  144|     12|int oidc_json_is_object(const oidc_json_t *json) {
  145|       |	return json_is_object(json);
  146|     12|}
oidc_json_string_value:
  183|     20|const char *oidc_json_string_value(const oidc_json_t *json) {
  184|     20|	return json_string_value(json);
  185|     20|}
oidc_json_object_get:
  206|     20|oidc_json_t *oidc_json_object_get(const oidc_json_t *json, const char *key) {
  207|     20|	return json_object_get(json, key);
  208|     20|}
oidc_json_parse:
  273|    640|apr_byte_t oidc_json_parse(apr_pool_t *pool, const char *str, int flags, oidc_json_t **json, char **s_err) {
  274|    640|	json_error_t json_error;
  275|       |
  276|    640|	*json = NULL;
  277|    640|	if (s_err != NULL)
  ------------------
  |  Branch (277:6): [True: 640, False: 0]
  ------------------
  278|    640|		*s_err = NULL;
  279|       |
  280|    640|	if (str == NULL) {
  ------------------
  |  Branch (280:6): [True: 0, False: 640]
  ------------------
  281|      0|		if (s_err != NULL)
  ------------------
  |  Branch (281:7): [True: 0, False: 0]
  ------------------
  282|      0|			*s_err = apr_pstrdup(pool, "input string is NULL");
  283|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  284|      0|	}
  285|       |
  286|    640|	*json = json_loads(str, oidc_json_flags2backend(flags), &json_error);
  287|    640|	if (*json == NULL) {
  ------------------
  |  Branch (287:6): [True: 628, False: 12]
  ------------------
  288|    628|		if (s_err != NULL) {
  ------------------
  |  Branch (288:7): [True: 628, False: 0]
  ------------------
  289|    628|#if JANSSON_VERSION_HEX >= 0x020B00
  290|    628|			if (json_error_code(&json_error) == json_error_null_character)
  ------------------
  |  Branch (290:8): [True: 2, False: 626]
  ------------------
  291|      2|				*s_err = apr_pstrdup(pool, json_error.text);
  292|    626|			else
  293|    626|#endif
  294|    626|				*s_err = apr_psprintf(pool, "%s (%s)", json_error.text,
  295|    626|						      apr_pstrndup(pool, str, OIDC_JSON_MAX_ERROR_STR));
  ------------------
  |  |  268|    626|#define OIDC_JSON_MAX_ERROR_STR 4096
  ------------------
  296|    628|		}
  297|    628|		return FALSE;
  ------------------
  |  |   51|    628|#define FALSE 0
  ------------------
  298|    628|	}
  299|       |
  300|     12|	return TRUE;
  ------------------
  |  |   55|     12|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|     12|#define FALSE 0
  |  |  ------------------
  ------------------
  301|    640|}
oidc_json_decode_object_err:
  306|    640|apr_byte_t oidc_json_decode_object_err(request_rec *r, const char *str, oidc_json_t **json, apr_byte_t log_err) {
  307|    640|	char *s_err = NULL;
  308|       |
  309|    640|	if (str == NULL)
  ------------------
  |  Branch (309:6): [True: 0, False: 640]
  ------------------
  310|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  311|       |
  312|       |	/* decode the JSON contents of the buffer */
  313|    640|	if (oidc_json_parse(r->pool, str, 0, json, &s_err) == FALSE) {
  ------------------
  |  |   51|    640|#define FALSE 0
  ------------------
  |  Branch (313:6): [True: 628, False: 12]
  ------------------
  314|       |		/* something went wrong */
  315|    628|		if (log_err)
  ------------------
  |  Branch (315:7): [True: 628, False: 0]
  ------------------
  316|    628|			oidc_error(r, "JSON parsing returned an error: %s", s_err);
  ------------------
  |  |  173|    628|#define oidc_error(r, fmt, ...) oidc_log(r, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  165|    628|	ap_log_rerror(APLOG_MARK, level, 0, r, "%s: %s", __FUNCTION__, apr_psprintf(r->pool, fmt, ##__VA_ARGS__))
  |  |  |  |  ------------------
  |  |  |  |  |  |  448|    628|#define ap_log_rerror(...) ap_log_rerror__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  450|    628|    do { if (APLOG_R_MODULE_IS_LEVEL(r, mi, level))                         \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  196|    628|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|    628|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|    628|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (196:13): [True: 628, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  197|    628|            (ap_get_request_module_loglevel(r, module_index)     \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  635|      0|    (ap_get_module_loglevel(ap_get_request_logconf(r),i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (197:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  198|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  451|  1.25k|             ap_log_rerror_(file, line, mi, level, status, r, __VA_ARGS__); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (451:41): [True: 628, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  452|    628|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (452:13): [Folded, False: 628]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  317|    628|		return FALSE;
  ------------------
  |  |   51|    628|#define FALSE 0
  ------------------
  318|    628|	}
  319|       |
  320|     12|	if (!oidc_json_is_object(*json)) {
  ------------------
  |  Branch (320:6): [True: 2, False: 10]
  ------------------
  321|       |		/* a successfully parsed non-object (e.g. a top-level array) is still not a valid result here;
  322|       |		 * log_err controls only whether we log the rejection, not whether we reject */
  323|      2|		if (log_err)
  ------------------
  |  Branch (323:7): [True: 2, False: 0]
  ------------------
  324|      2|			oidc_error(r, "parsed JSON did not contain a JSON object");
  ------------------
  |  |  173|      2|#define oidc_error(r, fmt, ...) oidc_log(r, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  165|      2|	ap_log_rerror(APLOG_MARK, level, 0, r, "%s: %s", __FUNCTION__, apr_psprintf(r->pool, fmt, ##__VA_ARGS__))
  |  |  |  |  ------------------
  |  |  |  |  |  |  448|      2|#define ap_log_rerror(...) ap_log_rerror__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  450|      2|    do { if (APLOG_R_MODULE_IS_LEVEL(r, mi, level))                         \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  196|      2|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      2|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      2|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (196:13): [True: 2, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  197|      2|            (ap_get_request_module_loglevel(r, module_index)     \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  635|      0|    (ap_get_module_loglevel(ap_get_request_logconf(r),i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (197:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  198|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  451|      4|             ap_log_rerror_(file, line, mi, level, status, r, __VA_ARGS__); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (451:41): [True: 2, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  452|      2|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (452:13): [Folded, False: 2]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|      2|		oidc_json_decref(*json);
  326|      2|		*json = NULL;
  327|      2|		return FALSE;
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  328|      2|	}
  329|       |
  330|     10|	return TRUE;
  ------------------
  |  |   55|     10|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|     10|#define FALSE 0
  |  |  ------------------
  ------------------
  331|     12|}
oidc_json_decode_object:
  333|    640|apr_byte_t oidc_json_decode_object(request_rec *r, const char *str, oidc_json_t **json) {
  334|    640|	return oidc_json_decode_object_err(r, str, json, TRUE);
  ------------------
  |  |   55|    640|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|    640|#define FALSE 0
  |  |  ------------------
  ------------------
  335|    640|}
json.c:oidc_json_flags2backend:
   64|    640|static size_t oidc_json_flags2backend(int flags) {
   65|    640|	size_t f = 0;
   66|    640|	int indent = 0;
   67|    640|	if (flags & OIDC_JSON_COMPACT)
  ------------------
  |  |   78|    640|#define OIDC_JSON_COMPACT 0x01
  ------------------
  |  Branch (67:6): [True: 0, False: 640]
  ------------------
   68|      0|		f |= JSON_COMPACT;
   69|    640|	if (flags & OIDC_JSON_PRESERVE_ORDER)
  ------------------
  |  |   79|    640|#define OIDC_JSON_PRESERVE_ORDER 0x02
  ------------------
  |  Branch (69:6): [True: 0, False: 640]
  ------------------
   70|      0|		f |= JSON_PRESERVE_ORDER;
   71|    640|	if (flags & OIDC_JSON_ENCODE_ANY)
  ------------------
  |  |   80|    640|#define OIDC_JSON_ENCODE_ANY 0x04
  ------------------
  |  Branch (71:6): [True: 0, False: 640]
  ------------------
   72|      0|		f |= JSON_ENCODE_ANY;
   73|    640|	if (flags & OIDC_JSON_DECODE_ANY)
  ------------------
  |  |   81|    640|#define OIDC_JSON_DECODE_ANY 0x08
  ------------------
  |  Branch (73:6): [True: 0, False: 640]
  ------------------
   74|      0|		f |= JSON_DECODE_ANY;
   75|    640|	indent = (flags >> 8) & 0x1F;
   76|    640|	if (indent > 0)
  ------------------
  |  Branch (76:6): [True: 0, False: 640]
  ------------------
   77|      0|		f |= JSON_INDENT(indent);
   78|    640|	return f;
   79|    640|}

oidc_proto_jwt_header_peek:
  274|  3.49k|char *oidc_proto_jwt_header_peek(request_rec *r, const char *compact_encoded_jwt, char **alg, char **enc, char **kid) {
  275|  3.49k|	const char *input = NULL;
  276|  3.49k|	char *result = NULL;
  277|  3.49k|	const char *p = _oidc_strstr(compact_encoded_jwt ? compact_encoded_jwt : "", ".");
  ------------------
  |  Branch (277:31): [True: 3.49k, False: 0]
  ------------------
  278|  3.49k|	if (p == NULL) {
  ------------------
  |  Branch (278:6): [True: 2.50k, False: 996]
  ------------------
  279|  2.50k|		oidc_warn(r, "could not parse first element separated by \".\" from input");
  ------------------
  |  |  171|  2.50k|#define oidc_warn(r, fmt, ...) oidc_log(r, APLOG_WARNING, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  165|  2.50k|	ap_log_rerror(APLOG_MARK, level, 0, r, "%s: %s", __FUNCTION__, apr_psprintf(r->pool, fmt, ##__VA_ARGS__))
  |  |  |  |  ------------------
  |  |  |  |  |  |  448|  2.50k|#define ap_log_rerror(...) ap_log_rerror__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  450|  2.50k|    do { if (APLOG_R_MODULE_IS_LEVEL(r, mi, level))                         \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  196|  2.50k|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|  2.50k|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|  2.50k|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (196:13): [True: 2.50k, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  197|  2.50k|            (ap_get_request_module_loglevel(r, module_index)     \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  635|      0|    (ap_get_module_loglevel(ap_get_request_logconf(r),i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (197:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  198|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  451|  5.00k|             ap_log_rerror_(file, line, mi, level, status, r, __VA_ARGS__); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (451:41): [True: 2.50k, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  452|  2.50k|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (452:13): [Folded, False: 2.50k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  280|  2.50k|		return NULL;
  281|  2.50k|	}
  282|    996|	input = apr_pstrmemdup(r->pool, compact_encoded_jwt, _oidc_strlen(compact_encoded_jwt) - _oidc_strlen(p));
  283|    996|	if (oidc_util_base64url_decode(r->pool, &result, input) <= 0) {
  ------------------
  |  Branch (283:6): [True: 356, False: 640]
  ------------------
  284|    356|		oidc_warn(r, "oidc_base64url_decode returned an error");
  ------------------
  |  |  171|    356|#define oidc_warn(r, fmt, ...) oidc_log(r, APLOG_WARNING, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  165|    356|	ap_log_rerror(APLOG_MARK, level, 0, r, "%s: %s", __FUNCTION__, apr_psprintf(r->pool, fmt, ##__VA_ARGS__))
  |  |  |  |  ------------------
  |  |  |  |  |  |  448|    356|#define ap_log_rerror(...) ap_log_rerror__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  450|    356|    do { if (APLOG_R_MODULE_IS_LEVEL(r, mi, level))                         \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  196|    356|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|    356|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|    356|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (196:13): [True: 356, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  197|    356|            (ap_get_request_module_loglevel(r, module_index)     \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  635|      0|    (ap_get_module_loglevel(ap_get_request_logconf(r),i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (197:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  198|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  451|    712|             ap_log_rerror_(file, line, mi, level, status, r, __VA_ARGS__); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (451:41): [True: 356, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  452|    356|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (452:13): [Folded, False: 356]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  285|    356|		return NULL;
  286|    356|	}
  287|       |	/* Parse when kid alone is requested; otherwise a present key ID would be reported as absent. */
  288|    640|	if ((alg != NULL) || (enc != NULL) || (kid != NULL)) {
  ------------------
  |  Branch (288:6): [True: 320, False: 320]
  |  Branch (288:23): [True: 0, False: 320]
  |  Branch (288:40): [True: 320, False: 0]
  ------------------
  289|    640|		oidc_json_t *json = NULL;
  290|    640|		oidc_json_decode_object(r, result, &json);
  291|    640|		if (json) {
  ------------------
  |  Branch (291:7): [True: 10, False: 630]
  ------------------
  292|     10|			if (alg)
  ------------------
  |  Branch (292:8): [True: 5, False: 5]
  ------------------
  293|      5|				*alg = apr_pstrdup(
  294|      5|				    r->pool, oidc_json_string_value(oidc_json_object_get(json, OIDC_JOSE_HDR_ALG)));
  ------------------
  |  |   96|      5|#define OIDC_JOSE_HDR_ALG "alg"
  ------------------
  295|     10|			if (enc)
  ------------------
  |  Branch (295:8): [True: 5, False: 5]
  ------------------
  296|      5|				*enc = apr_pstrdup(
  297|      5|				    r->pool, oidc_json_string_value(oidc_json_object_get(json, OIDC_JOSE_HDR_ENC)));
  ------------------
  |  |   97|      5|#define OIDC_JOSE_HDR_ENC "enc"
  ------------------
  298|     10|			if (kid)
  ------------------
  |  Branch (298:8): [True: 10, False: 0]
  ------------------
  299|     10|				*kid = apr_pstrdup(
  300|     10|				    r->pool, oidc_json_string_value(oidc_json_object_get(json, OIDC_JOSE_HDR_KID)));
  ------------------
  |  |   98|     10|#define OIDC_JOSE_HDR_KID "kid"
  ------------------
  301|     10|		}
  302|    640|		oidc_json_decref(json);
  303|    640|	}
  304|    640|	return result;
  305|    996|}

oidc_state_browser_fingerprint:
   60|  1.74k|char *oidc_state_browser_fingerprint(request_rec *r, const oidc_cfg_t *c, const char *nonce) {
   61|       |
   62|       |	/* helper to hold header values */
   63|  1.74k|	const char *value = NULL;
   64|       |	/* concatenated hash input */
   65|  1.74k|	char *input = "";
   66|  1.74k|	unsigned char *hash = NULL;
   67|  1.74k|	unsigned int hash_len = 0;
   68|  1.74k|	oidc_jose_error_t err;
   69|  1.74k|	char *result = NULL;
   70|       |
   71|  1.74k|	oidc_debug(r, "enter");
  ------------------
  |  |  170|  1.74k|#define oidc_debug(r, fmt, ...) oidc_log(r, OIDC_DEBUG, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  165|  1.74k|	ap_log_rerror(APLOG_MARK, level, 0, r, "%s: %s", __FUNCTION__, apr_psprintf(r->pool, fmt, ##__VA_ARGS__))
  |  |  |  |  ------------------
  |  |  |  |  |  |  448|  1.74k|#define ap_log_rerror(...) ap_log_rerror__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  450|  1.74k|    do { if (APLOG_R_MODULE_IS_LEVEL(r, mi, level))                         \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  196|  1.74k|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|  1.74k|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|  1.74k|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (196:13): [Folded, False: 1.74k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  197|  1.74k|            (ap_get_request_module_loglevel(r, module_index)     \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  635|  1.74k|    (ap_get_module_loglevel(ap_get_request_logconf(r),i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|  6.99k|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 1.74k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 1.74k, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 1.74k, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 1.74k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 1.74k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|  6.99k|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 1.74k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 1.74k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|  1.74k|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (197:13): [True: 0, False: 1.74k]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  198|  1.74k|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|  1.74k|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  451|  1.74k|             ap_log_rerror_(file, line, mi, level, status, r, __VA_ARGS__); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (451:41): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  452|  1.74k|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (452:13): [Folded, False: 1.74k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   72|       |
   73|  1.74k|	if (oidc_cfg_state_input_headers_get(c) & OIDC_STATE_INPUT_HEADERS_X_FORWARDED_FOR) {
  ------------------
  |  Branch (73:6): [True: 0, False: 1.74k]
  ------------------
   74|       |		/* get the X-FORWARDED-FOR header value  */
   75|      0|		value = oidc_http_hdr_in_x_forwarded_for_get(r);
   76|       |		/* if we have a value for this header, concat it to the hash input */
   77|      0|		if (value != NULL)
  ------------------
  |  Branch (77:7): [True: 0, False: 0]
  ------------------
   78|      0|			input = apr_pstrcat(r->pool, input, value, NULL);
   79|      0|	}
   80|       |
   81|  1.74k|	if (oidc_cfg_state_input_headers_get(c) & OIDC_STATE_INPUT_HEADERS_USER_AGENT) {
  ------------------
  |  Branch (81:6): [True: 1.74k, False: 0]
  ------------------
   82|       |		/* get the USER-AGENT header value  */
   83|  1.74k|		value = oidc_http_hdr_in_user_agent_get(r);
   84|       |		/* if we have a value for this header, concat it to the hash input */
   85|  1.74k|		if (value != NULL)
  ------------------
  |  Branch (85:7): [True: 1.74k, False: 0]
  ------------------
   86|  1.74k|			input = apr_pstrcat(r->pool, input, value, NULL);
   87|  1.74k|	}
   88|       |
   89|       |	/* get the remote client IP address or host name */
   90|       |
   91|       |	/* concat the nonce parameter to the hash input */
   92|  1.74k|	input = apr_pstrcat(r->pool, input, nonce, NULL);
   93|       |
   94|       |	/* calculate the hash output */
   95|  1.74k|	if (oidc_jose_hash_bytes(r->pool, OIDC_JOSE_ALG_SHA256, (const unsigned char *)input,
  ------------------
  |  |   70|  1.74k|#define OIDC_JOSE_ALG_SHA256 "sha256"
  ------------------
  |  Branch (95:6): [True: 0, False: 1.74k]
  ------------------
   96|  1.74k|				 (unsigned int)_oidc_strlen(input), &hash, &hash_len, &err) == FALSE) {
  ------------------
  |  |   51|  1.74k|#define FALSE 0
  ------------------
   97|      0|		oidc_error(r, "oidc_jose_hash_bytes failed: %s", oidc_jose_e2s(r->pool, err));
  ------------------
  |  |  173|      0|#define oidc_error(r, fmt, ...) oidc_log(r, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  165|      0|	ap_log_rerror(APLOG_MARK, level, 0, r, "%s: %s", __FUNCTION__, apr_psprintf(r->pool, fmt, ##__VA_ARGS__))
  |  |  |  |  ------------------
  |  |  |  |  |  |  448|      0|#define ap_log_rerror(...) ap_log_rerror__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  450|      0|    do { if (APLOG_R_MODULE_IS_LEVEL(r, mi, level))                         \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  196|      0|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      0|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (196:13): [True: 0, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  197|      0|            (ap_get_request_module_loglevel(r, module_index)     \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  635|      0|    (ap_get_module_loglevel(ap_get_request_logconf(r),i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (197:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  198|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  451|      0|             ap_log_rerror_(file, line, mi, level, status, r, __VA_ARGS__); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (451:41): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  452|      0|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (452:13): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|      0|		return NULL;
   99|      0|	}
  100|       |
  101|       |	/* base64url-encode the resulting hash and return it */
  102|  1.74k|	oidc_util_base64url_encode(r, &result, (const char *)hash, hash_len, OIDC_BASE64URL_PADDING_STRIP);
  103|       |
  104|  1.74k|	return result;
  105|  1.74k|}

oidc_util_base64url_encode:
   50|  1.74k|			       oidc_base64url_padding_t padding) {
   51|  1.74k|	if ((src == NULL) || (src_len <= 0)) {
  ------------------
  |  Branch (51:6): [True: 0, False: 1.74k]
  |  Branch (51:23): [True: 0, False: 1.74k]
  ------------------
   52|      0|		oidc_error(r, "not encoding anything; src=NULL and/or src_len<1");
  ------------------
  |  |  173|      0|#define oidc_error(r, fmt, ...) oidc_log(r, APLOG_ERR, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  165|      0|	ap_log_rerror(APLOG_MARK, level, 0, r, "%s: %s", __FUNCTION__, apr_psprintf(r->pool, fmt, ##__VA_ARGS__))
  |  |  |  |  ------------------
  |  |  |  |  |  |  448|      0|#define ap_log_rerror(...) ap_log_rerror__(__VA_ARGS__)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  450|      0|    do { if (APLOG_R_MODULE_IS_LEVEL(r, mi, level))                         \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  196|      0|          ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |                         ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) ||       \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   48|      0|#define APLOG_NOTICE    LOG_NOTICE      /* normal but significant condition */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (196:13): [True: 0, Folded]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  197|      0|            (ap_get_request_module_loglevel(r, module_index)     \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  635|      0|    (ap_get_module_loglevel(ap_get_request_logconf(r),i))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  621|      0|    (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ?  \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:8): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:18): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:19): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:48): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:49): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (621:67): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  622|      0|     (l)->level :                                                         \
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (622:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  623|      0|     (l)->module_levels[i])
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (623:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (197:13): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  198|      0|             >= ((level)&APLOG_LEVELMASK) ) )
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   60|      0|#define APLOG_LEVELMASK 15     /* mask off the level value */
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  451|      0|             ap_log_rerror_(file, line, mi, level, status, r, __VA_ARGS__); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (451:41): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  452|      0|    } while(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (452:13): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   53|      0|		return -1;
   54|      0|	}
   55|  1.74k|	unsigned int enc_len = apr_base64_encode_len(src_len);
   56|  1.74k|	char *enc = apr_palloc(r->pool, enc_len);
   57|  1.74k|	apr_base64_encode(enc, src, src_len);
   58|  1.74k|	unsigned int i = 0;
   59|  78.6k|	while (enc[i] != '\0') {
  ------------------
  |  Branch (59:9): [True: 76.9k, False: 1.74k]
  ------------------
   60|  76.9k|		if (enc[i] == '+')
  ------------------
  |  Branch (60:7): [True: 1.18k, False: 75.7k]
  ------------------
   61|  1.18k|			enc[i] = '-';
   62|  76.9k|		if (enc[i] == '/')
  ------------------
  |  Branch (62:7): [True: 1.17k, False: 75.7k]
  ------------------
   63|  1.17k|			enc[i] = '_';
   64|  76.9k|		if (enc[i] == '=')
  ------------------
  |  Branch (64:7): [True: 1.74k, False: 75.1k]
  ------------------
   65|  1.74k|			enc[i] = ',';
   66|  76.9k|		i++;
   67|  76.9k|	}
   68|  1.74k|	if (padding == OIDC_BASE64URL_PADDING_STRIP) {
  ------------------
  |  Branch (68:6): [True: 1.74k, False: 0]
  ------------------
   69|       |		/* the loop above already walked to the terminator, so `i` is the encoded length; drop the
   70|       |		 * padding from it (base64 emits at most two '=', rewritten to ',' above). Deriving the
   71|       |		 * index from the walk rather than from apr_base64_encode_len() also keeps it provably in
   72|       |		 * bounds - the length function is opaque to gcc -fanalyzer, which flagged the previous
   73|       |		 * enc_len arithmetic as a possible over-read. */
   74|  3.49k|		while ((i > 0) && (enc[i - 1] == ','))
  ------------------
  |  Branch (74:10): [True: 3.49k, False: 0]
  |  Branch (74:21): [True: 1.74k, False: 1.74k]
  ------------------
   75|  1.74k|			i--;
   76|  1.74k|		enc[i] = '\0';
   77|  1.74k|		enc_len = i;
   78|  1.74k|	}
   79|  1.74k|	*dst = enc;
   80|  1.74k|	return enc_len;
   81|  1.74k|}
oidc_util_base64_decode:
   88|    848|char *oidc_util_base64_decode(apr_pool_t *pool, const char *input, char **output, int *output_len) {
   89|    848|	if ((input == NULL) || (output == NULL) || (output_len == NULL))
  ------------------
  |  Branch (89:6): [True: 0, False: 848]
  |  Branch (89:25): [True: 0, False: 848]
  |  Branch (89:45): [True: 0, False: 848]
  ------------------
   90|      0|		return apr_psprintf(pool, "base64-decoding failed: invalid parameters");
   91|       |
   92|    848|	*output = apr_pcalloc(pool, apr_base64_decode_len(input));
  ------------------
  |  |  465|    848|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
   93|    848|	*output_len = apr_base64_decode(*output, input);
   94|       |
   95|    848|	if (*output_len <= 0)
  ------------------
  |  Branch (95:6): [True: 208, False: 640]
  ------------------
   96|    208|		return apr_psprintf(pool, "base64-decoding of \"%s\" failed", input);
   97|       |
   98|    640|	return NULL;
   99|    848|}
oidc_util_base64url_decode:
  102|    996|int oidc_util_base64url_decode(apr_pool_t *pool, char **dst, const char *src) {
  103|    996|	if (src == NULL) {
  ------------------
  |  Branch (103:6): [True: 0, False: 996]
  ------------------
  104|      0|		return -1;
  105|      0|	}
  106|    996|	char *dec = apr_pstrdup(pool, src);
  107|    996|	int i = 0;
  108|  14.8M|	while (dec[i] != '\0') {
  ------------------
  |  Branch (108:9): [True: 14.8M, False: 996]
  ------------------
  109|  14.8M|		if (dec[i] == '-')
  ------------------
  |  Branch (109:7): [True: 10.6k, False: 14.8M]
  ------------------
  110|  10.6k|			dec[i] = '+';
  111|  14.8M|		if (dec[i] == '_')
  ------------------
  |  Branch (111:7): [True: 1.04k, False: 14.8M]
  ------------------
  112|  1.04k|			dec[i] = '/';
  113|  14.8M|		if (dec[i] == ',')
  ------------------
  |  Branch (113:7): [True: 1.26M, False: 13.6M]
  ------------------
  114|  1.26M|			dec[i] = '=';
  115|  14.8M|		i++;
  116|  14.8M|	}
  117|    996|	switch (_oidc_strlen(dec) % 4) {
  118|    290|	case 0:
  ------------------
  |  Branch (118:2): [True: 290, False: 706]
  ------------------
  119|    290|		break;
  120|    158|	case 2:
  ------------------
  |  Branch (120:2): [True: 158, False: 838]
  ------------------
  121|    158|		dec = apr_pstrcat(pool, dec, "==", NULL);
  122|    158|		break;
  123|    400|	case 3:
  ------------------
  |  Branch (123:2): [True: 400, False: 596]
  ------------------
  124|    400|		dec = apr_pstrcat(pool, dec, "=", NULL);
  125|    400|		break;
  126|    148|	default:
  ------------------
  |  Branch (126:2): [True: 148, False: 848]
  ------------------
  127|    148|		return 0;
  128|    996|	}
  129|       |
  130|    848|	int dlen = -1;
  131|    848|	oidc_util_base64_decode(pool, dec, dst, &dlen);
  132|    848|	return dlen;
  133|    996|}

oidc_util_html_escape:
  106|  1.74k|char *oidc_util_html_escape(apr_pool_t *pool, const char *s) {
  107|  1.74k|	return oidc_util_html_escape_with(pool, s != NULL ? s : "", oidc_util_html_escape_char);
  ------------------
  |  Branch (107:42): [True: 1.74k, False: 0]
  ------------------
  108|  1.74k|}
oidc_util_html_javascript_escape:
  139|  1.74k|char *oidc_util_html_javascript_escape(apr_pool_t *pool, const char *s) {
  140|  1.74k|	if (s == NULL)
  ------------------
  |  Branch (140:6): [True: 0, False: 1.74k]
  ------------------
  141|      0|		return NULL;
  142|  1.74k|	return oidc_util_html_escape_with(pool, s, oidc_util_html_javascript_escape_char);
  143|  1.74k|}
html.c:oidc_util_html_escape_with:
   73|  3.49k|static char *oidc_util_html_escape_with(apr_pool_t *pool, const char *s, const char *(*escape_char)(char)) {
   74|  3.49k|	const char *cp = NULL;
   75|  3.49k|	size_t outputlen = 0;
   76|  3.49k|	size_t i = 0;
   77|       |
   78|       |	/* first pass: compute the length of the escaped output */
   79|  56.5M|	for (cp = s; *cp; cp++) {
  ------------------
  |  Branch (79:15): [True: 56.5M, False: 3.49k]
  ------------------
   80|  56.5M|		const char *esc = escape_char(*cp);
   81|  56.5M|		outputlen += esc ? _oidc_strlen(esc) : 1;
  ------------------
  |  Branch (81:16): [True: 8.22M, False: 48.3M]
  ------------------
   82|  56.5M|	}
   83|       |
   84|       |	/* second pass: write the escaped output, preserving the bounds-checked write idiom */
   85|  3.49k|	char *output = apr_pcalloc(pool, outputlen + 1);
  ------------------
  |  |  465|  3.49k|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
   86|  56.5M|	for (cp = s; *cp; cp++) {
  ------------------
  |  Branch (86:15): [True: 56.5M, False: 3.49k]
  ------------------
   87|  56.5M|		const char *esc = escape_char(*cp);
   88|  56.5M|		if (esc == NULL) {
  ------------------
  |  Branch (88:7): [True: 48.3M, False: 8.22M]
  ------------------
   89|  48.3M|			if (i + 1 <= outputlen)
  ------------------
  |  Branch (89:8): [True: 48.3M, False: 0]
  ------------------
   90|  48.3M|				output[i] = *cp;
   91|  48.3M|			i += 1;
   92|  48.3M|			continue;
   93|  48.3M|		}
   94|  8.22M|		size_t n = _oidc_strlen(esc);
   95|  8.22M|		if (i + n <= outputlen)
  ------------------
  |  Branch (95:7): [True: 8.22M, False: 0]
  ------------------
   96|  8.22M|			(void)_oidc_strcpy(&output[i], esc);
  ------------------
  |  |   86|  8.22M|#define _oidc_strcpy(__dst, __src) strcpy(__dst, __src)
  ------------------
   97|  8.22M|		i += n;
   98|  8.22M|	}
   99|  3.49k|	output[i] = '\0';
  100|  3.49k|	return output;
  101|  3.49k|}
html.c:oidc_util_html_escape_char:
   52|  56.5M|static const char *oidc_util_html_escape_char(char c) {
   53|  56.5M|	switch (c) {
   54|  6.33M|	case '&':
  ------------------
  |  Branch (54:2): [True: 6.33M, False: 50.2M]
  ------------------
   55|  6.33M|		return "&amp;";
   56|  5.50k|	case '\'':
  ------------------
  |  Branch (56:2): [True: 5.50k, False: 56.5M]
  ------------------
   57|  5.50k|		return "&apos;";
   58|  4.60M|	case '"':
  ------------------
  |  Branch (58:2): [True: 4.60M, False: 51.9M]
  ------------------
   59|  4.60M|		return "&quot;";
   60|  1.80k|	case '>':
  ------------------
  |  Branch (60:2): [True: 1.80k, False: 56.5M]
  ------------------
   61|  1.80k|		return "&gt;";
   62|  2.33k|	case '<':
  ------------------
  |  Branch (62:2): [True: 2.33k, False: 56.5M]
  ------------------
   63|  2.33k|		return "&lt;";
   64|  45.6M|	default:
  ------------------
  |  Branch (64:2): [True: 45.6M, False: 10.9M]
  ------------------
   65|       |		return NULL;
   66|  56.5M|	}
   67|  56.5M|}
html.c:oidc_util_html_javascript_escape_char:
  113|  56.5M|static const char *oidc_util_html_javascript_escape_char(char c) {
  114|  56.5M|	switch (c) {
  115|  5.50k|	case '\'':
  ------------------
  |  Branch (115:2): [True: 5.50k, False: 56.5M]
  ------------------
  116|  5.50k|		return "\\'";
  117|  4.60M|	case '"':
  ------------------
  |  Branch (117:2): [True: 4.60M, False: 51.9M]
  ------------------
  118|  4.60M|		return "\\\"";
  119|  91.5k|	case '\\':
  ------------------
  |  Branch (119:2): [True: 91.5k, False: 56.4M]
  ------------------
  120|  91.5k|		return "\\\\";
  121|  40.3k|	case '/':
  ------------------
  |  Branch (121:2): [True: 40.3k, False: 56.5M]
  ------------------
  122|  40.3k|		return "\\/";
  123|   333k|	case 0x0D:
  ------------------
  |  Branch (123:2): [True: 333k, False: 56.2M]
  ------------------
  124|   333k|		return "\\r";
  125|   413k|	case 0x0A:
  ------------------
  |  Branch (125:2): [True: 413k, False: 56.1M]
  ------------------
  126|   413k|		return "\\n";
  127|  2.33k|	case '<':
  ------------------
  |  Branch (127:2): [True: 2.33k, False: 56.5M]
  ------------------
  128|  2.33k|		return "\\x3c";
  129|  1.80k|	case '>':
  ------------------
  |  Branch (129:2): [True: 1.80k, False: 56.5M]
  ------------------
  130|  1.80k|		return "\\x3e";
  131|  51.0M|	default:
  ------------------
  |  Branch (131:2): [True: 51.0M, False: 5.49M]
  ------------------
  132|       |		return NULL;
  133|  56.5M|	}
  134|  56.5M|}

oidc_util_key_derive_passphrase_key:
   60|      2|apr_byte_t oidc_util_key_derive_passphrase_key(const char *passphrase, unsigned char *out, apr_size_t out_len) {
   61|      2|	if ((passphrase == NULL) || (_oidc_strlen(passphrase) == 0))
  ------------------
  |  Branch (61:6): [True: 0, False: 2]
  |  Branch (61:30): [True: 0, False: 2]
  ------------------
   62|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
   63|      2|	return (PKCS5_PBKDF2_HMAC(passphrase, (int)_oidc_strlen(passphrase),
  ------------------
  |  Branch (63:9): [True: 2, False: 0]
  ------------------
   64|      2|				  (const unsigned char *)OIDC_UTIL_KEY_DERIVE_SALT,
  ------------------
  |  |   53|      2|#define OIDC_UTIL_KEY_DERIVE_SALT "mod_auth_openidc-crypto-passphrase-v1"
  ------------------
   65|      2|				  (int)(sizeof(OIDC_UTIL_KEY_DERIVE_SALT) - 1), OIDC_UTIL_KEY_DERIVE_ITERATIONS,
  ------------------
  |  |   53|      2|#define OIDC_UTIL_KEY_DERIVE_SALT "mod_auth_openidc-crypto-passphrase-v1"
  ------------------
              				  (int)(sizeof(OIDC_UTIL_KEY_DERIVE_SALT) - 1), OIDC_UTIL_KEY_DERIVE_ITERATIONS,
  ------------------
  |  |   49|      2|#define OIDC_UTIL_KEY_DERIVE_ITERATIONS 210000
  ------------------
   66|      2|				  EVP_sha256(), (int)out_len, out) == 1)
   67|      2|		   ? TRUE
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
   68|      2|		   : FALSE;
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
   69|      2|}

oidc_util_strcasestr:
   98|  3.49k|const char *oidc_util_strcasestr(const char *s1, const char *s2) {
   99|  3.49k|	const char *s = s1;
  100|  3.49k|	const char *p = s2;
  101|  3.49k|	if ((s == NULL) || (p == NULL))
  ------------------
  |  Branch (101:6): [True: 0, False: 3.49k]
  |  Branch (101:21): [True: 0, False: 3.49k]
  ------------------
  102|      0|		return NULL;
  103|  25.9M|	do {
  104|  25.9M|		if (!*p)
  ------------------
  |  Branch (104:7): [True: 34, False: 25.9M]
  ------------------
  105|     34|			return s1;
  106|  25.9M|		if ((*p == *s) || (tolower(*p) == tolower(*s))) {
  ------------------
  |  Branch (106:7): [True: 103k, False: 25.8M]
  |  Branch (106:21): [True: 108k, False: 25.7M]
  |  Branch (106:22): [True: 0, False: 0]
  |  Branch (106:22): [True: 0, False: 0]
  |  Branch (106:22): [Folded, False: 25.8M]
  |  Branch (106:37): [True: 0, False: 0]
  |  Branch (106:37): [True: 0, False: 0]
  |  Branch (106:37): [Folded, False: 25.8M]
  ------------------
  107|   212k|			++p;
  108|   212k|			++s;
  109|  25.7M|		} else {
  110|  25.7M|			p = s2;
  111|  25.7M|			if (!*s)
  ------------------
  |  Branch (111:8): [True: 3.46k, False: 25.7M]
  ------------------
  112|  3.46k|				return NULL;
  113|  25.7M|			s = ++s1;
  114|  25.7M|		}
  115|  25.9M|	} while (1);
  ------------------
  |  Branch (115:11): [True: 25.9M, Folded]
  ------------------
  116|  3.49k|}
oidc_util_issuer_match:
  346|  3.49k|apr_byte_t oidc_util_issuer_match(const char *a, const char *b) {
  347|       |
  348|       |	/* check the "issuer" value against the one configure for the provider we got this id_token from */
  349|  3.49k|	if (_oidc_strcmp(a, b) != 0) {
  ------------------
  |  Branch (349:6): [True: 3.49k, False: 2]
  ------------------
  350|       |
  351|       |		/* no strict match, but we are going to accept if the difference is only a trailing slash */
  352|  3.49k|		int n1 = (int)_oidc_strlen(a);
  353|  3.49k|		int n2 = (int)_oidc_strlen(b);
  354|  3.49k|		int n = 0;
  355|  3.49k|		if ((n1 == n2 + 1) && (a[n1 - 1] == OIDC_CHAR_FORWARD_SLASH))
  ------------------
  |  |  195|    151|#define OIDC_CHAR_FORWARD_SLASH '/'
  ------------------
  |  Branch (355:7): [True: 151, False: 3.34k]
  |  Branch (355:25): [True: 138, False: 13]
  ------------------
  356|    138|			n = n2;
  357|  3.35k|		else if ((n2 == n1 + 1) && (b[n2 - 1] == OIDC_CHAR_FORWARD_SLASH))
  ------------------
  |  |  195|     13|#define OIDC_CHAR_FORWARD_SLASH '/'
  ------------------
  |  Branch (357:12): [True: 13, False: 3.34k]
  |  Branch (357:30): [True: 1, False: 12]
  ------------------
  358|      1|			n = n1;
  359|  3.49k|		if ((n == 0) || (_oidc_strncmp(a, b, n) != 0))
  ------------------
  |  Branch (359:7): [True: 3.35k, False: 139]
  |  Branch (359:19): [True: 136, False: 3]
  ------------------
  360|  3.49k|			return FALSE;
  ------------------
  |  |   51|  3.49k|#define FALSE 0
  ------------------
  361|  3.49k|	}
  362|       |
  363|      5|	return TRUE;
  ------------------
  |  |   55|      5|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      5|#define FALSE 0
  |  |  ------------------
  ------------------
  364|  3.49k|}
oidc_util_spaced_string_to_hashtable:
  369|  6.99k|apr_hash_t *oidc_util_spaced_string_to_hashtable(apr_pool_t *pool, const char *str) {
  370|  6.99k|	const char *val;
  371|  6.99k|	const char *data = apr_pstrdup(pool, str);
  372|  6.99k|	apr_hash_t *result = apr_hash_make(pool);
  373|   931k|	while (data && (*data)) {
  ------------------
  |  Branch (373:9): [True: 931k, False: 0]
  |  Branch (373:17): [True: 924k, False: 6.99k]
  ------------------
  374|   924k|		val = ap_getword_white(pool, &data);
  375|   924k|		if (val == NULL)
  ------------------
  |  Branch (375:7): [True: 0, False: 924k]
  ------------------
  376|      0|			break;
  377|   924k|		apr_hash_set(result, val, APR_HASH_KEY_STRING, val);
  ------------------
  |  |   47|   924k|#define APR_HASH_KEY_STRING     (-1)
  ------------------
  378|   924k|	}
  379|  6.99k|	return result;
  380|  6.99k|}
oidc_util_spaced_string_equals:
  385|  1.74k|apr_byte_t oidc_util_spaced_string_equals(apr_pool_t *pool, const char *a, const char *b) {
  386|       |
  387|  1.74k|	const void *k = NULL;
  388|  1.74k|	void *v = NULL;
  389|       |
  390|       |	/* parse both entries as hash tables */
  391|  1.74k|	apr_hash_t *ht_a = oidc_util_spaced_string_to_hashtable(pool, a);
  392|  1.74k|	apr_hash_t *ht_b = oidc_util_spaced_string_to_hashtable(pool, b);
  393|       |
  394|       |	/* first compare the length of both response_types */
  395|  1.74k|	if (apr_hash_count(ht_a) != apr_hash_count(ht_b))
  ------------------
  |  Branch (395:6): [True: 1.56k, False: 188]
  ------------------
  396|  1.56k|		return FALSE;
  ------------------
  |  |   51|  1.56k|#define FALSE 0
  ------------------
  397|       |
  398|       |	/* then loop over all entries */
  399|    192|	for (apr_hash_index_t *hi = apr_hash_first(NULL, ht_a); hi; hi = apr_hash_next(hi)) {
  ------------------
  |  Branch (399:58): [True: 191, False: 1]
  ------------------
  400|    191|		apr_hash_this(hi, &k, NULL, &v);
  401|    191|		if (apr_hash_get(ht_b, k, APR_HASH_KEY_STRING) == NULL)
  ------------------
  |  |   47|    191|#define APR_HASH_KEY_STRING     (-1)
  ------------------
  |  Branch (401:7): [True: 187, False: 4]
  ------------------
  402|    187|			return FALSE;
  ------------------
  |  |   51|    187|#define FALSE 0
  ------------------
  403|    191|	}
  404|       |
  405|       |	/* if we've made it this far, a an b are equal in length and every element in a is in b */
  406|      1|	return TRUE;
  ------------------
  |  |   55|      1|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      1|#define FALSE 0
  |  |  ------------------
  ------------------
  407|    188|}
oidc_util_spaced_string_contains:
  412|  1.74k|apr_byte_t oidc_util_spaced_string_contains(apr_pool_t *pool, const char *str, const char *match) {
  413|  1.74k|	if ((str == NULL) || (match == NULL))
  ------------------
  |  Branch (413:6): [True: 0, False: 1.74k]
  |  Branch (413:23): [True: 0, False: 1.74k]
  ------------------
  414|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  415|  1.74k|	apr_hash_t *ht = oidc_util_spaced_string_to_hashtable(pool, str);
  416|  1.74k|	return (apr_hash_get(ht, match, APR_HASH_KEY_STRING) != NULL);
  ------------------
  |  |   47|  1.74k|#define APR_HASH_KEY_STRING     (-1)
  ------------------
  417|  1.74k|}
oidc_util_table_add_query_encoded_params:
  422|  1.74k|void oidc_util_table_add_query_encoded_params(apr_pool_t *pool, apr_table_t *table, const char *params) {
  423|  1.74k|	char *key = NULL;
  424|  1.74k|	char *value = NULL;
  425|  1.74k|	const char *v = NULL;
  426|  1.74k|	const char *p = params;
  427|  30.5k|	while (p && (*p)) {
  ------------------
  |  Branch (427:9): [True: 30.5k, False: 0]
  |  Branch (427:14): [True: 28.7k, False: 1.74k]
  ------------------
  428|  28.7k|		v = ap_getword(pool, &p, OIDC_CHAR_AMP);
  ------------------
  |  |  197|  28.7k|#define OIDC_CHAR_AMP '&'
  ------------------
  429|  28.7k|		if (v == NULL)
  ------------------
  |  Branch (429:7): [True: 0, False: 28.7k]
  ------------------
  430|      0|			break;
  431|  28.7k|		key = apr_pstrdup(pool, ap_getword(pool, &v, OIDC_CHAR_EQUAL));
  ------------------
  |  |  187|  28.7k|#define OIDC_CHAR_EQUAL '='
  ------------------
  432|  28.7k|		ap_unescape_url(key);
  433|  28.7k|		value = apr_pstrdup(pool, v);
  434|  28.7k|		ap_unescape_url(value);
  435|  28.7k|		apr_table_addn(table, key, value);
  436|  28.7k|	}
  437|  1.74k|}
oidc_util_log_mask_secrets:
  462|  3.49k|apr_byte_t oidc_util_log_mask_secrets(request_rec *r) {
  463|  3.49k|	const oidc_cfg_t *cfg = NULL;
  464|  3.49k|	if (r == NULL)
  ------------------
  |  Branch (464:6): [True: 0, False: 3.49k]
  ------------------
  465|      0|		return TRUE;
  ------------------
  |  |   55|      0|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      0|#define FALSE 0
  |  |  ------------------
  ------------------
  466|  3.49k|	cfg = ap_get_module_config(r->server->module_config, &auth_openidc_module);
  ------------------
  |  |  551|  3.49k|    (((void **)(v))[(m)->module_index])
  ------------------
  467|  3.49k|	if (cfg == NULL)
  ------------------
  |  Branch (467:6): [True: 0, False: 3.49k]
  ------------------
  468|      0|		return TRUE;
  ------------------
  |  |   55|      0|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      0|#define FALSE 0
  |  |  ------------------
  ------------------
  469|  3.49k|	return (oidc_cfg_debug_mask_secrets_get(cfg) != 0) ? TRUE : FALSE;
  ------------------
  |  |   55|  3.49k|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|  3.49k|#define FALSE 0
  |  |  ------------------
  ------------------
              	return (oidc_cfg_debug_mask_secrets_get(cfg) != 0) ? TRUE : FALSE;
  ------------------
  |  |   51|  3.49k|#define FALSE 0
  ------------------
  |  Branch (469:9): [True: 3.49k, False: 0]
  ------------------
  470|  3.49k|}
oidc_util_strcmp_const_time:
  491|  1.74k|apr_byte_t oidc_util_strcmp_const_time(const char *a, const char *b) {
  492|  1.74k|	apr_size_t len_a = 0;
  493|  1.74k|	apr_size_t len_b = 0;
  494|       |
  495|  1.74k|	if ((a == NULL) || (b == NULL))
  ------------------
  |  Branch (495:6): [True: 0, False: 1.74k]
  |  Branch (495:21): [True: 0, False: 1.74k]
  ------------------
  496|      0|		return (a == b) ? TRUE : FALSE;
  ------------------
  |  |   55|      0|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      0|#define FALSE 0
  |  |  ------------------
  ------------------
              		return (a == b) ? TRUE : FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  |  Branch (496:10): [True: 0, False: 0]
  ------------------
  497|       |
  498|  1.74k|	len_a = _oidc_strlen(a);
  499|  1.74k|	len_b = _oidc_strlen(b);
  500|       |
  501|  1.74k|	if (len_a != len_b)
  ------------------
  |  Branch (501:6): [True: 1.73k, False: 14]
  ------------------
  502|  1.73k|		return FALSE;
  ------------------
  |  |   51|  1.73k|#define FALSE 0
  ------------------
  503|       |
  504|     14|	return (CRYPTO_memcmp(a, b, len_a) == 0) ? TRUE : FALSE;
  ------------------
  |  |   55|      1|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      1|#define FALSE 0
  |  |  ------------------
  ------------------
              	return (CRYPTO_memcmp(a, b, len_a) == 0) ? TRUE : FALSE;
  ------------------
  |  |   51|     27|#define FALSE 0
  ------------------
  |  Branch (504:9): [True: 1, False: 13]
  ------------------
  505|  1.74k|}
oidc_util_hostname_endswith:
  534|  6.99k|apr_byte_t oidc_util_hostname_endswith(const char *hostname, const char *suffix) {
  535|  6.99k|	size_t hlen;
  536|  6.99k|	size_t slen;
  537|  6.99k|	const char *tail = NULL;
  538|  6.99k|	if ((hostname == NULL) || (suffix == NULL))
  ------------------
  |  Branch (538:6): [True: 0, False: 6.99k]
  |  Branch (538:28): [True: 0, False: 6.99k]
  ------------------
  539|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  540|  6.99k|	hlen = _oidc_strlen(hostname);
  541|  6.99k|	slen = _oidc_strlen(suffix);
  542|  6.99k|	if ((slen == 0) || (hlen < slen))
  ------------------
  |  Branch (542:6): [True: 3, False: 6.98k]
  |  Branch (542:21): [True: 2.92k, False: 4.06k]
  ------------------
  543|  2.92k|		return FALSE;
  ------------------
  |  |   51|  2.92k|#define FALSE 0
  ------------------
  544|  4.06k|	tail = hostname + (hlen - slen);
  545|  4.06k|	if (_oidc_strnatcasecmp(tail, suffix) != 0)
  ------------------
  |  Branch (545:6): [True: 3.93k, False: 138]
  ------------------
  546|  3.93k|		return FALSE;
  ------------------
  |  |   51|  3.93k|#define FALSE 0
  ------------------
  547|    138|	return ((tail == hostname) || (*(tail - 1) == '.')) ? TRUE : FALSE;
  ------------------
  |  |   55|     67|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|     67|#define FALSE 0
  |  |  ------------------
  ------------------
              	return ((tail == hostname) || (*(tail - 1) == '.')) ? TRUE : FALSE;
  ------------------
  |  |   51|    209|#define FALSE 0
  ------------------
  |  Branch (547:10): [True: 2, False: 136]
  |  Branch (547:32): [True: 65, False: 71]
  ------------------
  548|  4.06k|}
oidc_util_cookie_domain_valid:
  553|  3.49k|apr_byte_t oidc_util_cookie_domain_valid(const char *hostname, const char *cookie_domain) {
  554|  3.49k|	const char *check_cookie = cookie_domain;
  555|  3.49k|	if (check_cookie == NULL)
  ------------------
  |  Branch (555:6): [True: 0, False: 3.49k]
  ------------------
  556|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  557|       |	// Skip past the first char of a cookie_domain that starts
  558|       |	// with a ".", ASCII 46
  559|  3.49k|	if (check_cookie[0] == 46)
  ------------------
  |  Branch (559:6): [True: 1.76k, False: 1.73k]
  ------------------
  560|  1.76k|		check_cookie++;
  561|  3.49k|	return oidc_util_hostname_endswith(hostname, check_cookie);
  562|  3.49k|}

fuzz_strings.c:fuzz_strndup:
   43|  1.74k|static inline char *fuzz_strndup(apr_pool_t *pool, const uint8_t *data, size_t size) {
   44|  1.74k|	char *s = apr_palloc(pool, size + 1);
   45|  1.74k|	if (size > 0)
  ------------------
  |  Branch (45:6): [True: 1.74k, False: 0]
  ------------------
   46|  1.74k|		memcpy(s, data, size);
   47|  1.74k|	s[size] = '\0';
   48|  1.74k|	return s;
   49|  1.74k|}

LLVMFuzzerInitialize:
   48|      2|int LLVMFuzzerInitialize(int *argc, char ***argv) {
   49|      2|	(void)argc;
   50|      2|	(void)argv;
   51|      2|	if (!g_ready) {
  ------------------
  |  Branch (51:6): [True: 2, False: 0]
  ------------------
   52|      2|		oidc_test_setup();
   53|      2|		g_ready = 1;
   54|      2|	}
   55|      2|	return 0;
   56|      2|}
LLVMFuzzerTestOneInput:
   58|  1.74k|int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
   59|  1.74k|	if (!g_ready)
  ------------------
  |  Branch (59:6): [True: 0, False: 1.74k]
  ------------------
   60|      0|		LLVMFuzzerInitialize(NULL, NULL);
   61|       |
   62|  1.74k|	apr_pool_t *pool = NULL;
   63|  1.74k|	apr_pool_create(&pool, oidc_test_pool_get());
  ------------------
  |  |  323|  1.74k|    apr_pool_create_ex(newpool, parent, NULL, NULL)
  ------------------
   64|       |
   65|       |	/* shallow copy of the fixture request with a per-input pool and a fresh headers_in */
   66|  1.74k|	request_rec r = *oidc_test_request_get();
   67|  1.74k|	r.pool = pool;
   68|  1.74k|	r.headers_in = apr_table_make(pool, 4);
   69|       |
   70|  1.74k|	const char *s = fuzz_strndup(pool, data, size);
   71|       |
   72|       |	/* URL encoding: decode, encode, and the round trip */
   73|  1.74k|	oidc_http_url_encode(&r, oidc_http_url_decode(&r, s));
   74|  1.74k|	oidc_http_url_decode(&r, oidc_http_url_encode(&r, s));
   75|       |
   76|       |	/* escaping of values echoed into pages, and header-name normalization */
   77|  1.74k|	oidc_util_html_escape(pool, s);
   78|  1.74k|	oidc_util_html_javascript_escape(pool, s);
   79|  1.74k|	oidc_http_hdr_normalize_name(&r, s);
   80|       |
   81|       |	/* host name checks, both as the host and as the configured domain/suffix */
   82|  1.74k|	oidc_util_cookie_domain_valid("www.example.com", s);
   83|  1.74k|	oidc_util_cookie_domain_valid(s, ".example.com");
   84|  1.74k|	oidc_util_hostname_endswith(s, "example.com");
   85|  1.74k|	oidc_util_hostname_endswith("www.example.com", s);
   86|       |
   87|       |	/* substring search and comparisons */
   88|  1.74k|	oidc_util_strcasestr(s, "needle");
   89|  1.74k|	oidc_util_strcasestr("a haystack with a Needle in it", s);
   90|  1.74k|	oidc_util_issuer_match(s, "https://idp.example.com");
   91|  1.74k|	oidc_util_issuer_match("https://idp.example.com/", s);
   92|  1.74k|	oidc_util_spaced_string_equals(pool, s, "code id_token");
   93|  1.74k|	oidc_util_spaced_string_contains(pool, s, "openid");
   94|  1.74k|	oidc_util_spaced_string_to_hashtable(pool, s);
   95|  1.74k|	oidc_util_strcmp_const_time(s, "a-fixed-comparison-value");
   96|       |
   97|       |	/* the query string splitter */
   98|  1.74k|	apr_table_t *params = apr_table_make(pool, 8);
   99|  1.74k|	oidc_util_table_add_query_encoded_params(pool, params, s);
  100|       |
  101|       |	/* the pre-verification JOSE header peek, kid-only and all-fields */
  102|  1.74k|	char *alg = NULL;
  103|  1.74k|	char *enc = NULL;
  104|  1.74k|	char *kid = NULL;
  105|  1.74k|	oidc_proto_jwt_header_peek(&r, s, NULL, NULL, &kid);
  106|  1.74k|	oidc_proto_jwt_header_peek(&r, s, &alg, &enc, &kid);
  107|       |
  108|       |	/* the state fingerprint over the forwarded-for and user-agent headers, and the Accept check */
  109|  1.74k|	apr_table_set(r.headers_in, "X-Forwarded-For", s);
  110|  1.74k|	apr_table_set(r.headers_in, "User-Agent", s);
  111|  1.74k|	apr_table_set(r.headers_in, "Accept", s);
  112|  1.74k|	oidc_state_browser_fingerprint(&r, oidc_test_cfg_get(), s);
  113|  1.74k|	oidc_http_hdr_in_accept_contains(&r, "application/json");
  114|       |
  115|       |	/* the https-URL validator run on values from responses */
  116|  1.74k|	oidc_cfg_parse_is_valid_url(pool, s, "https");
  117|  1.74k|	oidc_cfg_parse_is_valid_http_url(pool, s);
  118|       |
  119|       |	/* the log redaction scanners */
  120|  1.74k|	oidc_http_param_is_sensitive(s);
  121|  1.74k|	oidc_http_redact_body_for_log(&r, s);
  122|  1.74k|	oidc_http_redact_json_for_log(&r, s);
  123|       |
  124|  1.74k|	apr_pool_destroy(pool);
  125|  1.74k|	return 0;
  126|  1.74k|}

ap_unixd_set_global_mutex_perms:
   60|      4|AP_DECLARE(apr_status_t) ap_unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex) {
   61|      4|	return 0;
   62|      4|}
oidc_test_set_auth_type:
   69|      2|void oidc_test_set_auth_type(const char *auth_type) {
   70|      2|	stub_auth_type = (auth_type != NULL) ? auth_type : "openid-connect";
  ------------------
  |  Branch (70:19): [True: 0, False: 2]
  ------------------
   71|      2|}
ap_getword:
   96|  57.5k|AP_DECLARE(char *) ap_getword(apr_pool_t *atrans, const char **line, char stop) {
   97|  57.5k|	const char *pos = *line;
   98|  57.5k|	int len;
   99|  57.5k|	char *res;
  100|       |
  101|  43.5M|	while ((*pos != stop) && *pos) {
  ------------------
  |  Branch (101:9): [True: 43.4M, False: 37.5k]
  |  Branch (101:27): [True: 43.4M, False: 20.0k]
  ------------------
  102|  43.4M|		++pos;
  103|  43.4M|	}
  104|       |
  105|  57.5k|	len = (int)(pos - *line);
  106|  57.5k|	res = apr_pstrmemdup(atrans, *line, len);
  107|       |
  108|  57.5k|	if (stop) {
  ------------------
  |  Branch (108:6): [True: 57.5k, False: 0]
  ------------------
  109|  3.23M|		while (*pos == stop) {
  ------------------
  |  Branch (109:10): [True: 3.17M, False: 57.5k]
  ------------------
  110|  3.17M|			++pos;
  111|  3.17M|		}
  112|  57.5k|	}
  113|  57.5k|	*line = pos;
  114|       |
  115|  57.5k|	return res;
  116|  57.5k|}
ap_getword_white:
  191|   924k|AP_DECLARE(char *) ap_getword_white(apr_pool_t *atrans, const char **line) {
  192|   924k|	const char *pos = *line;
  193|   924k|	int len;
  194|   924k|	char *res;
  195|       |
  196|  83.7M|	while (!apr_isspace(*pos) && *pos) {
  ------------------
  |  |  225|   167M|#define apr_isspace(c) (isspace(((unsigned char)(c))))
  ------------------
  |  Branch (196:9): [True: 82.8M, False: 918k]
  |  Branch (196:31): [True: 82.8M, False: 6.65k]
  ------------------
  197|  82.8M|		++pos;
  198|  82.8M|	}
  199|       |
  200|   924k|	len = (int)(pos - *line);
  201|   924k|	res = apr_pstrmemdup(atrans, *line, len);
  202|       |
  203|  2.92M|	while (apr_isspace(*pos)) {
  ------------------
  |  |  225|  2.92M|#define apr_isspace(c) (isspace(((unsigned char)(c))))
  |  |  ------------------
  |  |  |  Branch (225:24): [True: 2.00M, False: 924k]
  |  |  ------------------
  ------------------
  204|  2.00M|		++pos;
  205|  2.00M|	}
  206|       |
  207|   924k|	*line = pos;
  208|       |
  209|   924k|	return res;
  210|   924k|}
ap_log_rerror_:
  313|  3.48k|	       const char *fmt, ...) {
  314|  3.48k|	if (level < APLOG_DEBUG) {
  ------------------
  |  |   50|  3.48k|#define APLOG_DEBUG     LOG_DEBUG       /* debug-level messages */
  ------------------
  |  Branch (314:6): [True: 3.48k, False: 0]
  ------------------
  315|  3.48k|		fprintf(stderr, "%s:%d [%d] [%d] ", file, line, level, status);
  316|  3.48k|		va_list ap;
  317|  3.48k|		va_start(ap, fmt);
  318|  3.48k|		vfprintf(stderr, fmt, ap);
  319|  3.48k|		va_end(ap);
  320|       |		fprintf(stderr, "\n");
  321|  3.48k|	}
  322|  3.48k|}
ap_unescape_url:
  376|  57.5k|AP_DECLARE(int) ap_unescape_url(char *url) {
  377|  57.5k|	return 0;
  378|  57.5k|}

oidc_test_setup:
  204|      2|void oidc_test_setup(void) {
  205|      2|	apr_initialize();
  206|      2|	oidc_pre_config_init();
  207|       |	/* reset the stubbed AuthType so a test that changed it does not leak into
  208|       |	 * the next one under CK_FORK=no */
  209|      2|	oidc_test_set_auth_type(NULL);
  210|       |	apr_pool_create(&pool, NULL);
  ------------------
  |  |  323|      2|    apr_pool_create_ex(newpool, parent, NULL, NULL)
  ------------------
  211|      2|	request = oidc_test_request_init(pool);
  212|      2|}
oidc_test_pool_get:
  277|  1.74k|apr_pool_t *oidc_test_pool_get(void) {
  278|  1.74k|	return pool;
  279|  1.74k|}
oidc_test_request_get:
  281|  1.74k|request_rec *oidc_test_request_get(void) {
  282|  1.74k|	return request;
  283|  1.74k|}
oidc_test_cfg_get:
  285|  1.74k|oidc_cfg_t *oidc_test_cfg_get(void) {
  286|  1.74k|	return (oidc_cfg_t *)ap_get_module_config(request->server->module_config, &auth_openidc_module);
  ------------------
  |  |  551|  1.74k|    (((void **)(v))[(m)->module_index])
  ------------------
  287|  1.74k|}
util.c:oidc_test_request_init:
  107|      2|static request_rec *oidc_test_request_init(apr_pool_t *pool) {
  108|      2|	const unsigned int kIdx = 0;
  109|      2|	const unsigned int kEls = kIdx + 1;
  110|      2|	request_rec *request = (request_rec *)apr_pcalloc(pool, sizeof(request_rec));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  111|       |
  112|      2|	apr_pool_create(&request->pool, pool);
  ------------------
  |  |  323|      2|    apr_pool_create_ex(newpool, parent, NULL, NULL)
  ------------------
  113|       |
  114|      2|	request->subprocess_env = apr_table_make(request->pool, 0);
  115|      2|	request->notes = apr_table_make(request->pool, 0);
  116|       |
  117|      2|	request->headers_in = apr_table_make(request->pool, 0);
  118|      2|	request->headers_out = apr_table_make(request->pool, 0);
  119|      2|	request->err_headers_out = apr_table_make(request->pool, 0);
  120|       |
  121|      2|	apr_table_set(request->headers_in, "Host", "www.example.com");
  122|      2|	apr_table_set(request->headers_in, "OIDC_foo", "some-value");
  123|      2|	apr_table_set(request->headers_in, "Cookie",
  124|      2|		      "foo=bar; "
  125|      2|		      "mod_auth_openidc_session"
  126|      2|		      "=0123456789abcdef; baz=zot");
  127|       |
  128|      2|	request->server = apr_pcalloc(pool, sizeof(struct server_rec));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  129|      2|	request->server->process = apr_pcalloc(pool, sizeof(struct process_rec));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  130|      2|	apr_pool_create(&request->server->process->pool, pool);
  ------------------
  |  |  323|      2|    apr_pool_create_ex(newpool, parent, NULL, NULL)
  ------------------
  131|      2|	apr_pool_create(&request->server->process->pconf, pool);
  ------------------
  |  |  323|      2|    apr_pool_create_ex(newpool, parent, NULL, NULL)
  ------------------
  132|      2|	request->connection = apr_pcalloc(pool, sizeof(struct conn_rec));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  133|      2|	request->connection->bucket_alloc = apr_bucket_alloc_create(pool);
  134|      2|	request->connection->local_addr = apr_pcalloc(pool, sizeof(apr_sockaddr_t));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  135|       |	/* minimal output filter carrying the request so the ap_pass_brigade stub
  136|       |	 * can capture sent response bodies into the "sent_body" request state */
  137|      2|	request->output_filters = apr_pcalloc(pool, sizeof(ap_filter_t));
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  138|      2|	request->output_filters->r = request;
  139|       |
  140|      2|	apr_pool_userdata_set("https", "scheme", NULL, request->pool);
  141|      2|	request->server->server_hostname = "www.example.com";
  142|      2|	request->connection->local_addr->port = 4433;
  143|      2|	request->unparsed_uri = "/bla?foo=bar&param1=value1";
  144|      2|	request->args = "foo=bar&param1=value1";
  145|      2|	apr_uri_parse(request->pool, "https://www.example.com/bla?foo=bar&param1=value1", &request->parsed_uri);
  146|       |
  147|      2|	auth_openidc_module.module_index = kIdx;
  148|      2|	oidc_cfg_t *cfg = oidc_cfg_server_create(request->server->process->pconf, request->server);
  149|       |
  150|      2|	oidc_cfg_provider_issuer_set(request->server->process->pconf, oidc_cfg_provider_get(cfg),
  151|      2|				     "https://idp.example.com");
  152|      2|	oidc_cfg_provider_authorization_endpoint_url_set(request->server->process->pconf, oidc_cfg_provider_get(cfg),
  153|      2|							 "https://idp.example.com/authorize");
  154|      2|	oidc_cfg_provider_client_id_set(request->server->process->pconf, oidc_cfg_provider_get(cfg), "client_id");
  155|       |
  156|      2|	cfg->redirect_uri = "https://www.example.com/protected/";
  157|       |
  158|      2|	oidc_dir_cfg_t *d_cfg = oidc_cfg_dir_config_create(request->server->process->pconf, NULL);
  159|       |
  160|       |	// coverity[suspicious_sizeof]
  161|      2|	request->server->module_config = apr_pcalloc(request->server->process->pconf, sizeof(void *) * kEls);
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  162|       |	// coverity[suspicious_sizeof]
  163|      2|	request->per_dir_config = apr_pcalloc(request->server->process->pconf, sizeof(void *) * kEls);
  ------------------
  |  |  465|      2|#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size)
  ------------------
  164|      2|	ap_set_module_config(request->server->module_config, &auth_openidc_module, cfg);
  ------------------
  |  |  553|      2|    ((((void **)(v))[(m)->module_index]) = (val))
  ------------------
  165|      2|	ap_set_module_config(request->per_dir_config, &auth_openidc_module, d_cfg);
  ------------------
  |  |  553|      2|    ((((void **)(v))[(m)->module_index]) = (val))
  ------------------
  166|       |
  167|       |	// TODO:
  168|      2|	cfg->public_keys = apr_array_make(request->server->process->pconf, 1, sizeof(const char *));
  169|      2|	cfg->private_keys = apr_array_make(request->server->process->pconf, 1, sizeof(const char *));
  170|       |
  171|      2|	cfg->crypto_passphrase.secret1 = "12345678901234567890123456789012";
  172|      2|	if (oidc_test_crypto_passphrase_derive_keys_cached(&cfg->crypto_passphrase) == FALSE) {
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  |  Branch (172:6): [True: 0, False: 2]
  ------------------
  173|      0|		fprintf(stderr, "oidc_cfg_crypto_passphrase_derive_keys failed!\n");
  174|      0|		exit(-1);
  175|      0|	}
  176|      2|	cfg->cache.impl = &oidc_cache_shm;
  177|      2|	cfg->cache.cfg = NULL;
  178|      2|	cfg->cache.shm_size_max = 500;
  179|      2|	const char *shm_size = getenv("OIDC_TEST_SHM_SIZE");
  180|      2|	if (shm_size != NULL) {
  ------------------
  |  Branch (180:6): [True: 0, False: 2]
  ------------------
  181|      0|		char *end = NULL;
  182|      0|		long parsed = strtol(shm_size, &end, 10);
  183|      0|		if ((end != shm_size) && (*end == '\0') && (parsed >= 128) && (parsed <= 1000000))
  ------------------
  |  Branch (183:7): [True: 0, False: 0]
  |  Branch (183:28): [True: 0, False: 0]
  |  Branch (183:46): [True: 0, False: 0]
  |  Branch (183:65): [True: 0, False: 0]
  ------------------
  184|      0|			cfg->cache.shm_size_max = (int)parsed;
  185|      0|	}
  186|      2|	cfg->cache.shm_entry_size_max = 16384 + 255 + 17;
  187|      2|	cfg->cache.encrypt = 1;
  188|       |	/* full post-config so the cache backend AND the shared refresh-grant mutex get set up */
  189|      2|	if (oidc_cfg_post_config(request->server->process->pconf, cfg, request->server) != OK) {
  ------------------
  |  |  456|      2|#define OK 0                    /**< Module has handled this stage. */
  ------------------
  |  Branch (189:6): [True: 0, False: 2]
  ------------------
  190|      0|		fprintf(stderr, "oidc_cfg_post_config failed!\n");
  191|      0|		exit(-1);
  192|      0|	}
  193|       |
  194|      2|	if (oidc_cfg_dir_post_config(request->server) != OK) {
  ------------------
  |  |  456|      2|#define OK 0                    /**< Module has handled this stage. */
  ------------------
  |  Branch (194:6): [True: 0, False: 2]
  ------------------
  195|      0|		fprintf(stderr, "oidc_cfg_dir_post_config failed!\n");
  196|      0|		exit(-1);
  197|      0|	}
  198|       |
  199|      2|	oidc_http_curl_pool_init(request->server->process->pconf);
  200|       |
  201|      2|	return request;
  202|      2|}
util.c:oidc_test_crypto_passphrase_derive_keys_cached:
   93|      2|static apr_byte_t oidc_test_crypto_passphrase_derive_keys_cached(oidc_crypto_passphrase_t *cp) {
   94|      2|	if ((cp->secret1 != NULL) && (_oidc_strlen(cp->secret1) > 0) && (cp->derived_key1_set == FALSE)) {
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  |  Branch (94:6): [True: 2, False: 0]
  |  Branch (94:31): [True: 2, False: 0]
  |  Branch (94:66): [True: 2, False: 0]
  ------------------
   95|      2|		if (oidc_test_key_derive_cached(cp->secret1, cp->derived_key1) == FALSE)
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  |  Branch (95:7): [True: 0, False: 2]
  ------------------
   96|      0|			return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
   97|      2|		cp->derived_key1_set = TRUE;
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
   98|      2|	}
   99|      2|	if ((cp->secret2 != NULL) && (_oidc_strlen(cp->secret2) > 0) && (cp->derived_key2_set == FALSE)) {
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  |  Branch (99:6): [True: 0, False: 2]
  |  Branch (99:31): [True: 0, False: 0]
  |  Branch (99:66): [True: 0, False: 0]
  ------------------
  100|      0|		if (oidc_test_key_derive_cached(cp->secret2, cp->derived_key2) == FALSE)
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  |  Branch (100:7): [True: 0, False: 0]
  ------------------
  101|      0|			return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
  102|      0|		cp->derived_key2_set = TRUE;
  ------------------
  |  |   55|      0|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      0|#define FALSE 0
  |  |  ------------------
  ------------------
  103|      0|	}
  104|      2|	return TRUE;
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
  105|      2|}
util.c:oidc_test_key_derive_cached:
   68|      2|static apr_byte_t oidc_test_key_derive_cached(const char *secret, unsigned char *out) {
   69|      2|	int i;
   70|      2|	for (i = 0; i < oidc_test_kdf_cache_n; i++) {
  ------------------
  |  Branch (70:14): [True: 0, False: 2]
  ------------------
   71|      0|		if (_oidc_strcmp(oidc_test_kdf_cache[i].secret, secret) == 0) {
  ------------------
  |  Branch (71:7): [True: 0, False: 0]
  ------------------
   72|      0|			_oidc_memcpy(out, oidc_test_kdf_cache[i].key, OIDC_CRYPTO_PASSPHRASE_DERIVED_KEY_LEN);
  ------------------
  |  |   85|      0|#define _oidc_memcpy(__dst, __src, __n) memcpy(__dst, __src, __n)
  ------------------
   73|      0|			return TRUE;
  ------------------
  |  |   55|      0|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      0|#define FALSE 0
  |  |  ------------------
  ------------------
   74|      0|		}
   75|      0|	}
   76|      2|	if (oidc_util_key_derive_passphrase_key(secret, out, OIDC_CRYPTO_PASSPHRASE_DERIVED_KEY_LEN) == FALSE)
  ------------------
  |  |  113|      2|#define OIDC_CRYPTO_PASSPHRASE_DERIVED_KEY_LEN 32
  ------------------
              	if (oidc_util_key_derive_passphrase_key(secret, out, OIDC_CRYPTO_PASSPHRASE_DERIVED_KEY_LEN) == FALSE)
  ------------------
  |  |   51|      2|#define FALSE 0
  ------------------
  |  Branch (76:6): [True: 0, False: 2]
  ------------------
   77|      0|		return FALSE;
  ------------------
  |  |   51|      0|#define FALSE 0
  ------------------
   78|      2|	if ((oidc_test_kdf_cache_n < OIDC_TEST_KDF_CACHE_MAX) &&
  ------------------
  |  |   61|      2|#define OIDC_TEST_KDF_CACHE_MAX 32
  ------------------
  |  Branch (78:6): [True: 2, False: 0]
  ------------------
   79|      2|	    (_oidc_strlen(secret) < sizeof(oidc_test_kdf_cache[0].secret))) {
  ------------------
  |  Branch (79:6): [True: 2, False: 0]
  ------------------
   80|      2|		_oidc_strcpy(oidc_test_kdf_cache[oidc_test_kdf_cache_n].secret, secret);
  ------------------
  |  |   86|      2|#define _oidc_strcpy(__dst, __src) strcpy(__dst, __src)
  ------------------
   81|      2|		_oidc_memcpy(oidc_test_kdf_cache[oidc_test_kdf_cache_n].key, out,
  ------------------
  |  |   85|      2|#define _oidc_memcpy(__dst, __src, __n) memcpy(__dst, __src, __n)
  ------------------
   82|      2|			     OIDC_CRYPTO_PASSPHRASE_DERIVED_KEY_LEN);
   83|      2|		oidc_test_kdf_cache_n++;
   84|      2|	}
   85|      2|	return TRUE;
  ------------------
  |  |   55|      2|#define TRUE (!FALSE)
  |  |  ------------------
  |  |  |  |   51|      2|#define FALSE 0
  |  |  ------------------
  ------------------
   86|      2|}

