diff --git a/etc/smartdns/smartdns.conf b/etc/smartdns/smartdns.conf
index 85d60e9..2f132d0 100644
--- a/etc/smartdns/smartdns.conf
+++ b/etc/smartdns/smartdns.conf
@@ -148,7 +148,7 @@ force-qtype-SOA 65
# response-mode [first-ping|fastest-ip|fastest-response]
# set log level
-# log-level: [level], level=fatal, error, warn, notice, info, debug
+# log-level: [level], level=off, fatal, error, warn, notice, info, debug
# log-file: file path of log file.
# log-console [yes|no]: output log to console.
# log-size: size of each log file, support k,m,g
diff --git a/package/luci-compat/files/luci/i18n/smartdns.zh-cn.po b/package/luci-compat/files/luci/i18n/smartdns.zh-cn.po
index 248a806..f44bf09 100644
--- a/package/luci-compat/files/luci/i18n/smartdns.zh-cn.po
+++ b/package/luci-compat/files/luci/i18n/smartdns.zh-cn.po
@@ -12,6 +12,9 @@ msgstr "额外规则标识"
msgid "Additional Server Args"
msgstr "额外的服务器参数"
+msgid "Additional server args, refer to the help description of the bind option."
+msgstr "额外的服务器参数,参考bind选项的帮助说明。"
+
msgid "Advanced Settings"
msgstr "高级设置"
@@ -287,6 +290,18 @@ msgstr "监听在指定的设备上,避免非本地网络的DNS查询请求。
msgid "Local Port"
msgstr "本地端口"
+msgid "Log Size"
+msgstr "日志大小"
+
+msgid "Log Level"
+msgstr "日志级别"
+
+msgid "Log Number"
+msgstr "日志数量"
+
+msgid "Log File"
+msgstr "日志文件路径"
+
msgid "Marking Packets"
msgstr "数据包标记"
@@ -563,6 +578,9 @@ msgstr "上传域名列表文件"
msgid "Upload smartdns config file to /etc/smartdns/conf.d"
msgstr "上传配置文件到/etc/smartdns/conf.d"
+msgid "Upstream DNS Server Configuration"
+msgstr "上游DNS服务器配置"
+
msgid "Upstream Servers"
msgstr "上游服务器"
diff --git a/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua b/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua
index 86293ec..373a42a 100644
--- a/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua
+++ b/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua
@@ -162,7 +162,7 @@ end
---- Domain prefetch load
o = s:taboption("advanced", Flag, "prefetch_domain", translate("Domain prefetch"), translate("Enable domain prefetch, accelerate domain response speed."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
@@ -183,8 +183,8 @@ o.rempty = true
---- cache-persist;
o = s:taboption("advanced", Flag, "cache_persist", translate("Cache Persist"), translate("Write cache to disk on exit and load on startup."))
-o.rmempty = false;
-o.default = o.enabled;
+o.rmempty = false
+o.default = o.enabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "1"
end
@@ -199,8 +199,8 @@ end
-- Force AAAA SOA
o = s:taboption("advanced", Flag, "force_aaaa_soa", translate("Force AAAA SOA"), translate("Force AAAA SOA."))
-o.rmempty = false
-o.default = o.enabled
+o.rmempty = true
+o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
end
@@ -268,6 +268,12 @@ uci:foreach("smartdns", "download-file", function(section)
o:value(section.name);
end)
+---- other args
+o = s:taboption("advanced", Value, "server_flags", translate("Additional Server Args"), translate("Additional server args, refer to the help description of the bind option."))
+o.default = ""
+o.rempty = true
+o.optional = true
+
---- second dns server
---- Eanble
o = s:taboption("seconddns", Flag, "seconddns_enabled", translate("Enable"), translate("Enable or disable second DNS server."))
@@ -297,7 +303,7 @@ o.datatype = "hostname"
o.rempty = true
o = s:taboption("seconddns", Flag, "seconddns_no_speed_check", translate("Skip Speed Check"), translate("Do not check speed."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
@@ -305,7 +311,7 @@ end
---- skip address rules
o = s:taboption("seconddns", Flag, "seconddns_no_rule_addr", translate("Skip Address Rules"), translate("Skip address rules."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
@@ -313,7 +319,7 @@ end
---- skip name server rules
o = s:taboption("seconddns", Flag, "seconddns_no_rule_nameserver", translate("Skip Nameserver Rule"), translate("Skip nameserver rules."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
@@ -321,7 +327,7 @@ end
---- skip ipset rules
o = s:taboption("seconddns", Flag, "seconddns_no_rule_ipset", translate("Skip Ipset Rule"), translate("Skip ipset rules."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
@@ -329,14 +335,14 @@ end
---- skip soa address rule
o = s:taboption("seconddns", Flag, "seconddns_no_rule_soa", translate("Skip SOA Address Rule"), translate("Skip SOA address rules."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
end
o = s:taboption("seconddns", Flag, "seconddns_no_dualstack_selection", translate("Skip Dualstack Selection"), translate("Skip Dualstack Selection."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
@@ -344,7 +350,7 @@ end
---- skip cache
o = s:taboption("seconddns", Flag, "seconddns_no_cache", translate("Skip Cache"), translate("Skip Cache."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
@@ -352,7 +358,7 @@ end
---- Force AAAA SOA
o = s:taboption("seconddns", Flag, "seconddns_force_aaaa_soa", translate("Force AAAA SOA"), translate("Force AAAA SOA."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
@@ -379,6 +385,12 @@ function o.validate(self, value)
return nil, translate("NFTset name format error, format: [#[4|6]:[family#table#set]]")
end
+---- other args
+o = s:taboption("seconddns", Value, "seconddns_server_flags", translate("Additional Server Args"), translate("Additional server args, refer to the help description of the bind option."))
+o.default = ""
+o.rempty = true
+o.optional = true
+
----- Proxy server settings
o = s:taboption("proxy", Value, "proxy_server", translate("Proxy Server"), translate("Proxy Server URL, format: [socks5|http]://user:pass@ip:port."));
o.datatype = 'string';
@@ -418,12 +430,36 @@ function custom.write(self, section, value)
end
o = s:taboption("custom", Flag, "coredump", translate("Generate Coredump"), translate("Generate Coredump file when smartdns crash, coredump file is located at /tmp/smartdns.xxx.core."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
end
+o = s:taboption("custom", Value, "log_size", translate("Log Size"))
+o.rmempty = true
+o.placeholder = "default"
+
+o = s:taboption("custom", ListValue, "log_level", translate("Log Level"))
+o.rmempty = true
+o.placeholder = "default"
+o:value("", translate("default"))
+o:value("debug")
+o:value("info")
+o:value("notice")
+o:value("warn")
+o:value("error")
+o:value("fatal")
+o:value("off")
+
+o = s:taboption("custom", Value, "log_num", translate("Log Number"))
+o.rmempty = true
+o.placeholder = "default"
+
+o = s:taboption("custom", Value, "log_file", translate("Log File"))
+o.rmempty = true
+o.placeholder = "/var/log/smartdns/smartdns.log"
+
-- Upstream servers
s = m:section(TypedSection, "server", translate("Upstream Servers"), translate("Upstream Servers, support UDP, TCP protocol. " ..
"Please configure multiple DNS servers, including multiple foreign DNS servers."))
@@ -522,11 +558,11 @@ end
o = s:taboption("forwarding", Flag, "no_speed_check", translate("Skip Speed Check"),
translate("Do not check speed."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o = s:taboption("forwarding", Flag, "force_aaaa_soa", translate("Force AAAA SOA"), translate("Force AAAA SOA."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o = s:taboption("forwarding", Value, "ipset_name", translate("IPset Name"), translate("IPset name."))
@@ -636,7 +672,7 @@ s.anonymous = true
---- download Files Settings
o = s:option(Flag, "enable_auto_update", translate("Enable Auto Update"), translate("Enable daily auto update."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.rempty = true
@@ -670,11 +706,11 @@ s.addremove = true
s.template = "cbi/tblsection"
o = s:option(Value, 'name', translate('File Name'), translate('File Name'))
-o.rmempty = false
+o.rmempty = true
o.datatype = 'string'
o = s:option(Value, 'url', translate('URL'), translate('URL'))
-o.rmempty = false
+o.rmempty = true
o.datatype = 'string'
function o.validate(self, value, section)
if value == "" then
@@ -736,7 +772,7 @@ o.write = function()
end
o = s:option(Button, "Restart")
-o.title = translate("Restart smartdns")
+o.title = translate("Restart Service")
o.inputtitle = translate("Restart")
o.inputstyle = "apply"
o.write = function()
diff --git a/package/luci-compat/files/luci/model/cbi/smartdns/upstream.lua b/package/luci-compat/files/luci/model/cbi/smartdns/upstream.lua
index 70811de..02b7a5f 100644
--- a/package/luci-compat/files/luci/model/cbi/smartdns/upstream.lua
+++ b/package/luci-compat/files/luci/model/cbi/smartdns/upstream.lua
@@ -56,7 +56,7 @@ o.default = "udp"
o.rempty = false
---- server group
-o = s:option(Value, "server_group", translate("Server Group"), translate("DNS Server group belongs to, used with nameserver, such as office, home."))
+o = s:option(Value, "server_group", translate("Server Group"), translate("DNS Server group belongs to, such as office, home."))
o.rmempty = true
o.placeholder = "default"
o.datatype = "hostname"
@@ -64,14 +64,14 @@ o.rempty = true
---- exclude default group
o = s:option(Flag, "exclude_default_group", translate("Exclude Default Group"), translate("Exclude DNS Server from default group."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.editable = true
o.modalonly = true
---- blacklist_ip
o = s:option(Flag, "blacklist_ip", translate("IP Blacklist Filtering"), translate("Filtering IP with blacklist"))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
@@ -87,7 +87,7 @@ o:depends("type", "https")
---- certificate verify
o = s:option(Flag, "no_check_certificate", translate("No check certificate"), translate("Do not check certificate."))
-o.rmempty = false
+o.rmempty = true
o.default = o.disabled
o.cfgvalue = function(...)
return Flag.cfgvalue(...) or "0"
@@ -154,6 +154,5 @@ end
o = s:option(Value, "addition_arg", translate("Additional Server Args"), translate("Additional Args for upstream dns servers"))
o.default = ""
o.rempty = true
-o.optional = true
return m
\ No newline at end of file
diff --git a/package/luci/files/luci/i18n/smartdns.zh-cn.po b/package/luci/files/luci/i18n/smartdns.zh-cn.po
index 248a806..9009833 100644
--- a/package/luci/files/luci/i18n/smartdns.zh-cn.po
+++ b/package/luci/files/luci/i18n/smartdns.zh-cn.po
@@ -12,6 +12,9 @@ msgstr "额外规则标识"
msgid "Additional Server Args"
msgstr "额外的服务器参数"
+msgid "Additional server args, refer to the help description of the bind option."
+msgstr "额外的服务器参数,参考bind选项的帮助说明。"
+
msgid "Advanced Settings"
msgstr "高级设置"
@@ -287,6 +290,18 @@ msgstr "监听在指定的设备上,避免非本地网络的DNS查询请求。
msgid "Local Port"
msgstr "本地端口"
+msgid "Log Size"
+msgstr "日志大小"
+
+msgid "Log Level"
+msgstr "日志级别"
+
+msgid "Log Number"
+msgstr "日志数量"
+
+msgid "Log File"
+msgstr "日志文件路径"
+
msgid "Marking Packets"
msgstr "数据包标记"
diff --git a/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js b/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js
index b8a50ad..91d7d09 100644
--- a/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js
+++ b/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js
@@ -245,7 +245,7 @@ return view.extend({
// Domain prefetch load ;
o = s.taboption("advanced", form.Flag, "prefetch_domain", _("Domain prefetch"),
_("Enable domain prefetch, accelerate domain response speed."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
// Domain Serve expired
@@ -270,7 +270,7 @@ return view.extend({
// Force AAAA SOA
o = s.taboption("advanced", form.Flag, "force_aaaa_soa", _("Force AAAA SOA"), _("Force AAAA SOA."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
// Force HTTPS SOA
@@ -342,6 +342,12 @@ return view.extend({
_("Reply maximum TTL for all domain result."));
o.rempty = true;
+ // other args
+ o = s.taboption("advanced", form.Value, "server_flags", _("Additional Server Args"),
+ _("Additional server args, refer to the help description of the bind option."))
+ o.default = ""
+ o.rempty = true
+
// include config
download_files = uci.sections('smartdns', 'download-file');
o = s.taboption("advanced", form.DynamicList, "conf_files", _("Include Config Files
/etc/smartdns/conf.d"),
@@ -365,7 +371,7 @@ return view.extend({
o = s.taboption("seconddns", form.Flag, "seconddns_enabled", _("Enable"),
_("Enable or disable second DNS server."));
o.default = o.disabled;
- o.rempty = false;
+ o.rempty = true;
// Port;
o = s.taboption("seconddns", form.Value, "seconddns_port", _("Local Port"), _("Smartdns local server port"));
@@ -389,46 +395,46 @@ return view.extend({
o = s.taboption("seconddns", form.Flag, "seconddns_no_speed_check", _("Skip Speed Check"),
_("Do not check speed."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
// skip address rules;
o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_addr", _("Skip Address Rules"),
_("Skip address rules."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
// skip name server rules;
o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_nameserver", _("Skip Nameserver Rule"),
_("Skip nameserver rules."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
// skip ipset rules;
o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_ipset", _("Skip Ipset Rule"),
_("Skip ipset rules."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
// skip soa address rule;
o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_soa", _("Skip SOA Address Rule"),
_("Skip SOA address rules."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
o = s.taboption("seconddns", form.Flag, "seconddns_no_dualstack_selection", _("Skip Dualstack Selection"),
_("Skip Dualstack Selection."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
// skip cache;
o = s.taboption("seconddns", form.Flag, "seconddns_no_cache", _("Skip Cache"), _("Skip Cache."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
// Force AAAA SOA
o = s.taboption("seconddns", form.Flag, "seconddns_force_aaaa_soa", _("Force AAAA SOA"), _("Force AAAA SOA."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
o = s.taboption("seconddns", form.Value, "seconddns_ipset_name", _("IPset Name"), _("IPset name."));
@@ -469,6 +475,12 @@ return view.extend({
return true;
}
+ // other args
+ o = s.taboption("seconddns", form.Value, "seconddns_server_flags", _("Additional Server Args"),
+ _("Additional server args, refer to the help description of the bind option."))
+ o.default = ""
+ o.rempty = true
+
///////////////////////////////////////
// DNS64 Settings
///////////////////////////////////////
@@ -481,7 +493,7 @@ return view.extend({
// download Files Settings
///////////////////////////////////////
o = s.taboption("files", form.Flag, "enable_auto_update", _("Enable Auto Update"), _("Enable daily auto update."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
o.rempty = true;
@@ -521,11 +533,11 @@ return view.extend({
ss.sortable = true;
so = ss.option(form.Value, 'name', _('File Name'), _('File Name'));
- so.rmempty = false;
+ so.rmempty = true;
so.datatype = 'file';
so = ss.option(form.Value, 'url', _('URL'), _('URL'));
- so.rmempty = false;
+ so.rmempty = true;
so.datatype = 'string';
so.validate = function (section_id, value) {
if (value == "") {
@@ -586,9 +598,33 @@ return view.extend({
o = s.taboption("custom", form.Flag, "coredump", _("Generate Coredump"),
_("Generate Coredump file when smartdns crash, coredump file is located at /tmp/smartdns.xxx.core."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
+ o = s.taboption("custom", form.Value, "log_size", _("Log Size"));
+ o.rmempty = true;
+ o.placeholder = "default";
+
+ o = s.taboption("custom", form.ListValue, "log_level", _("Log Level"));
+ o.rmempty = true;
+ o.placeholder = "default";
+ o.value("", _("default"));
+ o.value("debug");
+ o.value("info");
+ o.value("notice");
+ o.value("warn");
+ o.value("error");
+ o.value("fatal");
+ o.value("off");
+
+ o = s.taboption("custom", form.Value, "log_num", _("Log Number"));
+ o.rmempty = true;
+ o.placeholder = "default";
+
+ o = s.taboption("custom", form.Value, "log_file", _("Log File"))
+ o.rmempty = true
+ o.placeholder = "/var/log/smartdns/smartdns.log"
+
////////////////
// Upstream servers;
////////////////
@@ -656,7 +692,7 @@ return view.extend({
// Advanced Options
o = s.taboption("advanced", form.Flag, "exclude_default_group", _("Exclude Default Group"), _("Exclude DNS Server from default group."))
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
o.editable = true;
o.modalonly = true;
@@ -664,7 +700,7 @@ return view.extend({
// blacklist_ip
o = s.taboption("advanced", form.Flag, "blacklist_ip", _("IP Blacklist Filtering"),
_("Filtering IP with blacklist"))
- o.rmempty = false
+ o.rmempty = true
o.default = o.disabled
o.modalonly = true;
@@ -681,7 +717,7 @@ return view.extend({
// certificate verify
o = s.taboption("advanced", form.Flag, "no_check_certificate", _("No check certificate"),
_("Do not check certificate."))
- o.rmempty = false
+ o.rmempty = true
o.default = o.disabled
o.modalonly = true;
o.depends("type", "tls")
@@ -800,11 +836,11 @@ return view.extend({
o = s.taboption("forwarding", form.Flag, "no_speed_check", _("Skip Speed Check"),
_("Do not check speed."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
o = s.taboption("forwarding", form.Flag, "force_aaaa_soa", _("Force AAAA SOA"), _("Force AAAA SOA."));
- o.rmempty = false;
+ o.rmempty = true;
o.default = o.disabled;
o = s.taboption("forwarding", form.Value, "ipset_name", _("IPset Name"), _("IPset name."));
@@ -954,7 +990,7 @@ return view.extend({
so = ss.option(form.FileUpload, "domain_list_file", _("Domain List File"),
_("Upload domain list file, or configure auto download from Download File Setting page."));
- so.rmempty = false
+ so.rmempty = true
so.datatype = "file"
so.rempty = true
so.root_directory = "/etc/smartdns/domain-set"
diff --git a/package/openwrt/custom.conf b/package/openwrt/custom.conf
index 0d14630..d4e891b 100644
--- a/package/openwrt/custom.conf
+++ b/package/openwrt/custom.conf
@@ -1,14 +1,2 @@
# Add custom settings here.
-
-# set log level
-# log-level [level], level=fatal, error, warn, notice, info, debug
-# log-level error
-
-# log-size k,m,g
-# log-size 128k
-
-# log-file /var/log/smartdns.log
-# log-num 2
-
-# List of hosts that supply bogus NX domain results
-# bogus-nxdomain [ip/subnet]
\ No newline at end of file
+# please read https://pymumu.github.io/smartdns/config/basic-config/
\ No newline at end of file
diff --git a/package/openwrt/files/etc/init.d/smartdns b/package/openwrt/files/etc/init.d/smartdns
index 84be8b9..bfca1a9 100644
--- a/package/openwrt/files/etc/init.d/smartdns
+++ b/package/openwrt/files/etc/init.d/smartdns
@@ -445,6 +445,9 @@ load_second_server()
config_get_bool "seconddns_tcp_server" "$section" "seconddns_tcp_server" "1"
config_get ipv6_server "$section" "ipv6_server" "1"
+ config_get seconddns_server_flags "$section" "seconddns_server_flags" ""
+ [ -z "$seconddns_server_flags" ] || ARGS="$ARGS $seconddns_server_flags"
+
conf_append_bind "$seconddns_port" "$device" "$seconddns_tcp_server" "$ipv6_server" "$ARGS"
}
diff --git a/src/dns.c b/src/dns.c
index 42a3b20..b3d83b6 100644
--- a/src/dns.c
+++ b/src/dns.c
@@ -913,6 +913,11 @@ int dns_add_SOA(struct dns_packet *packet, dns_rr_type type, const char *domain,
unsigned char data[sizeof(*soa)];
unsigned char *ptr = data;
int len = 0;
+
+ if (soa == NULL || domain == NULL || packet == NULL) {
+ return -1;
+ }
+
safe_strncpy((char *)ptr, soa->mname, DNS_MAX_CNAME_LEN);
ptr += strnlen(soa->mname, DNS_MAX_CNAME_LEN - 1) + 1;
safe_strncpy((char *)ptr, soa->rname, DNS_MAX_CNAME_LEN);
diff --git a/src/dns_client.c b/src/dns_client.c
index 2fddfe3..ce9f7d8 100644
--- a/src/dns_client.c
+++ b/src/dns_client.c
@@ -56,7 +56,7 @@
#include
#define DNS_MAX_HOSTNAME 256
-#define DNS_MAX_EVENTS 64
+#define DNS_MAX_EVENTS 256
#define DNS_HOSTNAME_LEN 128
#define DNS_TCP_BUFFER (32 * 1024)
#define DNS_TCP_IDLE_TIMEOUT (60 * 10)
diff --git a/src/dns_conf.c b/src/dns_conf.c
index 78b607b..dcc41a0 100644
--- a/src/dns_conf.c
+++ b/src/dns_conf.c
@@ -3308,18 +3308,20 @@ static int _config_log_level(void *data, int argc, char *argv[])
/* read log level and set */
char *value = argv[1];
- if (strncmp("debug", value, MAX_LINE_LEN) == 0) {
+ if (strncasecmp("debug", value, MAX_LINE_LEN) == 0) {
dns_conf_log_level = TLOG_DEBUG;
- } else if (strncmp("info", value, MAX_LINE_LEN) == 0) {
+ } else if (strncasecmp("info", value, MAX_LINE_LEN) == 0) {
dns_conf_log_level = TLOG_INFO;
- } else if (strncmp("notice", value, MAX_LINE_LEN) == 0) {
+ } else if (strncasecmp("notice", value, MAX_LINE_LEN) == 0) {
dns_conf_log_level = TLOG_NOTICE;
- } else if (strncmp("warn", value, MAX_LINE_LEN) == 0) {
+ } else if (strncasecmp("warn", value, MAX_LINE_LEN) == 0) {
dns_conf_log_level = TLOG_WARN;
- } else if (strncmp("error", value, MAX_LINE_LEN) == 0) {
+ } else if (strncasecmp("error", value, MAX_LINE_LEN) == 0) {
dns_conf_log_level = TLOG_ERROR;
- } else if (strncmp("fatal", value, MAX_LINE_LEN) == 0) {
+ } else if (strncasecmp("fatal", value, MAX_LINE_LEN) == 0) {
dns_conf_log_level = TLOG_FATAL;
+ } else if (strncasecmp("off", value, MAX_LINE_LEN) == 0) {
+ dns_conf_log_level = TLOG_OFF;
} else {
return -1;
}
diff --git a/src/dns_server.c b/src/dns_server.c
index 777f4a8..5243845 100644
--- a/src/dns_server.c
+++ b/src/dns_server.c
@@ -1122,6 +1122,11 @@ static int _dns_server_reply_tcp(struct dns_request *request, struct dns_server_
unsigned char inpacket_data[DNS_IN_PACKSIZE];
unsigned char *inpacket = inpacket_data;
+ if (len > sizeof(inpacket_data) - 2) {
+ tlog(TLOG_ERROR, "packet size is invalid.");
+ return -1;
+ }
+
/* TCP query format
* | len (short) | dns query data |
*/
@@ -6361,6 +6366,7 @@ static void _dns_server_save_cache_to_file(void)
close(i);
}
+ tlog_setlevel(TLOG_OFF);
_dns_server_cache_save(1);
_exit(0);
} else if (pid < 0) {
diff --git a/src/proxy.c b/src/proxy.c
index 84c606f..2e5fdbf 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -542,7 +542,7 @@ static proxy_handshake_state _proxy_handshake_socks5(struct proxy_conn *proxy_co
return PROXY_HANDSHAKE_ERR;
}
- tlog(TLOG_INFO, "server %s select auth method is %d", proxy_conn->server_info->proxy_name,
+ tlog(TLOG_DEBUG, "server %s select auth method is %d", proxy_conn->server_info->proxy_name,
proxy_conn->buffer.buffer[1]);
if (proxy_conn->buffer.buffer[1] == PROXY_SOCKS5_AUTH_USER_PASS) {
return _proxy_handshake_socks5_send_auth(proxy_conn);
@@ -592,7 +592,7 @@ static proxy_handshake_state _proxy_handshake_socks5(struct proxy_conn *proxy_co
return PROXY_HANDSHAKE_ERR;
}
- tlog(TLOG_INFO, "server %s auth success", proxy_conn->server_info->proxy_name);
+ tlog(TLOG_DEBUG, "server %s auth success", proxy_conn->server_info->proxy_name);
proxy_conn->state = PROXY_CONN_CONNECTING;
return _proxy_handshake_socks5_reply_connect_addr(proxy_conn);
case PROXY_CONN_CONNECTING: {
@@ -720,7 +720,7 @@ static proxy_handshake_state _proxy_handshake_socks5(struct proxy_conn *proxy_co
}
proxy_conn->state = PROXY_CONN_CONNECTED;
- tlog(TLOG_INFO, "success connect to socks5 proxy server %s", proxy_conn->server_info->proxy_name);
+ tlog(TLOG_DEBUG, "success connect to socks5 proxy server %s", proxy_conn->server_info->proxy_name);
return PROXY_HANDSHAKE_CONNECTED;
} break;
default:
@@ -838,7 +838,7 @@ static int _proxy_handshake_http(struct proxy_conn *proxy_conn)
if (proxy_conn->buffer.len < 0) {
proxy_conn->buffer.len = 0;
}
- tlog(TLOG_INFO, "success connect to http proxy server %s", proxy_conn->server_info->proxy_name);
+ tlog(TLOG_DEBUG, "success connect to http proxy server %s", proxy_conn->server_info->proxy_name);
proxy_conn->state = PROXY_CONN_CONNECTED;
ret = PROXY_HANDSHAKE_CONNECTED;
goto out;
@@ -929,6 +929,11 @@ int proxy_conn_sendto(struct proxy_conn *proxy_conn, const void *buf, size_t len
return -1;
}
+ if (sizeof(buffer) - buffer_len <= len) {
+ errno = ENOSPC;
+ return -1;
+ }
+
memcpy(buffer + buffer_len, buf, len);
buffer_len += len;
diff --git a/src/tlog.h b/src/tlog.h
index a692de3..0c3f71b 100644
--- a/src/tlog.h
+++ b/src/tlog.h
@@ -26,7 +26,8 @@ typedef enum {
TLOG_WARN = 3,
TLOG_ERROR = 4,
TLOG_FATAL = 5,
- TLOG_END = 6
+ TLOG_OFF = 6,
+ TLOG_END = 7
} tlog_level;
struct tlog_time {