File icecast-CVE-2018-18820-2.patch of Package icecast

From 03ea74c04a5966114c2fe66e4e6892d11a68181e Mon Sep 17 00:00:00 2001
From: Philipp Schafft <lion@lion.leolix.org>
Date: Sun, 28 Oct 2018 10:42:33 +0000
Subject: [PATCH] Fix: Worked around buffer overflows in URL auth's cURL
 interface

This is only a workaround that keeps compatibility with 2.4.x mainline.
A real fix has been implemented in 2.5.x (master).
---
 src/auth_url.c |   54 ++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 36 insertions(+), 18 deletions(-)

--- a/src/auth_url.c
+++ b/src/auth_url.c
@@ -141,34 +141,52 @@ static int my_getpass(void *client, char
 static size_t handle_returned_header (void *ptr, size_t size, size_t nmemb, void *stream)
 {
     auth_client *auth_user = stream;
-    unsigned bytes = size * nmemb;
+    size_t len = size * nmemb;
     client_t *client = auth_user->client;
 
-    if (client)
-    {
+    if (client) {
         auth_t *auth = client->auth;
         auth_url *url = auth->state;
-        if (strncasecmp (ptr, url->auth_header, url->auth_header_len) == 0)
+
+        if (url->auth_header && len >= url->auth_header_len && strncasecmp(ptr, url->auth_header, url->auth_header_len) == 0)
             client->authenticated = 1;
-        if (strncasecmp (ptr, url->timelimit_header, url->timelimit_header_len) == 0)
-        {
+
+        if (url->timelimit_header && len > url->timelimit_header_len && strncasecmp(ptr, url->timelimit_header, url->timelimit_header_len) == 0) {
+            const char *input = ptr;
             unsigned int limit = 0;
-            sscanf ((char *)ptr+url->timelimit_header_len, "%u\r\n", &limit);
-            client->con->discon_time = time(NULL) + limit;
+
+            if (len >= 2 && input[len - 2] == '\r' && input[len - 1] == '\n') {
+                input += url->timelimit_header_len;
+
+                if (sscanf(input, "%u\r\n", &limit) == 1) {
+                    client->con->discon_time = time(NULL) + limit;
+                } else {
+                    ICECAST_LOG_ERROR("Auth backend returned invalid timeline header: Can not parse limit");
+                }
+            } else {
+                ICECAST_LOG_ERROR("Auth backend returned invalid timelimit header.");
+            }
         }
-        if (strncasecmp (ptr, "icecast-auth-message: ", 22) == 0)
-        {
-            char *eol;
-            snprintf (url->errormsg, sizeof (url->errormsg), "%s", (char*)ptr+22);
-            eol = strchr (url->errormsg, '\r');
-            if (eol == NULL)
-                eol = strchr (url->errormsg, '\n');
-            if (eol)
-                *eol = '\0';
+
+        if (len > 24 && strncasecmp(ptr, "icecast-auth-message: ", 22) == 0) {
+            const char *input = ptr;
+            size_t copy_len = len - 24 + 1; /* length of string plus \0-termination */
+
+            if (copy_len > sizeof(url->errormsg)) {
+                copy_len = sizeof(url->errormsg);
+            }
+
+            if (len >= 2 && input[len - 2] == '\r' && input[len - 1] == '\n') {
+                input += 22;
+                memcpy(url->errormsg, input, copy_len);
+                url->errormsg[copy_len-1] = 0;
+            } else {
+                ICECAST_LOG_ERROR("Auth backend returned invalid message header.");
+            }
         }
     }
 
-    return (int)bytes;
+    return len;
 }
 
 /* capture returned data, but don't do anything with it */
openSUSE Build Service is sponsored by