X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Facl.c;h=5cd0c3507f9c99b8d99fc228c88ad2bcf77488da;hb=3e8abda0fa92b78c4a3dfbad940b12fc90c241e3;hp=5101267c217dc6fdad67c55b5705c0b6e00b662a;hpb=fd8c9db9ffc56400f46b2f5168ae4ee36adc50a5;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/acl.c b/src/src/acl.c index 5101267c2..5cd0c3507 100644 --- a/src/src/acl.c +++ b/src/src/acl.c @@ -696,8 +696,8 @@ static uschar *ratelimit_option_string[] = { /* Enable recursion between acl_check_internal() and acl_check_condition() */ -static int acl_check_internal(int, address_item *, uschar *, int, uschar **, - uschar **); +static int acl_check_wargs(int, address_item *, uschar *, int, uschar **, + uschar **); /************************************************* @@ -2785,33 +2785,7 @@ for (; cb != NULL; cb = cb->next) "discard" verb. */ case ACLC_ACL: - { - uschar * cp = arg; - uschar * tmp; - uschar * name; - - if (!(tmp = string_dequote(&cp)) || !(name = expand_string(tmp))) - { - if (expand_string_forcedfail) continue; - *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s", - tmp, expand_string_message); - return search_find_defer? DEFER : ERROR; - } - - for (acl_narg = 0; acl_narg < sizeof(acl_arg)/sizeof(*acl_arg); acl_narg++) - { - while (*cp && isspace(*cp)) cp++; - if (!*cp) break; - if (!(tmp = string_dequote(&cp)) || !(acl_arg[acl_narg] = expand_string(tmp))) - { - if (expand_string_forcedfail) continue; - *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s", - arg, expand_string_message); - return search_find_defer? DEFER : ERROR; - } - } - - rc = acl_check_internal(where, addr, name, level+1, user_msgptr, log_msgptr); + rc = acl_check_wargs(where, addr, arg, level+1, user_msgptr, log_msgptr); if (rc == DISCARD && verb != ACL_ACCEPT && verb != ACL_DISCARD) { *log_msgptr = string_sprintf("nested ACL returned \"discard\" for " @@ -2819,7 +2793,6 @@ for (; cb != NULL; cb = cb->next) verbs[verb]); return ERROR; } - } break; case ACLC_AUTHENTICATED: @@ -3895,28 +3868,33 @@ return FAIL; /* Same args as acl_check_internal() above, but the string s is the name of an ACL followed optionally by up to 9 space-separated arguments. The name and args are separately expanded. Args go into $acl_arg globals. */ -int -acl_check_args(int where, address_item *addr, uschar *s, int level, +static int +acl_check_wargs(int where, address_item *addr, uschar *s, int level, uschar **user_msgptr, uschar **log_msgptr) { uschar * tmp; +uschar * tmp_arg[9]; /* must match acl_arg[] */ uschar * name; +int i; if (!(tmp = string_dequote(&s)) || !(name = expand_string(tmp))) goto bad; -for (acl_narg = 0; acl_narg < sizeof(acl_arg)/sizeof(*acl_arg); acl_narg++) +for (i = 0; i < 9; i++) { while (*s && isspace(*s)) s++; if (!*s) break; - if (!(tmp = string_dequote(&s)) || !(acl_arg[acl_narg] = expand_string(tmp))) + if (!(tmp = string_dequote(&s)) || !(tmp_arg[i] = expand_string(tmp))) { tmp = name; goto bad; } } +acl_narg = i; +for (i = 0; i < acl_narg; i++) acl_arg[i] = tmp_arg[i]; +while (i < 9) acl_arg[i++] = NULL; -return acl_check_internal(where, addr, name, level+1, user_msgptr, log_msgptr); +return acl_check_internal(where, addr, name, level, user_msgptr, log_msgptr); bad: if (expand_string_forcedfail) return ERROR;