| 2554 | } |
| 2555 | |
| 2556 | static const char *urlsection(cmd_parms *cmd, void *mconfig, const char *arg) |
| 2557 | { |
| 2558 | const char *errmsg; |
| 2559 | const char *endp = ap_strrchr_c(arg, '>'); |
| 2560 | int old_overrides = cmd->override; |
| 2561 | char *old_path = cmd->path; |
| 2562 | core_dir_config *conf; |
| 2563 | ap_regex_t *r = NULL; |
| 2564 | const command_rec *thiscmd = cmd->cmd; |
| 2565 | ap_conf_vector_t *new_url_conf = ap_create_per_dir_config(cmd->pool); |
| 2566 | const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_CONTEXT); |
| 2567 | if (err != NULL) { |
| 2568 | return err; |
| 2569 | } |
| 2570 | |
| 2571 | if (endp == NULL) { |
| 2572 | return unclosed_directive(cmd); |
| 2573 | } |
| 2574 | |
| 2575 | arg = apr_pstrndup(cmd->temp_pool, arg, endp - arg); |
| 2576 | |
| 2577 | if (!arg[0]) { |
| 2578 | return missing_container_arg(cmd); |
| 2579 | } |
| 2580 | |
| 2581 | cmd->path = ap_getword_conf(cmd->pool, &arg); |
| 2582 | cmd->override = OR_ALL|ACCESS_CONF; |
| 2583 | |
| 2584 | if (thiscmd->cmd_data) { /* <LocationMatch> */ |
| 2585 | r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED); |
| 2586 | if (!r) { |
| 2587 | return "Regex could not be compiled"; |
| 2588 | } |
| 2589 | } |
| 2590 | else if (!strcmp(cmd->path, "~")) { |
| 2591 | cmd->path = ap_getword_conf(cmd->pool, &arg); |
| 2592 | r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED); |
| 2593 | if (!r) { |
| 2594 | return "Regex could not be compiled"; |
| 2595 | } |
| 2596 | } |
| 2597 | |
| 2598 | /* initialize our config and fetch it */ |
| 2599 | conf = ap_set_config_vectors(cmd->server, new_url_conf, cmd->path, |
| 2600 | &core_module, cmd->pool); |
| 2601 | |
| 2602 | errmsg = ap_walk_config(cmd->directive->first_child, cmd, new_url_conf); |
| 2603 | if (errmsg != NULL) |
| 2604 | return errmsg; |
| 2605 | |
| 2606 | conf->d = apr_pstrdup(cmd->pool, cmd->path); /* No mangling, please */ |
| 2607 | conf->d_is_fnmatch = apr_fnmatch_test(conf->d) != 0; |
| 2608 | conf->r = r; |
| 2609 | |
| 2610 | if (r) { |
| 2611 | conf->refs = apr_array_make(cmd->pool, 8, sizeof(char *)); |
| 2612 | if (ap_regname(r, conf->refs, AP_REG_MATCH, 1) < 0) { |
| 2613 | return "Error processing regex captures"; |
nothing calls this directly
no test coverage detected