View | Details | Raw Unified | Return to bug 217723
Collapse All | Expand All

(-)lib/libfetch/common.c (-18 / +35 lines)
Lines 248-284 Link Here
248
{
248
{
249
	char hbuf[256], sbuf[8];
249
	char hbuf[256], sbuf[8];
250
	struct addrinfo hints, *res;
250
	struct addrinfo hints, *res;
251
	const char *sep, *host, *service;
251
	const char *hb, *he, *sep;
252
	const char *host, *service;
252
	int err, len;
253
	int err, len;
253
254
254
	/* split address if necessary */
255
	/* first, check for a bracketed IPv6 address */
255
	err = EAI_SYSTEM;
256
	if (*addr == '[') {
256
	if ((sep = strchr(addr, ':')) != NULL) {
257
		hb = addr + 1;
258
		if ((sep = strchr(hb, ']')) == NULL) {
259
			errno = EINVAL;
260
			goto syserr;
261
		}
262
		he = sep++;
263
	} else {
264
		hb = addr;
265
		sep = strchrnul(hb, ':');
266
		he = sep;
267
	}
268
269
	/* see if we need to copy the host name */
270
	if (*he != '\0') {
257
		len = snprintf(hbuf, sizeof(hbuf),
271
		len = snprintf(hbuf, sizeof(hbuf),
258
		    "%.*s", (int)(sep - addr), addr);
272
		    "%.*s", (int)(he - hb), hb);
259
		if (len < 0)
273
		if (len < 0)
260
			return (NULL);
274
			goto syserr;
261
		if (len >= (int)sizeof(hbuf)) {
275
		if (len >= (int)sizeof(hbuf)) {
262
			errno = ENAMETOOLONG;
276
			errno = ENAMETOOLONG;
263
			fetch_syserr();
277
			goto syserr;
264
			return (NULL);
265
		}
278
		}
266
		host = hbuf;
279
		host = hbuf;
267
		service = sep + 1;
280
	} else {
268
	} else if (port != 0) {
281
		host = hb;
282
	}
283
284
	/* was it followed by a service name? */
285
	if (*sep == '\0' && port != 0) {
269
		if (port < 1 || port > 65535) {
286
		if (port < 1 || port > 65535) {
270
			errno = EINVAL;
287
			errno = EINVAL;
271
			fetch_syserr();
288
			goto syserr;
272
			return (NULL);
273
		}
289
		}
274
		if (snprintf(sbuf, sizeof(sbuf), "%d", port) < 0) {
290
		if (snprintf(sbuf, sizeof(sbuf), "%d", port) < 0)
275
			fetch_syserr();
291
			goto syserr;
276
			return (NULL);
277
		}
278
		host = addr;
279
		service = sbuf;
292
		service = sbuf;
293
	} else if (*sep != '\0') {
294
		service = sep;
280
	} else {
295
	} else {
281
		host = addr;
282
		service = NULL;
296
		service = NULL;
283
	}
297
	}
284
298
Lines 292-297 Link Here
292
		return (NULL);
306
		return (NULL);
293
	}
307
	}
294
	return (res);
308
	return (res);
309
syserr:
310
	fetch_syserr();
311
	return (NULL);
295
}
312
}
296
313
297
314
(-)lib/libfetch/fetch.c (-11 / +10 lines)
Lines 386-403 Link Here
386
	}
386
	}
387
387
388
	/* hostname */
388
	/* hostname */
389
#ifdef INET6
390
	if (*p == '[' && (q = strchr(p + 1, ']')) != NULL &&
389
	if (*p == '[' && (q = strchr(p + 1, ']')) != NULL &&
391
	    (*++q == '\0' || *q == '/' || *q == ':')) {
390
	    (*++q == '\0' || *q == '/' || *q == ':')) {
392
		if ((i = q - p - 2) > MAXHOSTNAMELEN)
391
		if ((i = q - p) > MAXHOSTNAMELEN)
393
			i = MAXHOSTNAMELEN;
392
			i = MAXHOSTNAMELEN;
394
		strncpy(u->host, ++p, i);
393
		strncpy(u->host, p, i);
395
		p = q;
394
		p = q;
396
	} else
395
	} else {
397
#endif
398
		for (i = 0; *p && (*p != '/') && (*p != ':'); p++)
396
		for (i = 0; *p && (*p != '/') && (*p != ':'); p++)
399
			if (i < MAXHOSTNAMELEN)
397
			if (i < MAXHOSTNAMELEN)
400
				u->host[i++] = *p;
398
				u->host[i++] = *p;
399
	}
401
400
402
	/* port */
401
	/* port */
403
	if (*p == ':') {
402
	if (*p == ':') {
Lines 444-455 Link Here
444
	}
443
	}
445
444
446
	DEBUG(fprintf(stderr,
445
	DEBUG(fprintf(stderr,
447
		  "scheme:   [%s]\n"
446
		  "scheme:   \"%s\"\n"
448
		  "user:     [%s]\n"
447
		  "user:     \"%s\"\n"
449
		  "password: [%s]\n"
448
		  "password: \"%s\"\n"
450
		  "host:     [%s]\n"
449
		  "host:     \"%s\"\n"
451
		  "port:     [%d]\n"
450
		  "port:     \"%d\"\n"
452
		  "document: [%s]\n",
451
		  "document: \"%s\"\n",
453
		  u->scheme, u->user, u->pwd,
452
		  u->scheme, u->user, u->pwd,
454
		  u->host, u->port, u->doc));
453
		  u->host, u->port, u->doc));
455
454
(-)lib/libfetch/http.c (-13 / +4 lines)
Lines 118-124 Link Here
118
			    || (xyz) == HTTP_USE_PROXY \
118
			    || (xyz) == HTTP_USE_PROXY \
119
			    || (xyz) == HTTP_SEE_OTHER)
119
			    || (xyz) == HTTP_SEE_OTHER)
120
120
121
#define HTTP_ERROR(xyz) ((xyz) > 400 && (xyz) < 599)
121
#define HTTP_ERROR(xyz) ((xyz) >= 400 && (xyz) <= 599)
122
122
123
123
124
/*****************************************************************************
124
/*****************************************************************************
Lines 1604-1624 Link Here
1604
		if ((conn = http_connect(url, purl, flags)) == NULL)
1604
		if ((conn = http_connect(url, purl, flags)) == NULL)
1605
			goto ouch;
1605
			goto ouch;
1606
1606
1607
		/* append port number only if necessary */
1607
		host = url->host;
1608
		host = url->host;
1608
#ifdef INET6
1609
		if (url->port != fetch_default_port(url->scheme)) {
1609
		if (strchr(url->host, ':')) {
1610
			snprintf(hbuf, sizeof(hbuf), "%s:%d", host, url->port);
1610
			snprintf(hbuf, sizeof(hbuf), "[%s]", url->host);
1611
			host = hbuf;
1611
			host = hbuf;
1612
		}
1612
		}
1613
#endif
1614
		if (url->port != fetch_default_port(url->scheme)) {
1615
			if (host != hbuf) {
1616
				strcpy(hbuf, host);
1617
				host = hbuf;
1618
			}
1619
			snprintf(hbuf + strlen(hbuf),
1620
			    sizeof(hbuf) - strlen(hbuf), ":%d", url->port);
1621
		}
1622
1613
1623
		/* send request */
1614
		/* send request */
1624
		if (verbose)
1615
		if (verbose)

Return to bug 217723