From 2990b945015b067b3dc2ab95dde9587258552295 Mon Sep 17 00:00:00 2001 From: rpm-build Date: Wed, 5 Jun 2024 14:46:35 +0200 Subject: [PATCH] Fix for CVE-2024-24806 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix: always zero-terminate idna output Original-Commit: https://github.com/libuv/libuv/commit/0f2d7e784a256b54b2385043438848047bc2a629 - fix: reject zero-length idna inputs Original-Commit: https://github.com/libuv/libuv/commit/3530bcc30350d4a6ccf35d2f7b33e23292b9de70 - test: empty strings are not valid IDNA Original-Commit: https://github.com/libuv/libuv/commit/e0327e1d508b8207c9150b6e582f0adf26213c39 Signed-off-by: Jan Staněk Signed-off-by: rpm-build --- src/idna.c | 8 ++++++-- test/test-idna.c | 7 ++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/idna.c b/src/idna.c index b44cb16..abbfe87 100644 --- a/src/idna.c +++ b/src/idna.c @@ -273,6 +273,9 @@ long uv__idna_toascii(const char* s, const char* se, char* d, char* de) { char* ds; int rc; + if (s == se) + return UV_EINVAL; + ds = d; si = s; @@ -307,8 +310,9 @@ long uv__idna_toascii(const char* s, const char* se, char* d, char* de) { return rc; } - if (d < de) - *d++ = '\0'; + if (d >= de) + return UV_EINVAL; + *d++ = '\0'; return d - ds; /* Number of bytes written. */ } diff --git a/test/test-idna.c b/test/test-idna.c index f4fad96..37da38d 100644 --- a/test/test-idna.c +++ b/test/test-idna.c @@ -99,6 +99,7 @@ TEST_IMPL(utf8_decode1) { TEST_IMPL(utf8_decode1_overrun) { const char* p; char b[1]; + char c[1]; /* Single byte. */ p = b; @@ -112,6 +113,10 @@ TEST_IMPL(utf8_decode1_overrun) { ASSERT_EQ((unsigned) -1, uv__utf8_decode1(&p, b + 1)); ASSERT_EQ(p, b + 1); + b[0] = 0x7F; + ASSERT_EQ(UV_EINVAL, uv__idna_toascii(b, b + 0, c, c + 1)); + ASSERT_EQ(UV_EINVAL, uv__idna_toascii(b, b + 1, c, c + 1)); + return 0; } @@ -145,8 +150,8 @@ TEST_IMPL(idna_toascii) { /* Illegal inputs. */ F("\xC0\x80\xC1\x80", UV_EINVAL); /* Overlong UTF-8 sequence. */ F("\xC0\x80\xC1\x80.com", UV_EINVAL); /* Overlong UTF-8 sequence. */ + F("", UV_EINVAL); /* No conversion. */ - T("", ""); T(".", "."); T(".com", ".com"); T("example", "example"); -- 2.45.1