]> git.meshlink.io Git - catta/blobdiff - avahi-daemon/main.c
core: implement packet rate limiting and enable it by default
[catta] / avahi-daemon / main.c
index d1a3b3e773d8efad276d164f457e2b3bd2ef16e1..8bd856eee68a84a8bb5175e2fd7354eb39e357bb 100644 (file)
@@ -332,6 +332,7 @@ static void update_browse_domains(void) {
     l = filter_duplicate_domains(l);
 
     avahi_server_set_browse_domains(avahi_server, l);
+    avahi_string_list_free(l);
 }
 
 static void server_callback(AvahiServer *s, AvahiServerState state, void *userdata) {
@@ -550,6 +551,26 @@ static int parse_unsigned(const char *s, unsigned *u) {
     return 0;
 }
 
+static int parse_usec(const char *s, AvahiUsec *u) {
+    char *e = NULL;
+    unsigned long long ull;
+    AvahiUsec k;
+
+    errno = 0;
+    ull = strtoull(s, &e, 0);
+
+    if (!e || *e || errno != 0)
+        return -1;
+
+    k = (AvahiUsec) ull;
+
+    if ((unsigned long long) k != ull)
+        return -1;
+
+    *u = k;
+    return 0;
+}
+
 static int load_config_file(DaemonConfig *c) {
     int r = -1;
     AvahiIniFile *f;
@@ -641,6 +662,26 @@ static int load_config_file(DaemonConfig *c) {
                         c->server_config.deny_interfaces = avahi_string_list_add(c->server_config.deny_interfaces, *t);
 
                     avahi_strfreev(e);
+                } else if (strcasecmp(p->key, "ratelimit-interval-usec") == 0) {
+                    AvahiUsec k;
+
+                    if (parse_usec(p->value, &k) < 0) {
+                        avahi_log_error("Invalid ratelimit-interval-usec setting %s", p->value);
+                        goto finish;
+                    }
+
+                    c->server_config.ratelimit_interval = k;
+
+                } else if (strcasecmp(p->key, "ratelimit-burst") == 0) {
+                    unsigned k;
+
+                    if (parse_unsigned(p->value, &k) < 0) {
+                        avahi_log_error("Invalid ratelimit-burst setting %s", p->value);
+                        goto finish;
+                    }
+
+                    c->server_config.ratelimit_burst = k;
+
                 } else if (strcasecmp(p->key, "cache-entries-max") == 0) {
                     unsigned k;
 
@@ -1524,10 +1565,8 @@ int main(int argc, char *argv[]) {
             daemon_log_use = DAEMON_LOG_SYSLOG;
 
         if (sd_listen_fds(0) <= 0)
-            if (daemon_close_all(-1) < 0) {
-                avahi_log_error("Failed to close remaining file descriptors: %s", strerror(errno));
-                goto finish;
-            }
+            if (daemon_close_all(-1) < 0)
+                avahi_log_warn("Failed to close all remaining file descriptors: %s", strerror(errno));
 
         if (make_runtime_dir() < 0)
             goto finish;