ed6f6b18b5
libxml2 (several buffer overflows). Bump PKGREVISION to 3.
106 lines
3.1 KiB
Text
106 lines
3.1 KiB
Text
$NetBSD: patch-ad,v 1.3 2004/11/20 22:07:49 jmmv Exp $
|
|
|
|
--- nanoftp.c.orig 2000-07-10 12:16:39.000000000 +0200
|
|
+++ nanoftp.c
|
|
@@ -65,6 +65,8 @@ static char hostname[100];
|
|
#define FTP_GET_PASSWD 331
|
|
#define FTP_BUF_SIZE 512
|
|
|
|
+#define XML_NANO_MAX_URLBUF 4096
|
|
+
|
|
typedef struct xmlNanoFTPCtxt {
|
|
char *protocol; /* the protocol name */
|
|
char *hostname; /* the host name */
|
|
@@ -203,7 +205,7 @@ static void
|
|
xmlNanoFTPScanURL(void *ctx, const char *URL) {
|
|
xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx;
|
|
const char *cur = URL;
|
|
- char buf[4096];
|
|
+ char buf[XML_NANO_MAX_URLBUF];
|
|
int index = 0;
|
|
int port = 0;
|
|
|
|
@@ -221,7 +223,7 @@ xmlNanoFTPScanURL(void *ctx, const char
|
|
}
|
|
if (URL == NULL) return;
|
|
buf[index] = 0;
|
|
- while (*cur != 0) {
|
|
+ while ((*cur != 0) && (index < XML_NANO_MAX_URLBUF - 1)) {
|
|
if ((cur[0] == ':') && (cur[1] == '/') && (cur[2] == '/')) {
|
|
buf[index] = 0;
|
|
ctxt->protocol = xmlMemStrdup(buf);
|
|
@@ -234,7 +236,7 @@ xmlNanoFTPScanURL(void *ctx, const char
|
|
if (*cur == 0) return;
|
|
|
|
buf[index] = 0;
|
|
- while (1) {
|
|
+ while (index < XML_NANO_MAX_URLBUF - 1) {
|
|
if (cur[0] == ':') {
|
|
buf[index] = 0;
|
|
ctxt->hostname = xmlMemStrdup(buf);
|
|
@@ -263,7 +265,7 @@ xmlNanoFTPScanURL(void *ctx, const char
|
|
else {
|
|
index = 0;
|
|
buf[index] = 0;
|
|
- while (*cur != 0)
|
|
+ while ((*cur != 0) && (index < XML_NANO_MAX_URLBUF-1))
|
|
buf[index++] = *cur++;
|
|
buf[index] = 0;
|
|
ctxt->path = xmlMemStrdup(buf);
|
|
@@ -288,7 +290,7 @@ int
|
|
xmlNanoFTPUpdateURL(void *ctx, const char *URL) {
|
|
xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx;
|
|
const char *cur = URL;
|
|
- char buf[4096];
|
|
+ char buf[XML_NANO_MAX_URLBUF];
|
|
int index = 0;
|
|
int port = 0;
|
|
|
|
@@ -301,7 +303,7 @@ xmlNanoFTPUpdateURL(void *ctx, const cha
|
|
if (ctxt->hostname == NULL)
|
|
return(-1);
|
|
buf[index] = 0;
|
|
- while (*cur != 0) {
|
|
+ while ((*cur != 0) && (index < XML_NANO_MAX_URLBUF-1)) {
|
|
if ((cur[0] == ':') && (cur[1] == '/') && (cur[2] == '/')) {
|
|
buf[index] = 0;
|
|
if (strcmp(ctxt->protocol, buf))
|
|
@@ -353,7 +355,7 @@ xmlNanoFTPUpdateURL(void *ctx, const cha
|
|
else {
|
|
index = 0;
|
|
buf[index] = 0;
|
|
- while (*cur != 0)
|
|
+ while ((*cur != 0) && (index < XML_NANO_MAX_URLBUF-1))
|
|
buf[index++] = *cur++;
|
|
buf[index] = 0;
|
|
ctxt->path = xmlMemStrdup(buf);
|
|
@@ -374,7 +376,7 @@ xmlNanoFTPUpdateURL(void *ctx, const cha
|
|
void
|
|
xmlNanoFTPScanProxy(const char *URL) {
|
|
const char *cur = URL;
|
|
- char buf[4096];
|
|
+ char buf[XML_NANO_MAX_URLBUF];
|
|
int index = 0;
|
|
int port = 0;
|
|
|
|
@@ -393,7 +395,7 @@ xmlNanoFTPScanProxy(const char *URL) {
|
|
#endif
|
|
if (URL == NULL) return;
|
|
buf[index] = 0;
|
|
- while (*cur != 0) {
|
|
+ while ((*cur != 0) && (index < XML_NANO_MAX_URLBUF-1)) {
|
|
if ((cur[0] == ':') && (cur[1] == '/') && (cur[2] == '/')) {
|
|
buf[index] = 0;
|
|
index = 0;
|
|
@@ -828,6 +830,11 @@ xmlNanoFTPConnect(void *ctx) {
|
|
if (hp == NULL)
|
|
return(-1);
|
|
|
|
+ if ((unsigned int) hp->h_length >
|
|
+ sizeof(((struct sockaddr_in *)&ctxt->ftpAddr)->sin_addr)) {
|
|
+ return (-1);
|
|
+ }
|
|
+
|
|
/*
|
|
* Prepare the socket
|
|
*/
|