File libsoup-CVE-2025-14523.patch of Package libsoup.42103

diff --unified --recursive --text --new-file --color libsoup-3.0.4/libsoup/soup-headers.c libsoup-3.0.4.new/libsoup/soup-headers.c
--- libsoup-3.0.4/libsoup/soup-headers.c	2022-01-06 10:48:16.205508000 +0800
+++ libsoup-3.0.4.new/libsoup/soup-headers.c	2026-01-08 14:30:47.845555374 +0800
@@ -155,7 +155,8 @@
 		for (p = strchr (value, '\r'); p; p = strchr (p, '\r'))
 			*p = ' ';
 
-		soup_message_headers_append_untrusted_data (dest, name, value);
+		if (!soup_message_headers_append_untrusted_data (dest, name, value))
+                        goto done;
         }
 	success = TRUE;
 
diff --unified --recursive --text --new-file --color libsoup-3.0.4/libsoup/soup-message-headers.c libsoup-3.0.4.new/libsoup/soup-message-headers.c
--- libsoup-3.0.4/libsoup/soup-message-headers.c	2022-01-06 10:48:16.206508000 +0800
+++ libsoup-3.0.4.new/libsoup/soup-message-headers.c	2026-01-08 14:30:47.847540068 +0800
@@ -275,12 +275,16 @@
 	soup_header_free_list (tokens);
 }
 
-void
+gboolean
 soup_message_headers_append_common (SoupMessageHeaders *hdrs,
                                     SoupHeaderName      name,
                                     const char         *value)
 {
         SoupCommonHeader header;
+        if (name == SOUP_HEADER_HOST && soup_message_headers_get_one (hdrs, "Host")) {
+                g_warning ("Attempted to add duplicate Host header to a SoupMessageHeaders that already contains a Host header");
+                return FALSE;
+        }
 
         if (!hdrs->common_headers)
                 hdrs->common_headers = g_array_sized_new (FALSE, FALSE, sizeof (SoupCommonHeader), 6);
@@ -292,31 +296,18 @@
                 g_hash_table_remove (hdrs->common_concat, GUINT_TO_POINTER (header.name));
 
         soup_message_headers_set (hdrs, name, value);
+        return TRUE;
 }
 
-/**
- * soup_message_headers_append:
- * @hdrs: a #SoupMessageHeaders
- * @name: the header name to add
- * @value: the new value of @name
- *
- * Appends a new header with name @name and value @value to @hdrs. (If
- * there is an existing header with name @name, then this creates a
- * second one, which is only allowed for list-valued headers; see also
- * soup_message_headers_replace().)
- *
- * The caller is expected to make sure that @name and @value are
- * syntactically correct.
- **/
-void
-soup_message_headers_append (SoupMessageHeaders *hdrs,
-			     const char *name, const char *value)
+static gboolean
+soup_message_headers_append_internal (SoupMessageHeaders *hdrs,
+                                      const char *name, const char *value)
 {
 	SoupUncommonHeader header;
         SoupHeaderName header_name;
 
-	g_return_if_fail (name != NULL);
-	g_return_if_fail (value != NULL);
+	g_return_val_if_fail (name != NULL, FALSE);
+	g_return_val_if_fail (value != NULL, FALSE);
 
 	/* Setting a syntactically invalid header name or value is
 	 * considered to be a programming error. However, it can also
@@ -324,23 +315,22 @@
 	 * compiled with G_DISABLE_CHECKS.
 	 */
 #ifndef G_DISABLE_CHECKS
-	g_return_if_fail (*name && strpbrk (name, " \t\r\n:") == NULL);
-	g_return_if_fail (strpbrk (value, "\r\n") == NULL);
+	g_return_val_if_fail (*name && strpbrk (name, " \t\r\n:") == NULL, FALSE);
+	g_return_val_if_fail (strpbrk (value, "\r\n") == NULL, FALSE);
 #else
 	if (*name && strpbrk (name, " \t\r\n:")) {
 		g_warning ("soup_message_headers_append: Ignoring bad name '%s'", name);
-		return;
+		return FALSE;
 	}
 	if (strpbrk (value, "\r\n")) {
 		g_warning ("soup_message_headers_append: Ignoring bad value '%s'", value);
-		return;
+		return FALSE;
 	}
 #endif
 
         header_name = soup_header_name_from_string (name);
         if (header_name != SOUP_HEADER_UNKNOWN) {
-                soup_message_headers_append_common (hdrs, header_name, value);
-                return;
+                return soup_message_headers_append_common (hdrs, header_name, value);
         }
 
         if (!hdrs->uncommon_headers)
@@ -351,21 +341,48 @@
 	g_array_append_val (hdrs->uncommon_headers, header);
 	if (hdrs->uncommon_concat)
 		g_hash_table_remove (hdrs->uncommon_concat, header.name);
+        return TRUE;
+}
+
+/**
+ * soup_message_headers_append:
+ * @hdrs: a #SoupMessageHeaders
+ * @name: the header name to add
+ * @value: the new value of @name
+ *
+ * Appends a new header with name @name and value @value to @hdrs.
+ *
+ * (If there is an existing header with name @name, then this creates a second
+ * one, which is only allowed for list-valued headers; see also
+ * [method@MessageHeaders.replace].)
+ *
+ * The caller is expected to make sure that @name and @value are
+ * syntactically correct.
+ **/
+void
+soup_message_headers_append (SoupMessageHeaders *hdrs,
+			     const char *name, const char *value)
+{
+	soup_message_headers_append_internal (hdrs, name, value);
 }
 
 /*
- * Appends a header value ensuring that it is valid UTF8.
+ * Appends a header value ensuring that it is valid UTF-8, and also checking the
+ * return value of soup_message_headers_append_internal() to report whether the
+ * headers are invalid for various other reasons.
  */
-void
+gboolean
 soup_message_headers_append_untrusted_data (SoupMessageHeaders *hdrs,
                                             const char         *name,
                                             const char         *value)
 {
         char *safe_value = g_utf8_make_valid (value, -1);
         char *safe_name = g_utf8_make_valid (name, -1);
-        soup_message_headers_append (hdrs, safe_name, safe_value);
+        gboolean result = soup_message_headers_append_internal (hdrs, safe_name, safe_value);
+
         g_free (safe_value);
         g_free (safe_name);
+        return result;
 }
 
 void
diff --unified --recursive --text --new-file --color libsoup-3.0.4/libsoup/soup-message-headers-private.h libsoup-3.0.4.new/libsoup/soup-message-headers-private.h
--- libsoup-3.0.4/libsoup/soup-message-headers-private.h	2022-01-06 10:48:16.206508000 +0800
+++ libsoup-3.0.4.new/libsoup/soup-message-headers-private.h	2026-01-08 14:30:47.848186194 +0800
@@ -10,10 +10,10 @@
 
 G_BEGIN_DECLS
 
-void        soup_message_headers_append_untrusted_data  (SoupMessageHeaders *hdrs,
+gboolean    soup_message_headers_append_untrusted_data  (SoupMessageHeaders *hdrs,
                                                          const char         *name,
                                                          const char         *value);
-void        soup_message_headers_append_common          (SoupMessageHeaders *hdrs,
+gboolean    soup_message_headers_append_common          (SoupMessageHeaders *hdrs,
                                                          SoupHeaderName      name,
                                                          const char         *value);
 const char *soup_message_headers_get_one_common         (SoupMessageHeaders *hdrs,
openSUSE Build Service is sponsored by