From 037ca37a213d9e40258f5ebc3b00113df9f842d1 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 25 Jun 2010 23:12:26 +0200 Subject: daemon: make internal limits configurable --- avahi-daemon/avahi-daemon.conf | 6 ++- avahi-daemon/dbus-async-address-resolver.c | 2 +- avahi-daemon/dbus-async-host-name-resolver.c | 3 +- avahi-daemon/dbus-async-service-resolver.c | 3 +- avahi-daemon/dbus-domain-browser.c | 3 +- avahi-daemon/dbus-entry-group.c | 12 ++--- avahi-daemon/dbus-internal.h | 18 ++++--- avahi-daemon/dbus-protocol.c | 44 +++++++++-------- avahi-daemon/dbus-protocol.h | 7 ++- avahi-daemon/dbus-record-browser.c | 2 +- avahi-daemon/dbus-service-browser.c | 2 +- avahi-daemon/dbus-service-type-browser.c | 4 +- avahi-daemon/dbus-sync-address-resolver.c | 2 +- avahi-daemon/dbus-sync-host-name-resolver.c | 2 +- avahi-daemon/dbus-sync-service-resolver.c | 2 +- avahi-daemon/main.c | 71 +++++++++++++++++++++++++++- 16 files changed, 134 insertions(+), 49 deletions(-) (limited to 'avahi-daemon') diff --git a/avahi-daemon/avahi-daemon.conf b/avahi-daemon/avahi-daemon.conf index 38f1d49..b3185c7 100644 --- a/avahi-daemon/avahi-daemon.conf +++ b/avahi-daemon/avahi-daemon.conf @@ -1,5 +1,5 @@ # This file is part of avahi. -# +# # avahi is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2 of the @@ -31,6 +31,10 @@ use-ipv6=no #enable-dbus=yes #disallow-other-stacks=no #allow-point-to-point=no +#cache-entries-max=500 +#clients-max=256 +#objects-per-client-max=250 +#entries-per-entry-group-max=20 [wide-area] enable-wide-area=yes diff --git a/avahi-daemon/dbus-async-address-resolver.c b/avahi-daemon/dbus-async-address-resolver.c index 1959841..dcb15e7 100644 --- a/avahi-daemon/dbus-async-address-resolver.c +++ b/avahi-daemon/dbus-async-address-resolver.c @@ -44,8 +44,8 @@ void avahi_dbus_async_address_resolver_free(AsyncAddressResolverInfo *i) { AVAHI_LLIST_REMOVE(AsyncAddressResolverInfo, async_address_resolvers, i->client->async_address_resolvers, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } diff --git a/avahi-daemon/dbus-async-host-name-resolver.c b/avahi-daemon/dbus-async-host-name-resolver.c index 7f8adb6..936c3f9 100644 --- a/avahi-daemon/dbus-async-host-name-resolver.c +++ b/avahi-daemon/dbus-async-host-name-resolver.c @@ -43,8 +43,8 @@ void avahi_dbus_async_host_name_resolver_free(AsyncHostNameResolverInfo *i) { } AVAHI_LLIST_REMOVE(AsyncHostNameResolverInfo, async_host_name_resolvers, i->client->async_host_name_resolvers, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } @@ -133,4 +133,3 @@ fail: return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - diff --git a/avahi-daemon/dbus-async-service-resolver.c b/avahi-daemon/dbus-async-service-resolver.c index 462f9b3..023543d 100644 --- a/avahi-daemon/dbus-async-service-resolver.c +++ b/avahi-daemon/dbus-async-service-resolver.c @@ -44,8 +44,8 @@ void avahi_dbus_async_service_resolver_free(AsyncServiceResolverInfo *i) { AVAHI_LLIST_REMOVE(AsyncServiceResolverInfo, async_service_resolvers, i->client->async_service_resolvers, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } @@ -172,4 +172,3 @@ fail: return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - diff --git a/avahi-daemon/dbus-domain-browser.c b/avahi-daemon/dbus-domain-browser.c index 8c698b0..80155b2 100644 --- a/avahi-daemon/dbus-domain-browser.c +++ b/avahi-daemon/dbus-domain-browser.c @@ -44,8 +44,8 @@ void avahi_dbus_domain_browser_free(DomainBrowserInfo *i) { AVAHI_LLIST_REMOVE(DomainBrowserInfo, domain_browsers, i->client->domain_browsers, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } @@ -125,4 +125,3 @@ void avahi_dbus_domain_browser_callback(AvahiSDomainBrowser *b, AvahiIfIndex int dbus_connection_send(server->bus, m, NULL); dbus_message_unref(m); } - diff --git a/avahi-daemon/dbus-entry-group.c b/avahi-daemon/dbus-entry-group.c index b2fb165..45c9be3 100644 --- a/avahi-daemon/dbus-entry-group.c +++ b/avahi-daemon/dbus-entry-group.c @@ -45,8 +45,8 @@ void avahi_dbus_entry_group_free(EntryGroupInfo *i) { } AVAHI_LLIST_REMOVE(EntryGroupInfo, entry_groups, i->client->entry_groups, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } @@ -135,7 +135,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage } avahi_s_entry_group_reset(i->entry_group); - i->n_entries = 0; + i->n_entries = 0; return avahi_dbus_respond_ok(c, m); } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_ENTRY_GROUP, "IsEmpty")) { @@ -182,7 +182,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage goto fail; } - if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX) { + if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= server->n_entries_per_entry_group_max) { avahi_string_list_free(strlst); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL); } @@ -225,7 +225,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage goto fail; } - if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX) + if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= server->n_entries_per_entry_group_max) return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL); if (domain && !*domain) @@ -290,7 +290,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage goto fail; } - if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX) + if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= server->n_entries_per_entry_group_max) return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL); if (!(avahi_address_parse(address, AVAHI_PROTO_UNSPEC, &a))) @@ -326,7 +326,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage goto fail; } - if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX) + if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= server->n_entries_per_entry_group_max) return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL); if (!avahi_is_valid_domain_name (name)) diff --git a/avahi-daemon/dbus-internal.h b/avahi-daemon/dbus-internal.h index d721d38..a786d62 100644 --- a/avahi-daemon/dbus-internal.h +++ b/avahi-daemon/dbus-internal.h @@ -43,9 +43,9 @@ typedef struct SyncServiceResolverInfo SyncServiceResolverInfo; typedef struct AsyncServiceResolverInfo AsyncServiceResolverInfo; typedef struct RecordBrowserInfo RecordBrowserInfo; -#define CLIENTS_MAX 256 -#define OBJECTS_PER_CLIENT_MAX 250 -#define ENTRIES_PER_ENTRY_GROUP_MAX 20 +#define DEFAULT_CLIENTS_MAX 256 +#define DEFAULT_OBJECTS_PER_CLIENT_MAX 250 +#define DEFAULT_ENTRIES_PER_ENTRY_GROUP_MAX 20 struct EntryGroupInfo { unsigned id; @@ -53,7 +53,7 @@ struct EntryGroupInfo { AvahiSEntryGroup *entry_group; char *path; - int n_entries; + unsigned n_entries; AVAHI_LLIST_FIELDS(EntryGroupInfo, entry_groups); }; @@ -149,7 +149,7 @@ struct Client { unsigned id; char *name; unsigned current_id; - int n_objects; + unsigned n_objects; AVAHI_LLIST_FIELDS(Client, clients); AVAHI_LLIST_HEAD(EntryGroupInfo, entry_groups); @@ -169,11 +169,17 @@ struct Server { const AvahiPoll *poll_api; DBusConnection *bus; AVAHI_LLIST_HEAD(Client, clients); - int n_clients; + unsigned n_clients; unsigned current_id; AvahiTimeout *reconnect_timeout; int reconnect; + + unsigned n_clients_max; + unsigned n_objects_per_client_max; + unsigned n_entries_per_entry_group_max; + + int disable_user_service_publishing; }; extern Server *server; diff --git a/avahi-daemon/dbus-protocol.c b/avahi-daemon/dbus-protocol.c index 283c27b..937e64d 100644 --- a/avahi-daemon/dbus-protocol.c +++ b/avahi-daemon/dbus-protocol.c @@ -63,8 +63,6 @@ Server *server = NULL; -static int disable_user_service_publishing = 0; - static int dbus_connect(void); static void dbus_disconnect(void); @@ -112,8 +110,8 @@ static void client_free(Client *c) { AVAHI_LLIST_REMOVE(Client, clients, server->clients, c); avahi_free(c); + assert(server->n_clients >= 1); server->n_clients --; - assert(server->n_clients >= 0); } static Client *client_get(const char *name, int create) { @@ -129,7 +127,7 @@ static Client *client_get(const char *name, int create) { if (!create) return NULL; - if (server->n_clients >= CLIENTS_MAX) + if (server->n_clients >= server->n_clients_max) return NULL; /* If not existent yet, create a new entry */ @@ -344,7 +342,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_SERVER, "GetNetworkInterfaceNameByIndex")) { int32_t idx; - char name[IF_NAMESIZE]; + char name[IF_NAMESIZE]; if (!(dbus_message_get_args(m, &error, DBUS_TYPE_INT32, &idx, DBUS_TYPE_INVALID))) { avahi_log_warn("Error parsing Server::GetNetworkInterfaceNameByIndex message"); @@ -429,7 +427,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH goto fail; } - if (disable_user_service_publishing) + if (server->disable_user_service_publishing) return avahi_dbus_respond_error(c, m, AVAHI_ERR_NOT_PERMITTED, NULL); if (!(client = client_get(dbus_message_get_sender(m), TRUE))) { @@ -437,7 +435,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn("Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -483,7 +481,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn("Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -528,7 +526,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn("Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -578,7 +576,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn("Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -633,7 +631,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn("Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -689,7 +687,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn("Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -739,7 +737,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn("Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -797,7 +795,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -858,7 +856,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -914,7 +912,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -973,7 +971,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL); } - if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) { + if (client->n_objects >= server->n_objects_per_client_max) { avahi_log_warn("Too many objects for client '%s', client request failed.", client->name); return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL); } @@ -1157,9 +1155,13 @@ static void dbus_disconnect(void) { } } -int dbus_protocol_setup(const AvahiPoll *poll_api, int _disable_user_service_publishing, int force) { +int dbus_protocol_setup(const AvahiPoll *poll_api, + int _disable_user_service_publishing, + int _n_clients_max, + int _n_objects_per_client_max, + int _n_entries_per_entry_group_max, + int force) { - disable_user_service_publishing = _disable_user_service_publishing; server = avahi_new(Server, 1); AVAHI_LLIST_HEAD_INIT(Clients, server->clients); @@ -1169,6 +1171,10 @@ int dbus_protocol_setup(const AvahiPoll *poll_api, int _disable_user_service_pub server->poll_api = poll_api; server->reconnect_timeout = NULL; server->reconnect = force; + server->disable_user_service_publishing = _disable_user_service_publishing; + server->n_clients_max = _n_clients_max > 0 ? _n_clients_max : DEFAULT_CLIENTS_MAX; + server->n_objects_per_client_max = _n_objects_per_client_max > 0 ? _n_objects_per_client_max : DEFAULT_OBJECTS_PER_CLIENT_MAX; + server->n_entries_per_entry_group_max = _n_entries_per_entry_group_max > 0 ? _n_entries_per_entry_group_max : DEFAULT_ENTRIES_PER_ENTRY_GROUP_MAX; if (dbus_connect() < 0) { struct timeval tv; diff --git a/avahi-daemon/dbus-protocol.h b/avahi-daemon/dbus-protocol.h index 66b2f74..2184487 100644 --- a/avahi-daemon/dbus-protocol.h +++ b/avahi-daemon/dbus-protocol.h @@ -20,7 +20,12 @@ USA. ***/ -int dbus_protocol_setup(const AvahiPoll *poll_api, int disable_user_service_publishing, int force); +int dbus_protocol_setup(const AvahiPoll *poll_api, + int _disable_user_service_publishing, + int _n_clients_max, + int _n_objects_per_client_max, + int _n_entries_per_entry_group_max, + int force); void dbus_protocol_shutdown(void); void dbus_protocol_server_state_changed(AvahiServerState state); diff --git a/avahi-daemon/dbus-record-browser.c b/avahi-daemon/dbus-record-browser.c index 752510b..57be6e8 100644 --- a/avahi-daemon/dbus-record-browser.c +++ b/avahi-daemon/dbus-record-browser.c @@ -43,8 +43,8 @@ void avahi_dbus_record_browser_free(RecordBrowserInfo *i) { } AVAHI_LLIST_REMOVE(RecordBrowserInfo, record_browsers, i->client->record_browsers, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } diff --git a/avahi-daemon/dbus-service-browser.c b/avahi-daemon/dbus-service-browser.c index 39251f5..f945e65 100644 --- a/avahi-daemon/dbus-service-browser.c +++ b/avahi-daemon/dbus-service-browser.c @@ -44,8 +44,8 @@ void avahi_dbus_service_browser_free(ServiceBrowserInfo *i) { AVAHI_LLIST_REMOVE(ServiceBrowserInfo, service_browsers, i->client->service_browsers, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } diff --git a/avahi-daemon/dbus-service-type-browser.c b/avahi-daemon/dbus-service-type-browser.c index db7a038..ce4787f 100644 --- a/avahi-daemon/dbus-service-type-browser.c +++ b/avahi-daemon/dbus-service-type-browser.c @@ -44,8 +44,8 @@ void avahi_dbus_service_type_browser_free(ServiceTypeBrowserInfo *i) { AVAHI_LLIST_REMOVE(ServiceTypeBrowserInfo, service_type_browsers, i->client->service_type_browsers, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } @@ -127,5 +127,3 @@ void avahi_dbus_service_type_browser_callback(AvahiSServiceTypeBrowser *b, Avahi dbus_connection_send(server->bus, m, NULL); dbus_message_unref(m); } - - diff --git a/avahi-daemon/dbus-sync-address-resolver.c b/avahi-daemon/dbus-sync-address-resolver.c index c35711b..5cad5a7 100644 --- a/avahi-daemon/dbus-sync-address-resolver.c +++ b/avahi-daemon/dbus-sync-address-resolver.c @@ -40,8 +40,8 @@ void avahi_dbus_sync_address_resolver_free(SyncAddressResolverInfo *i) { dbus_message_unref(i->message); AVAHI_LLIST_REMOVE(SyncAddressResolverInfo, sync_address_resolvers, i->client->sync_address_resolvers, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } diff --git a/avahi-daemon/dbus-sync-host-name-resolver.c b/avahi-daemon/dbus-sync-host-name-resolver.c index 16b6451..febbd25 100644 --- a/avahi-daemon/dbus-sync-host-name-resolver.c +++ b/avahi-daemon/dbus-sync-host-name-resolver.c @@ -40,8 +40,8 @@ void avahi_dbus_sync_host_name_resolver_free(SyncHostNameResolverInfo *i) { dbus_message_unref(i->message); AVAHI_LLIST_REMOVE(SyncHostNameResolverInfo, sync_host_name_resolvers, i->client->sync_host_name_resolvers, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } diff --git a/avahi-daemon/dbus-sync-service-resolver.c b/avahi-daemon/dbus-sync-service-resolver.c index 719cbaa..6d39d4e 100644 --- a/avahi-daemon/dbus-sync-service-resolver.c +++ b/avahi-daemon/dbus-sync-service-resolver.c @@ -40,8 +40,8 @@ void avahi_dbus_sync_service_resolver_free(SyncServiceResolverInfo *i) { dbus_message_unref(i->message); AVAHI_LLIST_REMOVE(SyncServiceResolverInfo, sync_service_resolvers, i->client->sync_service_resolvers, i); + assert(i->client->n_objects >= 1); i->client->n_objects--; - assert(i->client->n_objects >= 0); avahi_free(i); } diff --git a/avahi-daemon/main.c b/avahi-daemon/main.c index d270c31..d1a3b3e 100644 --- a/avahi-daemon/main.c +++ b/avahi-daemon/main.c @@ -106,6 +106,9 @@ typedef struct { #ifdef HAVE_DBUS int enable_dbus; int fail_on_missing_dbus; + unsigned n_clients_max; + unsigned n_objects_per_client_max; + unsigned n_entries_per_entry_group_max; #endif int drop_root; int set_rlimits; @@ -527,6 +530,26 @@ static int is_yes(const char *s) { return *s == 'y' || *s == 'Y' || *s == '1' || *s == 't' || *s == 'T'; } +static int parse_unsigned(const char *s, unsigned *u) { + char *e = NULL; + unsigned long ul; + unsigned k; + + errno = 0; + ul = strtoul(s, &e, 0); + + if (!e || *e || errno != 0) + return -1; + + k = (unsigned) ul; + + if ((unsigned long) k != ul) + return -1; + + *u = k; + return 0; +} + static int load_config_file(DaemonConfig *c) { int r = -1; AvahiIniFile *f; @@ -618,6 +641,44 @@ 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, "cache-entries-max") == 0) { + unsigned k; + + if (parse_unsigned(p->value, &k) < 0) { + avahi_log_error("Invalid cache-entries-max setting %s", p->value); + goto finish; + } + + c->server_config.n_cache_entries_max = k; +#ifdef HAVE_DBUS + } else if (strcasecmp(p->key, "clients-max") == 0) { + unsigned k; + + if (parse_unsigned(p->value, &k) < 0) { + avahi_log_error("Invalid clients-max setting %s", p->value); + goto finish; + } + + c->n_clients_max = k; + } else if (strcasecmp(p->key, "objects-per-client-max") == 0) { + unsigned k; + + if (parse_unsigned(p->value, &k) < 0) { + avahi_log_error("Invalid objects-per-client-max setting %s", p->value); + goto finish; + } + + c->n_objects_per_client_max = k; + } else if (strcasecmp(p->key, "entries-per-entry-group-max") == 0) { + unsigned k; + + if (parse_unsigned(p->value, &k) < 0) { + avahi_log_error("Invalid entries-per-entry-group-max setting %s", p->value); + goto finish; + } + + c->n_entries_per_entry_group_max = k; +#endif } else { avahi_log_error("Invalid configuration key \"%s\" in group \"%s\"\n", p->key, g->name); goto finish; @@ -1009,7 +1070,12 @@ static int run_server(DaemonConfig *c) { #ifdef HAVE_DBUS if (c->enable_dbus) { - if (dbus_protocol_setup(poll_api, config.disable_user_service_publishing, !c->fail_on_missing_dbus + if (dbus_protocol_setup(poll_api, + config.disable_user_service_publishing, + config.n_clients_max, + config.n_objects_per_client_max, + config.n_entries_per_entry_group_max, + !c->fail_on_missing_dbus #ifdef ENABLE_CHROOT && !config.use_chroot #endif @@ -1347,6 +1413,9 @@ int main(int argc, char *argv[]) { #ifdef HAVE_DBUS config.enable_dbus = 1; config.fail_on_missing_dbus = 1; + config.n_clients_max = 0; + config.n_objects_per_client_max = 0; + config.n_entries_per_entry_group_max = 0; #endif config.drop_root = 1; -- cgit