From 3f96c3e750eb4e4dc63f53d783106aa5cf2498cb Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Tue, 10 Sep 2024 10:29:45 +0100 Subject: [PATCH 1/1] Logging: fix lookups "obsolete syntax" message. Bug 3112 --- doc/doc-txt/ChangeLog | 3 +++ src/src/acl.c | 9 +++++++-- src/src/exim.c | 12 +++++++++--- src/src/globals.c | 3 ++- src/src/globals.h | 3 ++- src/src/log.c | 14 +++++++++++++- src/src/readconf.c | 1 + test/stderr/2610 | 16 ++++++++-------- test/stderr/2620 | 16 ++++++++-------- 9 files changed, 53 insertions(+), 24 deletions(-) diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 22c934b82..1c8e060c1 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -56,6 +56,9 @@ JH/11 Lookups built as dynamic-load modules which support a single lookup modules present in the modules directory were loaded; this now applies only to those supporting multiple types. +JH/12 Bug 3112: Fix logging of config-file position for "obsolete lookup + syntax". Previously, the end of the top-level file was reported. + Exim version 4.98 ----------------- diff --git a/src/src/acl.c b/src/src/acl.c index 18d892ec5..9eb4c133f 100644 --- a/src/src/acl.c +++ b/src/src/acl.c @@ -4666,8 +4666,11 @@ while ((acl_current = acl)) *log_msgptr = *user_msgptr = NULL; f.acl_temp_details = FALSE; + config_filename = acl->srcfile; + config_lineno = acl->srcline; + HDEBUG(D_acl) debug_printf_indent("processing \"%s\" (%s %d)\n", - verbs[acl->verb], acl->srcfile, acl->srcline); + verbs[acl->verb], config_filename, config_lineno); /* Clear out any search error message from a previous check before testing this condition. */ @@ -4877,6 +4880,7 @@ while (i < 9) acl_level++; ret = acl_check_internal(where, addr, name, user_msgptr, log_msgptr); acl_level--; +config_lineno = 0; acl_narg = sav_narg; for (i = 0; i < 9; i++) acl_arg[i] = sav_arg[i]; @@ -4922,6 +4926,7 @@ if (where == ACL_WHERE_RCPT) acl_level++; rc = acl_check_internal(where, addr, s, user_msgptr, log_msgptr); acl_level--; +config_lineno = 0; return rc; } @@ -4945,7 +4950,6 @@ Returns: OK access is granted by an ACCEPT verb DEFER can't tell at the moment ERROR disaster */ -int acl_where = ACL_WHERE_UNKNOWN; int acl_check(int where, const uschar * recipient, uschar * s, @@ -4990,6 +4994,7 @@ acl_level = 0; rc = acl_check_internal(where, addr, s, user_msgptr, log_msgptr); acl_level = 0; acl_where = ACL_WHERE_UNKNOWN; +config_lineno = 0; /* Cutthrough - if requested, and WHERE_RCPT and not yet opened conn as result of recipient-verify, diff --git a/src/src/exim.c b/src/src/exim.c index 9774281e4..3d1b7f1d9 100644 --- a/src/src/exim.c +++ b/src/src/exim.c @@ -5494,8 +5494,12 @@ if (expansion_test) /* Expand command line items */ if (recipients_arg < argc) - while (recipients_arg < argc) - expansion_test_line(exim_str_fail_toolong(argv[recipients_arg++], EXIM_EMAILADDR_MAX, "recipient")); + { + config_filename = US"-be args"; + for (config_lineno = 1; recipients_arg < argc; config_lineno++) + expansion_test_line(exim_str_fail_toolong(argv[recipients_arg++], + EXIM_EMAILADDR_MAX, "-be arg")); + } /* Read stdin */ @@ -5509,7 +5513,9 @@ if (expansion_test) void *dlhandle = set_readline(&fn_readline, &fn_addhist); #endif - while (s = get_stdinput(fn_readline, fn_addhist)) + config_filename = US"-be stdin"; + for (config_lineno = 1; s = get_stdinput(fn_readline, fn_addhist); + config_lineno++) expansion_test_line(s); #ifdef USE_READLINE diff --git a/src/src/globals.c b/src/src/globals.c index c65ddf413..e887c2741 100644 --- a/src/src/globals.c +++ b/src/src/globals.c @@ -472,6 +472,7 @@ tree_node *acl_var_c = NULL; tree_node *acl_var_m = NULL; uschar *acl_verify_message = NULL; string_item *acl_warn_logged = NULL; +int acl_where = ACL_WHERE_UNKNOWN; /* Names of SMTP places for use in ACL error messages, and corresponding SMTP error codes (only those used) */ @@ -713,7 +714,7 @@ int clmacro_count = 0; uschar *clmacros[MAX_CLMACROS]; FILE *config_file = NULL; const uschar *config_filename = NULL; -int config_lineno = 0; +unsigned config_lineno = 0; #ifdef CONFIGURE_GROUP gid_t config_gid = CONFIGURE_GROUP; #else diff --git a/src/src/globals.h b/src/src/globals.h index 2f2f023e3..a172d9abc 100644 --- a/src/src/globals.h +++ b/src/src/globals.h @@ -349,6 +349,7 @@ extern tree_node *acl_var_c; /* ACL connection variables */ extern tree_node *acl_var_m; /* ACL message variables */ extern uschar *acl_verify_message; /* User message for verify failure */ extern string_item *acl_warn_logged; /* Logged lines */ +extern int acl_where; /* Current running ACL */ extern uschar *acl_wherecodes[]; /* Response codes for ACL fails */ extern uschar *acl_wherenames[]; /* Names for messages */ extern address_item *addr_duplicate; /* Duplicate address list */ @@ -433,7 +434,7 @@ extern int connection_max_messages;/* Max down one SMTP connection */ extern FILE *config_file; /* Configuration file */ extern const uschar *config_filename; /* Configuration file name */ extern gid_t config_gid; /* Additional group owner */ -extern int config_lineno; /* Line number */ +extern unsigned config_lineno; /* Line number */ extern const uschar *config_main_filelist; /* List of possible config files */ extern uschar *config_main_filename; /* File name actually used */ extern uschar *config_main_directory; /* Directory where the main config file was found */ diff --git a/src/src/log.c b/src/src/log.c index 1b4cea155..a7bc2aab7 100644 --- a/src/src/log.c +++ b/src/src/log.c @@ -642,8 +642,20 @@ if (flags & (LOG_CONFIG_FOR & ~LOG_CONFIG)) else { if (flags & (LOG_CONFIG_IN & ~LOG_CONFIG)) - string_fmt_append_noextend(g, " in line %d of %s", + if (config_lineno > 0) + { + if (acl_where != ACL_WHERE_UNKNOWN) + string_fmt_append_noextend(g, " in ACL verb at"); + else + string_fmt_append_noextend(g, " in"); + + string_fmt_append_noextend(g, " line %d of %s", config_lineno, config_filename); + } + else if (router_name) + string_fmt_append_noextend(g, " in %s router", router_name); + else if (transport_name) + string_fmt_append_noextend(g, " in %s transport", transport_name); string_fmt_append_noextend(g, ":\n "); } diff --git a/src/src/readconf.c b/src/src/readconf.c index 5aabd0194..3f49691e4 100644 --- a/src/src/readconf.c +++ b/src/src/readconf.c @@ -4621,6 +4621,7 @@ while(next_section[0] != 0) } (void)fclose(config_file); +config_lineno = 0; /* Ensure we don't log a spurious position */ } /* Init the storage for the pre-parsed config lines */ diff --git a/test/stderr/2610 b/test/stderr/2610 index f253cac9d..f66ff8eae 100644 --- a/test/stderr/2610 +++ b/test/stderr/2610 @@ -137,7 +137,7 @@ dropping to exim gid; retaining priv uid database lookup required for servers=x:127.0.0.1::PORT_N; select name from them where id='ph10'; MySQL query: "servers=x:127.0.0.1::PORT_N; select name from them where id='ph10';" opts 'NULL' LOG: MAIN - Exim configuration error in line 89 of TESTSUITE/test-config: + Exim configuration error in line 11 of -be stdin: WARNING: obsolete syntax used for lookup lookup deferred: MySQL server "x" not found in mysql_servers search_open: mysql "NULL" @@ -150,7 +150,7 @@ LOG: MAIN database lookup required for servers=127.0.0.1::PORT_N:x; select name from them where id='ph10'; MySQL query: "servers=127.0.0.1::PORT_N:x; select name from them where id='ph10';" opts 'NULL' LOG: MAIN - Exim configuration error in line 89 of TESTSUITE/test-config: + Exim configuration error in line 12 of -be stdin: WARNING: obsolete syntax used for lookup MYSQL using cached connection for 127.0.0.1:PORT_N/test/root creating new cache entry @@ -165,7 +165,7 @@ LOG: MAIN database lookup required for servers=127.0.0.1::PORT_N/test/root/:x; select name from them where id='ph10'; MySQL query: "servers=127.0.0.1::PORT_N/test/root/:x; select name from them where id='ph10';" opts 'NULL' LOG: MAIN - Exim configuration error in line 89 of TESTSUITE/test-config: + Exim configuration error in line 13 of -be stdin: WARNING: obsolete syntax used for lookup MYSQL using cached connection for 127.0.0.1:PORT_N/test/root creating new cache entry @@ -180,7 +180,7 @@ LOG: MAIN database lookup required for servers=ip4.ip4.ip4.ip4::1223/test/root/:127.0.0.1::PORT_N; select name from them where id='ph10'; MySQL query: "servers=ip4.ip4.ip4.ip4::1223/test/root/:127.0.0.1::PORT_N; select name from them where id='ph10';" opts 'NULL' LOG: MAIN - Exim configuration error in line 89 of TESTSUITE/test-config: + Exim configuration error in line 14 of -be stdin: WARNING: obsolete syntax used for lookup MYSQL new connection: host=ip4.ip4.ip4.ip4 port=PORT_N socket=NULL database=test user=root creating new cache entry @@ -195,7 +195,7 @@ LOG: MAIN database lookup required for servers=localhost(TESTSUITE/mysql/sock)/test/root/pass; select name from them where id='ph10'; MySQL query: "servers=localhost(TESTSUITE/mysql/sock)/test/root/pass; select name from them where id='ph10';" opts 'NULL' LOG: MAIN - Exim configuration error in line 89 of TESTSUITE/test-config: + Exim configuration error in line 15 of -be stdin: WARNING: obsolete syntax used for lookup MYSQL new connection: host=localhost port=0 socket=TESTSUITE/mysql/sock database=test user=root creating new cache entry @@ -505,7 +505,7 @@ close MYSQL connection: 127.0.0.1:PORT_N/test/root 01:01:01 p1235 (tainted, quoted:mysql) 01:01:01 p1235 MySQL query: "servers=127.0.0.1::PORT_N/test/root/pass; select name from them where id = 'c'" opts 'NULL' 01:01:01 p1235 LOG: MAIN -01:01:01 p1235 Exim configuration error in line 89 of TESTSUITE/test-config: +01:01:01 p1235 Exim configuration error in ACL verb at line 31 of TESTSUITE/test-config: 01:01:01 p1235 WARNING: obsolete syntax used for lookup 01:01:01 p1235 lookup deferred: MySQL server "127.0.0.1:PORT_N/test" is tainted 01:01:01 p1235 ├failed to expand: FAIL2: ${lookup mysql {servers=127.0.0.1::PORT_N/test/root/pass; select name from them where id = '${quote_mysql:$local_part}'}} @@ -543,7 +543,7 @@ close MYSQL connection: 127.0.0.1:PORT_N/test/root 01:01:01 p1235 required_quoter_id (mysql) quoting -1 (NULL) 01:01:01 p1235 MySQL query: "servers=127.0.0.1::PORT_N; select name from them where id = 'c'" opts 'NULL' 01:01:01 p1235 LOG: MAIN -01:01:01 p1235 Exim configuration error in line 89 of TESTSUITE/test-config: +01:01:01 p1235 Exim configuration error in ACL verb at line 39 of TESTSUITE/test-config: 01:01:01 p1235 WARNING: obsolete syntax used for lookup 01:01:01 p1235 MYSQL using cached connection for 127.0.0.1:PORT_N/test/root 01:01:01 p1235 MYSQL: no data found @@ -626,7 +626,7 @@ close MYSQL connection: 127.0.0.1:PORT_N/test/root 01:01:01 p1235 (tainted, quoted:mysql) 01:01:01 p1235 MySQL query: "servers=127.0.0.1::PORT_N/test/root/pass; select * from them where id='c'" opts 'NULL' 01:01:01 p1235 LOG: MAIN -01:01:01 p1235 Exim configuration error in line 89 of TESTSUITE/test-config: +01:01:01 p1235 Exim configuration error in ACL verb at line 45 of TESTSUITE/test-config: 01:01:01 p1235 WARNING: obsolete syntax used for lookup 01:01:01 p1235 lookup deferred: MySQL server "127.0.0.1:PORT_N/test" is tainted 01:01:01 p1235 host in "<& net-mysql;servers=127.0.0.1::PORT_N/test/root/pass; select * from them where id='c'"? list match deferred for net-mysql;servers=127.0.0.1::1223/test/root/pass; select * from them where id='c' diff --git a/test/stderr/2620 b/test/stderr/2620 index 390427790..b770a6267 100644 --- a/test/stderr/2620 +++ b/test/stderr/2620 @@ -135,7 +135,7 @@ dropping to exim gid; retaining priv uid database lookup required for servers=x:localhost; select name from them where id='ph10'; PostgreSQL query: "servers=x:localhost; select name from them where id='ph10';" opts 'NULL' LOG: MAIN - Exim configuration error in line 78 of TESTSUITE/test-config: + Exim configuration error in line 11 of -be stdin: WARNING: obsolete syntax used for lookup lookup deferred: PostgreSQL server "x" not found in pgsql_servers search_open: pgsql "NULL" @@ -148,7 +148,7 @@ LOG: MAIN database lookup required for servers=localhost::PORT_N:x; select name from them where id='ph10'; PostgreSQL query: "servers=localhost::PORT_N:x; select name from them where id='ph10';" opts 'NULL' LOG: MAIN - Exim configuration error in line 78 of TESTSUITE/test-config: + Exim configuration error in line 12 of -be stdin: WARNING: obsolete syntax used for lookup PGSQL using cached connection for localhost:PORT_N/test/CALLER creating new cache entry @@ -163,7 +163,7 @@ LOG: MAIN database lookup required for servers=localhost::PORT_N/test/CALLER/:x; select name from them where id='ph10'; PostgreSQL query: "servers=localhost::PORT_N/test/CALLER/:x; select name from them where id='ph10';" opts 'NULL' LOG: MAIN - Exim configuration error in line 78 of TESTSUITE/test-config: + Exim configuration error in line 13 of -be stdin: WARNING: obsolete syntax used for lookup PGSQL using cached connection for localhost:PORT_N/test/CALLER creating new cache entry @@ -178,7 +178,7 @@ LOG: MAIN database lookup required for servers=(TESTSUITE/pgsql/.s.PGSQL.1223)/test/CALLER/:x; select name from them where id='ph10'; PostgreSQL query: "servers=(TESTSUITE/pgsql/.s.PGSQL.1223)/test/CALLER/:x; select name from them where id='ph10';" opts 'NULL' LOG: MAIN - Exim configuration error in line 78 of TESTSUITE/test-config: + Exim configuration error in line 14 of -be stdin: WARNING: obsolete syntax used for lookup PGSQL new connection: socket=TESTSUITE/pgsql/.s.PGSQL.1223 database=test user=CALLER creating new cache entry @@ -349,7 +349,7 @@ check set acl_m0 = ok: ${lookup pgsql,servers=localhost::PORT_N {select nam (tainted, quoted:pgsql) PostgreSQL query: "servers=localhost::PORT_N/test/CALLER/; select name from them where id = 'c'" opts 'NULL' LOG: MAIN - Exim configuration error in line 78 of TESTSUITE/test-config: + Exim configuration error in ACL verb at line 32 of TESTSUITE/test-config: WARNING: obsolete syntax used for lookup lookup deferred: PostgreSQL server "localhost:PORT_N/test" is tainted warn: condition test deferred in ACL "check_recipient" @@ -392,7 +392,7 @@ host in "<& net-pgsql;servers=localhost::PORT_N/test/CALLER/; select * from them (tainted, quoted:pgsql) PostgreSQL query: "servers=localhost::PORT_N/test/CALLER/; select * from them where id='c'" opts 'NULL' LOG: MAIN - Exim configuration error in line 78 of TESTSUITE/test-config: + Exim configuration error in ACL verb at line 44 of TESTSUITE/test-config: WARNING: obsolete syntax used for lookup lookup deferred: PostgreSQL server "localhost:PORT_N/test" is tainted host in "<& net-pgsql;servers=localhost::PORT_N/test/CALLER/; select * from them where id='c'"? list match deferred for net-pgsql;servers=localhost::1223/test/CALLER/; select * from them where id='c' @@ -545,7 +545,7 @@ check set acl_m0 = ok: ${lookup pgsql,servers=localhost::PORT_N {select nam (tainted, quoted:pgsql) PostgreSQL query: "servers=localhost::PORT_N/test/CALLER/; select name from them where id = 'c'" opts 'NULL' LOG: MAIN - Exim configuration error in line 78 of TESTSUITE/test-config: + Exim configuration error in ACL verb at line 32 of TESTSUITE/test-config: WARNING: obsolete syntax used for lookup lookup deferred: PostgreSQL server "localhost:PORT_N/test" is tainted warn: condition test deferred in ACL "check_recipient" @@ -583,7 +583,7 @@ host in "<& net-pgsql;servers=localhost::PORT_N/test/CALLER/; select * from them (tainted, quoted:pgsql) PostgreSQL query: "servers=localhost::PORT_N/test/CALLER/; select * from them where id='c'" opts 'NULL' LOG: MAIN - Exim configuration error in line 78 of TESTSUITE/test-config: + Exim configuration error in ACL verb at line 44 of TESTSUITE/test-config: WARNING: obsolete syntax used for lookup lookup deferred: PostgreSQL server "localhost:PORT_N/test" is tainted host in "<& net-pgsql;servers=localhost::PORT_N/test/CALLER/; select * from them where id='c'"? list match deferred for net-pgsql;servers=localhost::1223/test/CALLER/; select * from them where id='c' -- 2.30.2