c2822832b1
(CVE-2008-4829), bump PKGREVISION
165 lines
5.9 KiB
Text
165 lines
5.9 KiB
Text
$NetBSD: patch-ab,v 1.2 2009/01/07 18:45:54 drochner Exp $
|
|
|
|
--- lib/http.c.orig 2009-01-07 18:27:06.000000000 +0100
|
|
+++ lib/http.c
|
|
@@ -115,7 +115,7 @@ httplib_parse_url(const char *url, URLIN
|
|
|
|
/* search for a login '@' token */
|
|
if (strchr(url, '@') != NULL) {
|
|
- ret = sscanf(url, "%[^:]:%[^@]", urlinfo->username, urlinfo->password);
|
|
+ ret = sscanf(url, "%1023[^:]:%1023[^@]", urlinfo->username, urlinfo->password);
|
|
#if defined (commentout)
|
|
if (ret < 2) return SR_ERROR_PARSE_FAILURE;
|
|
#endif
|
|
@@ -132,13 +132,13 @@ httplib_parse_url(const char *url, URLIN
|
|
|
|
/* search for a port seperator */
|
|
if (strchr(url, ':') != NULL) {
|
|
- ret = sscanf(url, "%[^:]:%hu/%s", urlinfo->host,
|
|
+ ret = sscanf(url, "%511[^:]:%hu/%252s", urlinfo->host,
|
|
(short unsigned int*)&urlinfo->port, urlinfo->path+1);
|
|
if (urlinfo->port < 1) return SR_ERROR_PARSE_FAILURE;
|
|
ret -= 1;
|
|
} else {
|
|
urlinfo->port = 80;
|
|
- ret = sscanf(url, "%[^/]/%s", urlinfo->host, urlinfo->path+1);
|
|
+ ret = sscanf(url, "%511[^/]/%252s", urlinfo->host, urlinfo->path+1);
|
|
}
|
|
if (ret < 1) return SR_ERROR_INVALID_URL;
|
|
|
|
@@ -258,11 +258,11 @@ httplib_construct_page_request (const ch
|
|
|
|
/* Return 1 if a match was found, 0 if not found */
|
|
int
|
|
-extract_header_value (char *header, char *dest, char *match)
|
|
+extract_header_value (char *header, char *dest, char *match, int maxlen)
|
|
{
|
|
char* start = (char *)strstr(header, match);
|
|
if (start) {
|
|
- subnstr_until(start+strlen(match), "\n", dest, MAX_ICY_STRING);
|
|
+ subnstr_until(start+strlen(match), "\n", dest, maxlen);
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
@@ -321,24 +321,32 @@ httplib_parse_sc_header (const char *url
|
|
}
|
|
|
|
// read generic headers
|
|
- extract_header_value(header, info->http_location, "Location:");
|
|
- extract_header_value(header, info->server, "Server:");
|
|
- rc = extract_header_value(header, info->icy_name, "icy-name:");
|
|
+ extract_header_value(header, info->http_location, "Location:",
|
|
+ sizeof(info->http_location));
|
|
+ extract_header_value(header, info->server, "Server:",
|
|
+ sizeof(info->server));
|
|
+ rc = extract_header_value(header, info->icy_name, "icy-name:",
|
|
+ sizeof(info->icy_name));
|
|
if (rc == 0) {
|
|
/* Icecast 2.0.1 */
|
|
- rc = extract_header_value(header, info->icy_name, "ice-name:");
|
|
+ rc = extract_header_value(header, info->icy_name, "ice-name:",
|
|
+ sizeof(info->icy_name));
|
|
}
|
|
info->have_icy_name = rc;
|
|
- extract_header_value(header, info->icy_url, "icy-url:");
|
|
- rc = extract_header_value(header, stempbr, "icy-br:");
|
|
+ extract_header_value(header, info->icy_url, "icy-url:",
|
|
+ sizeof(info->icy_url));
|
|
+ rc = extract_header_value(header, stempbr,
|
|
+ "icy-br:", sizeof(stempbr));
|
|
if (rc) {
|
|
info->icy_bitrate = atoi(stempbr);
|
|
}
|
|
|
|
/* interpret the content type from http header */
|
|
- rc = extract_header_value(header, stempbr, "Content-Type:");
|
|
+ rc = extract_header_value(header, stempbr,
|
|
+ "Content-Type:", sizeof(stempbr));
|
|
if (rc == 0) {
|
|
- rc = extract_header_value(header, stempbr, "content-type:");
|
|
+ rc = extract_header_value(header, stempbr,
|
|
+ "content-type:", sizeof(stempbr));
|
|
}
|
|
if (rc == 0) {
|
|
info->content_type = CONTENT_TYPE_UNKNOWN;
|
|
@@ -407,6 +415,7 @@ httplib_parse_sc_header (const char *url
|
|
info->content_type = content_type_by_url;
|
|
}
|
|
}
|
|
+
|
|
// Check for Icecast 1
|
|
else if ((start = (char *)strstr(header, "icecast")) != NULL) {
|
|
if (!info->server[0]) {
|
|
@@ -418,19 +427,19 @@ httplib_parse_sc_header (const char *url
|
|
}
|
|
|
|
// icecast 1.x headers.
|
|
- extract_header_value(header, info->icy_url, "x-audiocast-server-url:");
|
|
- rc = extract_header_value(header, info->icy_name, "x-audiocast-name:");
|
|
+ extract_header_value(header, info->icy_url, "x-audiocast-server-url:",
|
|
+ sizeof(info->icy_url));
|
|
+ rc = extract_header_value(header, info->icy_name, "x-audiocast-name:",
|
|
+ sizeof(info->icy_name));
|
|
info->have_icy_name |= rc;
|
|
- extract_header_value(header, info->icy_genre, "x-audiocast-genre:");
|
|
- rc = extract_header_value(header, stempbr, "x-audiocast-bitrate:");
|
|
+ extract_header_value(header, info->icy_genre, "x-audiocast-genre:",
|
|
+ sizeof(info->icy_genre));
|
|
+ rc = extract_header_value(header, stempbr, "x-audiocast-bitrate:",
|
|
+ sizeof(stempbr));
|
|
if (rc) {
|
|
info->icy_bitrate = atoi(stempbr);
|
|
}
|
|
}
|
|
- // WTF is Zwitterion?
|
|
- else if ((start = (char *)strstr(header, "Zwitterion v")) != NULL) {
|
|
- sscanf(start, "%[^<]<", info->server);
|
|
- }
|
|
|
|
/* Last chance to deduce content type */
|
|
if (info->content_type == CONTENT_TYPE_UNKNOWN) {
|
|
@@ -626,16 +635,17 @@ httplib_get_pls (HSOCKET *sock, SR_HTTP_
|
|
int best_open = 0;
|
|
|
|
sprintf (buf1, "File%d=", s);
|
|
- if (!extract_header_value (buf, location_buf, buf1)) {
|
|
+ if (!extract_header_value (buf, location_buf, buf1,
|
|
+ sizeof(location_buf))) {
|
|
break;
|
|
}
|
|
if (s == 1) {
|
|
- strcpy (info->http_location, location_buf);
|
|
+ sr_strncpy (info->http_location, location_buf, MAX_HOST_LEN);
|
|
rc = SR_SUCCESS;
|
|
}
|
|
|
|
sprintf (buf1, "Title%d=", s);
|
|
- if (!extract_header_value (buf, title_buf, buf1)) {
|
|
+ if (!extract_header_value (buf, title_buf, buf1, sizeof(title_buf))) {
|
|
break;
|
|
}
|
|
num_scanned = sscanf (title_buf, "(#%*[0-9] - %d/%d",&used,&total);
|
|
@@ -644,12 +654,12 @@ httplib_get_pls (HSOCKET *sock, SR_HTTP_
|
|
}
|
|
open = total - used;
|
|
if (open > best_open) {
|
|
- strcpy (info->http_location, location_buf);
|
|
+ sr_strncpy (info->http_location, location_buf, MAX_HOST_LEN);
|
|
best_open = open;
|
|
}
|
|
}
|
|
|
|
- strcpy (info->http_location, location_buf);
|
|
+ sr_strncpy (info->http_location, location_buf, MAX_HOST_LEN);
|
|
|
|
return rc;
|
|
}
|
|
@@ -689,7 +699,7 @@ httplib_get_m3u (HSOCKET *sock, SR_HTTP_
|
|
if (len > 4 && !strcmp (&p[len-4], ".mp3")) {
|
|
continue;
|
|
}
|
|
- strcpy (info->http_location, p);
|
|
+ sr_strncpy (info->http_location, p, MAX_HOST_LEN);
|
|
debug_printf ("Redirecting from M3U to: %s\n", p);
|
|
return SR_SUCCESS;
|
|
}
|