Package: release.debian.org
Severity: normal
Tags: bookworm moreinfo
User: release.debian....@packages.debian.org
Usertags: pu
X-Debbugs-Cc: secur...@debian.org, Michael Biebl <bi...@debian.org>, Utopia 
Maintenance Team <pkg-utopia-maintain...@lists.alioth.debian.org>

  * core: make sure there is rdata to process before parsing it.
    Patch cherry-picked from upstream Git.
    (CVE-2023-38472, Closes: #1054879)
  * core: reject overly long TXT resource records.
    Patches cherry-picked from upstream Git.
    (CVE-2023-38469, Closes: #1054876)
  * Ensure each label is at least one byte long.
    Patch cherry-picked from upstream Git.
    (CVE-2023-38470, Closes: #1054877)
  * core: extract host name using avahi_unescape_label()
    Patch cherry-picked from upstream Git.
    (CVE-2023-38471, Closes: #1054878)
  * common: derive alternative host name from its unescaped version.
    Patch cherry-picked from upstream Git.
    (CVE-2023-38473, Closes: #1054880)
  * Fix browsing when invalid services present.
    See https://github.com/lathiat/avahi/issues/212


Tagged moreinfo for two reasons:

1. This is work done by Michael Biebl, it would be fine for me
   to close this request for a maintainer upload.

2. A question to the security team is whether the last item should
   get a CVE, there is some discussion in the upstream issue about
   that but apparently none has been assigned.
diffstat for avahi-0.8 avahi-0.8

 changelog                                                               |   25 
+
 patches/Ensure-each-label-is-at-least-one-byte-long.patch               |   54 
+++
 patches/common-derive-alternative-host-name-from-its-unescaped-ve.patch |  105 
++++++
 patches/core-extract-host-name-using-avahi_unescape_label.patch         |   70 
++++
 patches/core-make-sure-there-is-rdata-to-process-before-parsing-i.patch |   42 
++
 patches/core-no-longer-supply-bogus-services-to-callbacks.patch         |  159 
++++++++++
 patches/core-reject-overly-long-TXT-resource-records.patch              |   45 
++
 patches/series                                                          |    7 
 patches/tests-pass-overly-long-TXT-resource-records.patch               |   60 
+++
 9 files changed, 567 insertions(+)

diff -Nru avahi-0.8/debian/changelog avahi-0.8/debian/changelog
--- avahi-0.8/debian/changelog  2023-04-19 14:51:49.000000000 +0300
+++ avahi-0.8/debian/changelog  2024-12-19 09:01:14.000000000 +0200
@@ -1,3 +1,28 @@
+avahi (0.8-10+deb12u1) bookworm; urgency=medium
+
+  * Non-maintainer upload.
+
+  [ Michael Biebl ]
+  * core: make sure there is rdata to process before parsing it.
+    Patch cherry-picked from upstream Git.
+    (CVE-2023-38472, Closes: #1054879)
+  * core: reject overly long TXT resource records.
+    Patches cherry-picked from upstream Git.
+    (CVE-2023-38469, Closes: #1054876)
+  * Ensure each label is at least one byte long.
+    Patch cherry-picked from upstream Git.
+    (CVE-2023-38470, Closes: #1054877)
+  * core: extract host name using avahi_unescape_label()
+    Patch cherry-picked from upstream Git.
+    (CVE-2023-38471, Closes: #1054878)
+  * common: derive alternative host name from its unescaped version.
+    Patch cherry-picked from upstream Git.
+    (CVE-2023-38473, Closes: #1054880)
+  * Fix browsing when invalid services present.
+    See https://github.com/lathiat/avahi/issues/212
+
+ -- Adrian Bunk <b...@debian.org>  Thu, 19 Dec 2024 09:01:14 +0200
+
 avahi (0.8-10) unstable; urgency=medium
 
   [ Felix Geyer ]
diff -Nru 
avahi-0.8/debian/patches/common-derive-alternative-host-name-from-its-unescaped-ve.patch
 
avahi-0.8/debian/patches/common-derive-alternative-host-name-from-its-unescaped-ve.patch
--- 
avahi-0.8/debian/patches/common-derive-alternative-host-name-from-its-unescaped-ve.patch
    1970-01-01 02:00:00.000000000 +0200
+++ 
avahi-0.8/debian/patches/common-derive-alternative-host-name-from-its-unescaped-ve.patch
    2024-12-19 08:52:04.000000000 +0200
@@ -0,0 +1,105 @@
+From: Michal Sekletar <msekl...@redhat.com>
+Date: Wed, 11 Oct 2023 17:45:44 +0200
+Subject: common: derive alternative host name from its unescaped version
+
+Normalization of input makes sure we don't have to deal with special
+cases like unescaped dot at the end of label.
+
+Fixes #451 #487
+CVE-2023-38473
+
+(cherry picked from commit b448c9f771bada14ae8de175695a9729f8646797)
+Origin: 
https://github.com/avahi/avahi/commit/b448c9f771bada14ae8de175695a9729f8646797
+---
+ avahi-common/alternative-test.c |  3 +++
+ avahi-common/alternative.c      | 27 +++++++++++++++++++--------
+ 2 files changed, 22 insertions(+), 8 deletions(-)
+
+diff --git a/avahi-common/alternative-test.c b/avahi-common/alternative-test.c
+index 9255435..681fc15 100644
+--- a/avahi-common/alternative-test.c
++++ b/avahi-common/alternative-test.c
+@@ -31,6 +31,9 @@ int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char 
*argv[]) {
+     const char* const test_strings[] = {
+         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXüüüüüüü",
++        ").",
++        "\\.",
++        "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\\",
+         "gurke",
+         "-",
+         " #",
+diff --git a/avahi-common/alternative.c b/avahi-common/alternative.c
+index b3d39f0..a094e6d 100644
+--- a/avahi-common/alternative.c
++++ b/avahi-common/alternative.c
+@@ -49,15 +49,20 @@ static void drop_incomplete_utf8(char *c) {
+ }
+ 
+ char *avahi_alternative_host_name(const char *s) {
++    char label[AVAHI_LABEL_MAX], alternative[AVAHI_LABEL_MAX*4+1];
++    char *alt, *r, *ret;
+     const char *e;
+-    char *r;
++    size_t len;
+ 
+     assert(s);
+ 
+     if (!avahi_is_valid_host_name(s))
+         return NULL;
+ 
+-    if ((e = strrchr(s, '-'))) {
++    if (!avahi_unescape_label(&s, label, sizeof(label)))
++        return NULL;
++
++    if ((e = strrchr(label, '-'))) {
+         const char *p;
+ 
+         e++;
+@@ -74,19 +79,18 @@ char *avahi_alternative_host_name(const char *s) {
+ 
+     if (e) {
+         char *c, *m;
+-        size_t l;
+         int n;
+ 
+         n = atoi(e)+1;
+         if (!(m = avahi_strdup_printf("%i", n)))
+             return NULL;
+ 
+-        l = e-s-1;
++        len = e-label-1;
+ 
+-        if (l >= AVAHI_LABEL_MAX-1-strlen(m)-1)
+-            l = AVAHI_LABEL_MAX-1-strlen(m)-1;
++        if (len >= AVAHI_LABEL_MAX-1-strlen(m)-1)
++            len = AVAHI_LABEL_MAX-1-strlen(m)-1;
+ 
+-        if (!(c = avahi_strndup(s, l))) {
++        if (!(c = avahi_strndup(label, len))) {
+             avahi_free(m);
+             return NULL;
+         }
+@@ -100,7 +104,7 @@ char *avahi_alternative_host_name(const char *s) {
+     } else {
+         char *c;
+ 
+-        if (!(c = avahi_strndup(s, AVAHI_LABEL_MAX-1-2)))
++        if (!(c = avahi_strndup(label, AVAHI_LABEL_MAX-1-2)))
+             return NULL;
+ 
+         drop_incomplete_utf8(c);
+@@ -109,6 +113,13 @@ char *avahi_alternative_host_name(const char *s) {
+         avahi_free(c);
+     }
+ 
++    alt = alternative;
++    len = sizeof(alternative);
++    ret = avahi_escape_label(r, strlen(r), &alt, &len);
++
++    avahi_free(r);
++    r = avahi_strdup(ret);
++
+     assert(avahi_is_valid_host_name(r));
+ 
+     return r;
diff -Nru 
avahi-0.8/debian/patches/core-extract-host-name-using-avahi_unescape_label.patch
 
avahi-0.8/debian/patches/core-extract-host-name-using-avahi_unescape_label.patch
--- 
avahi-0.8/debian/patches/core-extract-host-name-using-avahi_unescape_label.patch
    1970-01-01 02:00:00.000000000 +0200
+++ 
avahi-0.8/debian/patches/core-extract-host-name-using-avahi_unescape_label.patch
    2024-12-19 08:52:04.000000000 +0200
@@ -0,0 +1,70 @@
+From: Michal Sekletar <msekl...@redhat.com>
+Date: Mon, 23 Oct 2023 13:38:35 +0200
+Subject: core: extract host name using avahi_unescape_label()
+
+Previously we could create invalid escape sequence when we split the
+string on dot. For example, from valid host name "foo\\.bar" we have
+created invalid name "foo\\" and tried to set that as the host name
+which crashed the daemon.
+
+Fixes #453
+
+CVE-2023-38471
+
+(cherry picked from commit 894f085f402e023a98cbb6f5a3d117bd88d93b09)
+Origin: 
https://github.com/avahi/avahi/commit/894f085f402e023a98cbb6f5a3d117bd88d93b09
+---
+ avahi-core/server.c | 27 +++++++++++++++++++++------
+ 1 file changed, 21 insertions(+), 6 deletions(-)
+
+diff --git a/avahi-core/server.c b/avahi-core/server.c
+index e507750..40f1d68 100644
+--- a/avahi-core/server.c
++++ b/avahi-core/server.c
+@@ -1295,7 +1295,11 @@ static void update_fqdn(AvahiServer *s) {
+ }
+ 
+ int avahi_server_set_host_name(AvahiServer *s, const char *host_name) {
+-    char *hn = NULL;
++    char label_escaped[AVAHI_LABEL_MAX*4+1];
++    char label[AVAHI_LABEL_MAX];
++    char *hn = NULL, *h;
++    size_t len;
++
+     assert(s);
+ 
+     AVAHI_CHECK_VALIDITY(s, !host_name || 
avahi_is_valid_host_name(host_name), AVAHI_ERR_INVALID_HOST_NAME);
+@@ -1305,17 +1309,28 @@ int avahi_server_set_host_name(AvahiServer *s, const 
char *host_name) {
+     else
+         hn = avahi_normalize_name_strdup(host_name);
+ 
+-    hn[strcspn(hn, ".")] = 0;
++    h = hn;
++    if (!avahi_unescape_label((const char **)&hn, label, sizeof(label))) {
++        avahi_free(h);
++        return AVAHI_ERR_INVALID_HOST_NAME;
++    }
++
++    avahi_free(h);
++
++    h = label_escaped;
++    len = sizeof(label_escaped);
++    if (!avahi_escape_label(label, strlen(label), &h, &len))
++        return AVAHI_ERR_INVALID_HOST_NAME;
+ 
+-    if (avahi_domain_equal(s->host_name, hn) && s->state != 
AVAHI_SERVER_COLLISION) {
+-        avahi_free(hn);
++    if (avahi_domain_equal(s->host_name, label_escaped) && s->state != 
AVAHI_SERVER_COLLISION)
+         return avahi_server_set_errno(s, AVAHI_ERR_NO_CHANGE);
+-    }
+ 
+     withdraw_host_rrs(s);
+ 
+     avahi_free(s->host_name);
+-    s->host_name = hn;
++    s->host_name = avahi_strdup(label_escaped);
++    if (!s->host_name)
++        return AVAHI_ERR_NO_MEMORY;
+ 
+     update_fqdn(s);
+ 
diff -Nru 
avahi-0.8/debian/patches/core-make-sure-there-is-rdata-to-process-before-parsing-i.patch
 
avahi-0.8/debian/patches/core-make-sure-there-is-rdata-to-process-before-parsing-i.patch
--- 
avahi-0.8/debian/patches/core-make-sure-there-is-rdata-to-process-before-parsing-i.patch
    1970-01-01 02:00:00.000000000 +0200
+++ 
avahi-0.8/debian/patches/core-make-sure-there-is-rdata-to-process-before-parsing-i.patch
    2024-12-19 08:52:04.000000000 +0200
@@ -0,0 +1,42 @@
+From: Michal Sekletar <msekl...@redhat.com>
+Date: Thu, 19 Oct 2023 17:36:44 +0200
+Subject: core: make sure there is rdata to process before parsing it
+
+Fixes #452
+
+CVE-2023-38472
+
+(cherry picked from commit b024ae5749f4aeba03478e6391687c3c9c8dee40)
+Origin: 
https://github.com/avahi/avahi/commit/b024ae5749f4aeba03478e6391687c3c9c8dee40
+---
+ avahi-client/client-test.c      | 3 +++
+ avahi-daemon/dbus-entry-group.c | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/avahi-client/client-test.c b/avahi-client/client-test.c
+index 7d04a6a..57750a4 100644
+--- a/avahi-client/client-test.c
++++ b/avahi-client/client-test.c
+@@ -258,6 +258,9 @@ int main (AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char 
*argv[]) {
+     printf("%s\n", avahi_strerror(avahi_entry_group_add_service (group, 
AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, "Lathiat's Site", "_http._tcp", NULL, 
NULL, 80, "foo=bar", NULL)));
+     printf("add_record: %d\n", avahi_entry_group_add_record (group, 
AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, "TestX", 0x01, 0x10, 120, "\5booya", 
6));
+ 
++    error = avahi_entry_group_add_record (group, AVAHI_IF_UNSPEC, 
AVAHI_PROTO_UNSPEC, 0, "TestX", 0x01, 0x10, 120, "", 0);
++    assert(error != AVAHI_OK);
++
+     avahi_entry_group_commit (group);
+ 
+     domain = avahi_domain_browser_new (avahi, AVAHI_IF_UNSPEC, 
AVAHI_PROTO_UNSPEC, NULL, AVAHI_DOMAIN_BROWSER_BROWSE, 0, 
avahi_domain_browser_callback, (char*) "omghai3u");
+diff --git a/avahi-daemon/dbus-entry-group.c b/avahi-daemon/dbus-entry-group.c
+index 4e879a5..aa23d4b 100644
+--- a/avahi-daemon/dbus-entry-group.c
++++ b/avahi-daemon/dbus-entry-group.c
+@@ -340,7 +340,7 @@ DBusHandlerResult 
avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage
+         if (!(r = avahi_record_new_full (name, clazz, type, ttl)))
+             return avahi_dbus_respond_error(c, m, AVAHI_ERR_NO_MEMORY, NULL);
+ 
+-        if (avahi_rdata_parse (r, rdata, size) < 0) {
++        if (!rdata || avahi_rdata_parse (r, rdata, size) < 0) {
+             avahi_record_unref (r);
+             return avahi_dbus_respond_error(c, m, AVAHI_ERR_INVALID_RDATA, 
NULL);
+         }
diff -Nru 
avahi-0.8/debian/patches/core-no-longer-supply-bogus-services-to-callbacks.patch
 
avahi-0.8/debian/patches/core-no-longer-supply-bogus-services-to-callbacks.patch
--- 
avahi-0.8/debian/patches/core-no-longer-supply-bogus-services-to-callbacks.patch
    1970-01-01 02:00:00.000000000 +0200
+++ 
avahi-0.8/debian/patches/core-no-longer-supply-bogus-services-to-callbacks.patch
    2024-12-19 09:01:14.000000000 +0200
@@ -0,0 +1,159 @@
+From: Evgeny Vereshchagin <evv...@ya.ru>
+Date: Sun, 12 Nov 2023 01:16:58 +0000
+Subject: core: no longer supply bogus services to callbacks
+
+It was technically a DOS allowing packets with service names like
+"bogus.service.local" to bring down `avahi-browse -a`. In practice
+it was usually triggered by misconfigured smart devices but it isn't
+that hard to forge packets like that and send them deliberately.
+
+The tests are added to make sure invalid service names are rejected and
+valid service names keep working. The fuzz target is updated to make
+sure that avahi_service_name_split always supplies valid arguments to
+avahi_service_name_join. avahi now logs what exactly it fails to split
+```
+avahi-daemon[176]: Failed to split service name 
'0.1.9.1.8.8.e.f.f.f.f.a.a.1.4.7.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa'
+avahi-daemon[176]: Failed to split service name 
'bogus\032.\032\209\129\208\181\209\128\208\178\208\184\209\129.local'
+avahi-daemon[176]: Failed to split service name '255.20.254.169.in-addr.arpa'
+avahi-daemon[176]: Failed to split service name 
'bogus\032.\032\209\129\208\181\209\128\208\178\208\184\209\129.local'
+avahi-daemon[176]: Failed to split service name '33.93.168.192.in-addr.arpa'
+```
+when --debug is passed to it (which makes that part consistent with the
+other places where weird packets are rejected).
+
+Closes https://github.com/lathiat/avahi/issues/212
+
+(cherry picked from commit 93b14365c1c1e04efd1a890e8caa01a2a514bfd8)
+Origin: 
https://github.com/avahi/avahi/commit/93b14365c1c1e04efd1a890e8caa01a2a514bfd8
+---
+ avahi-common/domain-test.c       | 36 ++++++++++++++++++++++++++++++++++++
+ avahi-common/domain.c            | 14 ++++++++++++++
+ avahi-core/browse-service-type.c |  2 +-
+ avahi-core/browse-service.c      |  2 +-
+ 4 files changed, 52 insertions(+), 2 deletions(-)
+
+diff --git a/avahi-common/domain-test.c b/avahi-common/domain-test.c
+index 3acc1c1..22ca430 100644
+--- a/avahi-common/domain-test.c
++++ b/avahi-common/domain-test.c
+@@ -26,6 +26,7 @@
+ #include <assert.h>
+ 
+ #include "domain.h"
++#include "error.h"
+ #include "malloc.h"
+ 
+ int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char *argv[]) {
+@@ -34,6 +35,7 @@ int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char 
*argv[]) {
+     const char *p;
+     size_t size;
+     char name[64], type[AVAHI_DOMAIN_NAME_MAX], domain[AVAHI_DOMAIN_NAME_MAX];
++    int res;
+ 
+     printf("%s\n", s = avahi_normalize_name_strdup("foo.foo\\046."));
+     avahi_free(s);
+@@ -133,5 +135,39 @@ int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char 
*argv[]) {
+     assert(!avahi_is_valid_fqdn("::1"));
+     assert(!avahi_is_valid_fqdn(".192.168.50.1."));
+ 
++    res = avahi_service_name_split("test._ssh._tcp.local", name, 
sizeof(name), type, sizeof(type), domain, sizeof(domain));
++    assert(res >= 0);
++    assert(strcmp(name, "test") == 0);
++    assert(strcmp(type, "_ssh._tcp") == 0);
++    assert(strcmp(domain, "local") == 0);
++
++    res = avahi_service_name_split("test._hop._sub._ssh._tcp.local", name, 
sizeof(name), type, sizeof(type), domain, sizeof(domain));
++    assert(res >= 0);
++    assert(strcmp(name, "test") == 0);
++    assert(strcmp(type, "_hop._sub._ssh._tcp") == 0);
++    assert(strcmp(domain, "local") == 0);
++
++    res = avahi_service_name_split("_qotd._udp.hey.local", NULL, 0, type, 
sizeof(type), domain, sizeof(domain));
++    assert(res >= 0);
++    assert(strcmp(type, "_qotd._udp") == 0);
++    assert(strcmp(domain, "hey.local") == 0);
++
++    res = avahi_service_name_split("_wat._sub._qotd._udp.hey.local", NULL, 0, 
type, sizeof(type), domain, sizeof(domain));
++    assert(res >= 0);
++    assert(strcmp(type, "_wat._sub._qotd._udp") == 0);
++    assert(strcmp(domain, "hey.local") == 0);
++
++    res = avahi_service_name_split("wat.bogus.service.local", name, 
sizeof(name), type, sizeof(type), domain, sizeof(domain));
++    assert(res == AVAHI_ERR_INVALID_SERVICE_TYPE);
++
++    res = avahi_service_name_split("bogus.service.local", NULL, 0, type, 
sizeof(type), domain, sizeof(domain));
++    assert(res == AVAHI_ERR_INVALID_SERVICE_TYPE);
++
++    res = avahi_service_name_split("", name, sizeof(name), type, 
sizeof(type), domain, sizeof(domain));
++    assert(res == AVAHI_ERR_INVALID_SERVICE_NAME);
++
++    res = avahi_service_name_split("", NULL, 0, type, sizeof(type), domain, 
sizeof(domain));
++    assert(res == AVAHI_ERR_INVALID_SERVICE_TYPE);
++
+     return 0;
+ }
+diff --git a/avahi-common/domain.c b/avahi-common/domain.c
+index e66d241..795b4fd 100644
+--- a/avahi-common/domain.c
++++ b/avahi-common/domain.c
+@@ -500,6 +500,7 @@ int avahi_service_name_split(const char *p, char *name, 
size_t name_size, char *
+         DOMAIN
+     } state;
+     int type_empty = 1, domain_empty = 1;
++    char *oname, *otype, *odomain;
+ 
+     assert(p);
+     assert(type);
+@@ -507,6 +508,10 @@ int avahi_service_name_split(const char *p, char *name, 
size_t name_size, char *
+     assert(domain);
+     assert(domain_size > 0);
+ 
++    oname = name;
++    otype = type;
++    odomain = domain;
++
+     if (name) {
+         assert(name_size > 0);
+         *name = 0;
+@@ -569,6 +574,15 @@ int avahi_service_name_split(const char *p, char *name, 
size_t name_size, char *
+         }
+     }
+ 
++    if ((oname && !avahi_is_valid_service_name(oname)))
++        return AVAHI_ERR_INVALID_SERVICE_NAME;
++
++    if (!avahi_is_valid_service_type_generic(otype))
++        return AVAHI_ERR_INVALID_SERVICE_TYPE;
++
++    if (!avahi_is_valid_domain_name(odomain))
++        return AVAHI_ERR_INVALID_DOMAIN_NAME;
++
+     return 0;
+ }
+ 
+diff --git a/avahi-core/browse-service-type.c 
b/avahi-core/browse-service-type.c
+index b1fc7af..f0d6938 100644
+--- a/avahi-core/browse-service-type.c
++++ b/avahi-core/browse-service-type.c
+@@ -65,7 +65,7 @@ static void record_browser_callback(
+         assert(record->key->type == AVAHI_DNS_TYPE_PTR);
+ 
+         if (avahi_service_name_split(record->data.ptr.name, NULL, 0, type, 
sizeof(type), domain, sizeof(domain)) < 0) {
+-            avahi_log_warn("Invalid service type '%s'", record->key->name);
++            avahi_log_debug("Failed to split service name '%s'", 
record->data.ptr.name);
+             return;
+         }
+ 
+diff --git a/avahi-core/browse-service.c b/avahi-core/browse-service.c
+index 63e0275..e924bae 100644
+--- a/avahi-core/browse-service.c
++++ b/avahi-core/browse-service.c
+@@ -69,7 +69,7 @@ static void record_browser_callback(
+             flags |= AVAHI_LOOKUP_RESULT_LOCAL;
+ 
+         if (avahi_service_name_split(record->data.ptr.name, service, 
sizeof(service), type, sizeof(type), domain, sizeof(domain)) < 0) {
+-            avahi_log_warn("Failed to split '%s'", record->key->name);
++            avahi_log_debug("Failed to split service name '%s'", 
record->data.ptr.name);
+             return;
+         }
+ 
diff -Nru 
avahi-0.8/debian/patches/core-reject-overly-long-TXT-resource-records.patch 
avahi-0.8/debian/patches/core-reject-overly-long-TXT-resource-records.patch
--- avahi-0.8/debian/patches/core-reject-overly-long-TXT-resource-records.patch 
1970-01-01 02:00:00.000000000 +0200
+++ avahi-0.8/debian/patches/core-reject-overly-long-TXT-resource-records.patch 
2024-12-19 08:52:04.000000000 +0200
@@ -0,0 +1,45 @@
+From: Evgeny Vereshchagin <evv...@ya.ru>
+Date: Mon, 23 Oct 2023 20:29:31 +0000
+Subject: core: reject overly long TXT resource records
+
+Closes https://github.com/lathiat/avahi/issues/455
+
+CVE-2023-38469
+
+(cherry picked from commit a337a1ba7d15853fb56deef1f464529af6e3a1cf)
+Origin: 
https://github.com/avahi/avahi/commit/a337a1ba7d15853fb56deef1f464529af6e3a1cf
+---
+ avahi-core/rr.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/avahi-core/rr.c b/avahi-core/rr.c
+index 7fa0bee..b03a24c 100644
+--- a/avahi-core/rr.c
++++ b/avahi-core/rr.c
+@@ -32,6 +32,7 @@
+ #include <avahi-common/malloc.h>
+ #include <avahi-common/defs.h>
+ 
++#include "dns.h"
+ #include "rr.h"
+ #include "log.h"
+ #include "util.h"
+@@ -688,11 +689,17 @@ int avahi_record_is_valid(AvahiRecord *r) {
+         case AVAHI_DNS_TYPE_TXT: {
+ 
+             AvahiStringList *strlst;
++            size_t used = 0;
+ 
+-            for (strlst = r->data.txt.string_list; strlst; strlst = 
strlst->next)
++            for (strlst = r->data.txt.string_list; strlst; strlst = 
strlst->next) {
+                 if (strlst->size > 255 || strlst->size <= 0)
+                     return 0;
+ 
++                used += 1+strlst->size;
++                if (used > AVAHI_DNS_RDATA_MAX)
++                    return 0;
++            }
++
+             return 1;
+         }
+     }
diff -Nru 
avahi-0.8/debian/patches/Ensure-each-label-is-at-least-one-byte-long.patch 
avahi-0.8/debian/patches/Ensure-each-label-is-at-least-one-byte-long.patch
--- avahi-0.8/debian/patches/Ensure-each-label-is-at-least-one-byte-long.patch  
1970-01-01 02:00:00.000000000 +0200
+++ avahi-0.8/debian/patches/Ensure-each-label-is-at-least-one-byte-long.patch  
2024-12-19 08:52:04.000000000 +0200
@@ -0,0 +1,54 @@
+From: =?utf-8?b?UGV0ciBNZW7FocOtaw==?= <pemen...@redhat.com>
+Date: Tue, 11 Apr 2023 15:29:59 +0200
+Subject: Ensure each label is at least one byte long
+
+The only allowed exception is single dot, where it should return empty
+string.
+
+Fixes #454.
+
+(cherry picked from commit 94cb6489114636940ac683515417990b55b5d66c)
+Origin: 
https://github.com/avahi/avahi/commit/94cb6489114636940ac683515417990b55b5d66c
+---
+ avahi-common/domain-test.c | 14 ++++++++++++++
+ avahi-common/domain.c      |  2 +-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/avahi-common/domain-test.c b/avahi-common/domain-test.c
+index cf763ec..3acc1c1 100644
+--- a/avahi-common/domain-test.c
++++ b/avahi-common/domain-test.c
+@@ -45,6 +45,20 @@ int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char 
*argv[]) {
+     printf("%s\n", s = avahi_normalize_name_strdup("fo\\\\o\\..f oo."));
+     avahi_free(s);
+ 
++    printf("%s\n", s = avahi_normalize_name_strdup("."));
++    avahi_free(s);
++
++    s = avahi_normalize_name_strdup(",.=.}.=.?-.}.=.?.?.}.}.?.?.?.z.?.?.}.}."
++                  "}.?.?.?.r.=.=.}.=.?.}}.}.?.?.?.zM.=.=.?.?.}.}.?.?.}.}.}"
++                  ".?.?.?.r.=.=.}.=.?.}}.}.?.?.?.zM.=.=.?.?.}.}.?.?.?.zM.?`"
++                  "?.}.}.}.?.?.?.r.=.?.}.=.?.?.}.?.?.?.}.=.?.?.}??.}.}.?.?."
++                  "?.z.?.?.}.}.}.?.?.?.r.=.=.}.=.?.}}.}.?.?.?.zM.?`?.}.}.}."
++                  "??.?.zM.?`?.}.}.}.?.?.?.r.=.?.}.=.?.?.}.?.?.?.}.=.?.?.}?"
++                  "?.}.}.?.?.?.z.?.?.}.}.}.?.?.?.r.=.=.}.=.?.}}.}.?.?.?.zM."
++                  "?`?.}.}.}.?.?.?.r.=.=.?.?`.?.?}.}.}.?.?.?.r.=.?.}.=.?.?."
++                  "}.?.?.?.}.=.?.?.}");
++    assert(s == NULL);
++
+     printf("%i\n", avahi_domain_equal("\\065aa 
bbb\\.\\046cc.cc\\\\.dee.fff.", "Aaa BBB\\.\\.cc.cc\\\\.dee.fff"));
+     printf("%i\n", avahi_domain_equal("A", "a"));
+ 
+diff --git a/avahi-common/domain.c b/avahi-common/domain.c
+index 3b1ab68..e66d241 100644
+--- a/avahi-common/domain.c
++++ b/avahi-common/domain.c
+@@ -201,7 +201,7 @@ char *avahi_normalize_name(const char *s, char *ret_s, 
size_t size) {
+         }
+ 
+         if (!empty) {
+-            if (size < 1)
++            if (size < 2)
+                 return NULL;
+ 
+             *(r++) = '.';
diff -Nru avahi-0.8/debian/patches/series avahi-0.8/debian/patches/series
--- avahi-0.8/debian/patches/series     2023-04-19 14:51:49.000000000 +0300
+++ avahi-0.8/debian/patches/series     2024-12-19 09:01:00.000000000 +0200
@@ -14,3 +14,10 @@
 Avoid-infinite-loop-in-avahi-daemon-by-handling-HUP-event.patch
 dbus-Use-non-deprecated-installation-path.patch
 Emit-error-if-requested-service-is-not-found.patch
+core-make-sure-there-is-rdata-to-process-before-parsing-i.patch
+core-reject-overly-long-TXT-resource-records.patch
+tests-pass-overly-long-TXT-resource-records.patch
+Ensure-each-label-is-at-least-one-byte-long.patch
+core-extract-host-name-using-avahi_unescape_label.patch
+common-derive-alternative-host-name-from-its-unescaped-ve.patch
+core-no-longer-supply-bogus-services-to-callbacks.patch
diff -Nru 
avahi-0.8/debian/patches/tests-pass-overly-long-TXT-resource-records.patch 
avahi-0.8/debian/patches/tests-pass-overly-long-TXT-resource-records.patch
--- avahi-0.8/debian/patches/tests-pass-overly-long-TXT-resource-records.patch  
1970-01-01 02:00:00.000000000 +0200
+++ avahi-0.8/debian/patches/tests-pass-overly-long-TXT-resource-records.patch  
2024-12-19 08:52:04.000000000 +0200
@@ -0,0 +1,60 @@
+From: Evgeny Vereshchagin <evv...@ya.ru>
+Date: Wed, 25 Oct 2023 18:15:42 +0000
+Subject: tests: pass overly long TXT resource records
+
+to make sure they don't crash avahi any more.
+
+It reproduces https://github.com/lathiat/avahi/issues/455
+
+(cherry picked from commit c6cab87df290448a63323c8ca759baa516166237)
+Origin: 
https://github.com/avahi/avahi/commit/c6cab87df290448a63323c8ca759baa516166237
+---
+ avahi-client/client-test.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/avahi-client/client-test.c b/avahi-client/client-test.c
+index 57750a4..2f51e3e 100644
+--- a/avahi-client/client-test.c
++++ b/avahi-client/client-test.c
+@@ -22,6 +22,7 @@
+ #endif
+ 
+ #include <stdio.h>
++#include <string.h>
+ #include <assert.h>
+ 
+ #include <avahi-client/client.h>
+@@ -33,6 +34,8 @@
+ #include <avahi-common/malloc.h>
+ #include <avahi-common/timeval.h>
+ 
++#include <avahi-core/dns.h>
++
+ static const AvahiPoll *poll_api = NULL;
+ static AvahiSimplePoll *simple_poll = NULL;
+ 
+@@ -222,6 +225,9 @@ int main (AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char 
*argv[]) {
+     uint32_t cookie;
+     struct timeval tv;
+     AvahiAddress a;
++    uint8_t rdata[AVAHI_DNS_RDATA_MAX+1];
++    AvahiStringList *txt = NULL;
++    int r;
+ 
+     simple_poll = avahi_simple_poll_new();
+     poll_api = avahi_simple_poll_get(simple_poll);
+@@ -261,6 +267,14 @@ int main (AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED 
char *argv[]) {
+     error = avahi_entry_group_add_record (group, AVAHI_IF_UNSPEC, 
AVAHI_PROTO_UNSPEC, 0, "TestX", 0x01, 0x10, 120, "", 0);
+     assert(error != AVAHI_OK);
+ 
++    memset(rdata, 1, sizeof(rdata));
++    r = avahi_string_list_parse(rdata, sizeof(rdata), &txt);
++    assert(r >= 0);
++    assert(avahi_string_list_serialize(txt, NULL, 0) == sizeof(rdata));
++    error = avahi_entry_group_add_service_strlst(group, AVAHI_IF_UNSPEC, 
AVAHI_PROTO_UNSPEC, 0, "TestX", "_qotd._tcp", NULL, NULL, 123, txt);
++    assert(error == AVAHI_ERR_INVALID_RECORD);
++    avahi_string_list_free(txt);
++
+     avahi_entry_group_commit (group);
+ 
+     domain = avahi_domain_browser_new (avahi, AVAHI_IF_UNSPEC, 
AVAHI_PROTO_UNSPEC, NULL, AVAHI_DOMAIN_BROWSER_BROWSE, 0, 
avahi_domain_browser_callback, (char*) "omghai3u");
_______________________________________________
Pkg-utopia-maintainers mailing list
Pkg-utopia-maintainers@alioth-lists.debian.net
https://alioth-lists.debian.net/cgi-bin/mailman/listinfo/pkg-utopia-maintainers

Reply via email to