| 851 | #define AP_MAX_ARGC 64 |
| 852 | |
| 853 | static const char *invoke_cmd(const command_rec *cmd, cmd_parms *parms, |
| 854 | void *mconfig, const char *args) |
| 855 | { |
| 856 | int override_list_ok = 0; |
| 857 | char *w, *w2, *w3; |
| 858 | const char *errmsg = NULL; |
| 859 | |
| 860 | /* Have we been provided a list of acceptable directives? */ |
| 861 | if (parms->override_list != NULL) { |
| 862 | if (apr_table_get(parms->override_list, cmd->name) != NULL) { |
| 863 | override_list_ok = 1; |
| 864 | } |
| 865 | } |
| 866 | |
| 867 | if ((parms->override & cmd->req_override) == 0 && !override_list_ok) { |
| 868 | if (parms->override & NONFATAL_OVERRIDE) { |
| 869 | ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, parms->temp_pool, |
| 870 | APLOGNO(02295) |
| 871 | "%s in .htaccess forbidden by AllowOverride", |
| 872 | cmd->name); |
| 873 | return NULL; |
| 874 | } |
| 875 | else if (parms->directive && parms->directive->parent) { |
| 876 | return apr_pstrcat(parms->pool, cmd->name, " not allowed in ", |
| 877 | parms->directive->parent->directive, ">", |
| 878 | " context", NULL); |
| 879 | } |
| 880 | else { |
| 881 | return apr_pstrcat(parms->pool, cmd->name, |
| 882 | " not allowed here", NULL); |
| 883 | } |
| 884 | } |
| 885 | |
| 886 | parms->info = cmd->cmd_data; |
| 887 | parms->cmd = cmd; |
| 888 | |
| 889 | switch (cmd->args_how) { |
| 890 | case RAW_ARGS: |
| 891 | #ifdef RESOLVE_ENV_PER_TOKEN |
| 892 | args = ap_resolve_env(parms->pool,args); |
| 893 | #endif |
| 894 | return cmd->AP_RAW_ARGS(parms, mconfig, args); |
| 895 | |
| 896 | case TAKE_ARGV: |
| 897 | { |
| 898 | char *argv[AP_MAX_ARGC]; |
| 899 | int argc = 0; |
| 900 | |
| 901 | do { |
| 902 | w = ap_getword_conf(parms->pool, &args); |
| 903 | if (*w == '\0' && *args == '\0') { |
| 904 | break; |
| 905 | } |
| 906 | argv[argc] = w; |
| 907 | argc++; |
| 908 | } while (argc < AP_MAX_ARGC && *args != '\0'); |
| 909 | |
| 910 | return cmd->AP_TAKE_ARGV(parms, mconfig, argc, argv); |
no test coverage detected