Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 133988 | Differences between
and this patch

Collapse All | Expand All

(-)mpg123-orig/httpget.c (-58 / +118 lines)
Lines 3-8 Link Here
3
 *
3
 *
4
 *   Oliver Fromme  <oliver.fromme@heim3.tu-clausthal.de>
4
 *   Oliver Fromme  <oliver.fromme@heim3.tu-clausthal.de>
5
 *   Wed Apr  9 20:57:47 MET DST 1997
5
 *   Wed Apr  9 20:57:47 MET DST 1997
6
 *
7
 *   Modified by Jeremy Huddleston <eradicator@gentoo.org> 2004.10.21 per 
8
 *   http://bugs.gentoo.org/show_bug.cgi?id=68343
9
 *   http://www.barrossecurity.com/advisories/mpg123_getauthfromurl_bof_advisory.txt
10
 *
6
 */
11
 */
7
12
8
#undef ALSA
13
#undef ALSA
Lines 221-232 unsigned char *proxyport; Link Here
221
#define ACCEPT_HEAD "Accept: audio/mpeg, audio/x-mpegurl, */*\r\n"
226
#define ACCEPT_HEAD "Accept: audio/mpeg, audio/x-mpegurl, */*\r\n"
222
227
223
char *httpauth = NULL;
228
char *httpauth = NULL;
224
char httpauth1[256];
229
char *httpauth1 = NULL;
225
230
226
int http_open (char *url)
231
int http_open (char *url)
227
{
232
{
228
	char *purl, *host, *request, *sptr;
233
	char *purl, *host, *request, *sptr;
229
	int linelength;
234
	unsigned int linelength, linelengthbase, purl_length;
230
	unsigned long myip;
235
	unsigned long myip;
231
	unsigned char *myport;
236
	unsigned char *myport;
232
	int sock;
237
	int sock;
Lines 270-322 int http_open (char *url) Link Here
270
                       exit(1);
275
                       exit(1);
271
               }
276
               }
272
277
273
	
278
	/*
274
	if ((linelength = strlen(url)+200) < 1024)
279
	 * The length of purl is upper bound by 3*strlen(url) + 1 if everything
275
		linelength = 1024;
280
	 * in it is a space. For HTTP redirections, we need something longer;
276
	if (!(request = malloc(linelength)) || !(purl = malloc(1024))) {
281
	 * 1024 bytes were arbitrarily chosen.
282
	 */
283
	purl_length = strlen(url) * 3 + 1;
284
	if (purl_length < 1024) purl_length = 1024;
285
	purl = (char *)malloc(sizeof(char) * purl_length);
286
	if (!purl) {
277
		fprintf (stderr, "malloc() failed, out of memory.\n");
287
		fprintf (stderr, "malloc() failed, out of memory.\n");
278
		exit (1);
288
		exit (1);
279
	}
289
	}
280
       /*
281
        * 2000-10-21:
282
        * We would like spaces to be automatically converted to %20's when
283
        * fetching via HTTP.
284
        * -- Martin Sjögren <md9ms@mdstud.chalmers.se>
285
        */
286
       if ((sptr = strchr(url, ' ')) == NULL) {
287
               strncpy (purl, url, 1023);
288
               purl[1023] = '\0';
289
       }
290
       else {
291
               int purllength = 0;
292
               char *urlptr = url;
293
               purl[0] = '\0';
294
               do {
295
                       purllength += sptr-urlptr + 3;
296
                       if (purllength >= 1023)
297
                               break;
298
                       strncat (purl, urlptr, sptr-urlptr);
299
                       //purl[sptr-url] = '\0';
300
                       strcat (purl, "%20");
301
                       urlptr = sptr + 1;
302
               }
303
               while ((sptr = strchr (urlptr, ' ')) != NULL);
304
               strcat (purl, urlptr);
305
       }
306
290
291
	/*
292
	 * 2000-10-21:
293
	 * We would like spaces to be automatically converted to %20's when
294
	 * fetching via HTTP.
295
	 * -- Martin Sjögren <md9ms@mdstud.chalmers.se>
296
	 */
297
	if ((sptr = strchr(url, ' ')) == NULL) {
298
		strcpy (purl, url);
299
	} else {
300
		char *urlptr = url;
301
		purl[0] = '\0';
302
		do {
303
			strncat (purl, urlptr, sptr - urlptr);
304
			strcat (purl, "%20");
305
			urlptr = sptr + 1;
306
		}
307
		while ((sptr = strchr (urlptr, ' ')) != NULL);
308
		strcat (purl, urlptr);
309
	}
310
311
	httpauth1 = (char *)malloc((strlen(purl) + 1) * sizeof(char));
312
	if(!httpauth1) {
313
		fprintf(stderr, "malloc() failed, out of memory.\n");
314
		exit(1);
315
	}
316
	getauthfromURL(purl,httpauth1);
317
318
	/* "GET http://" +               11
319
	 * " HTTP/1.0\r\nUser-Agent: <prgName>/<prgVersion>\r\n"  26 + prgName + prgVersion
320
	 * ACCEPT_HEAD               strlen(ACCEPT_HEAD)
321
	 * "Authorization: Basic \r\n"   23
322
	 * "\r\n"                         2
323
	 */
324
	linelengthbase = 62 + strlen(prgName) + strlen(prgVersion) + strlen(ACCEPT_HEAD);
325
326
	if(httpauth)
327
		linelengthbase += (strlen(httpauth) + 1) * 4;
307
328
308
        getauthfromURL(purl,httpauth1);
329
	if(httpauth1)
330
		linelengthbase += (strlen(httpauth1) + 1) * 4;
309
331
310
	do {
332
	do {
311
		strcpy (request, "GET ");
312
		if (proxyip != INADDR_NONE) {
333
		if (proxyip != INADDR_NONE) {
313
                        if (strncasecmp(url, "http://", 7) != 0 && strncasecmp(url,"ftp://", 6) != 0)
314
				strcat (request, "http://");
315
			strcat (request, purl);
316
			myport = proxyport;
334
			myport = proxyport;
317
			myip = proxyip;
335
			myip = proxyip;
318
		}
336
319
		else {
337
			linelength = linelengthbase + strlen(purl);
338
			if(host)
339
				linelength += 9 + strlen(host) + strlen(myport); /* "Host: <host>:<port>\r\n" */
340
341
			request = (char *)malloc((linelength + 1) * sizeof(char));
342
			if (!request) {
343
				fprintf (stderr, "malloc() failed, out of memory.\n");
344
				exit (1);
345
			}
346
347
			strcpy (request, "GET ");
348
			if (strncasecmp(url, "http://", 7) != 0 && strncasecmp(url,"ftp://", 6) != 0)
349
				strcat (request, "http://");
350
			strcat (request, purl);
351
		} else {
320
			if (host) {
352
			if (host) {
321
				free(host);
353
				free(host);
322
				host=NULL;
354
				host=NULL;
Lines 325-343 int http_open (char *url) Link Here
325
				free(proxyport);
357
				free(proxyport);
326
				proxyport=NULL;
358
				proxyport=NULL;
327
			}
359
			}
328
			if (!(sptr = url2hostport(purl, &host, &myip, &myport))) {
360
			
329
				fprintf (stderr, "Unknown host \"%s\".\n",
361
			sptr = url2hostport(purl, &host, &myip, &myport);
330
					host ? host : "");
362
			if (!sptr) {
363
				fprintf (stderr, "Unknown host \"%s\".\n", host ? host : "");
364
				exit (1);
365
			}
366
367
			linelength = linelengthbase + strlen(sptr);
368
			if(host)
369
				linelength += 9 + strlen(host) + strlen(myport); /* "Host: <host>:<port>\r\n" */
370
371
			request = (char *)malloc((linelength + 1) * sizeof(char));
372
			if (!request) {
373
				fprintf (stderr, "malloc() failed, out of memory.\n");
331
				exit (1);
374
				exit (1);
332
			}
375
			}
376
377
			strcpy (request, "GET ");
333
			strcat (request, sptr);
378
			strcat (request, sptr);
334
		}
379
		}
335
		sprintf (request + strlen(request),
380
336
			" HTTP/1.0\r\nUser-Agent: %s/%s\r\n",
381
		sprintf (request + strlen(request), " HTTP/1.0\r\nUser-Agent: %s/%s\r\n", prgName, prgVersion);
337
			prgName, prgVersion);
338
		if (host) {
382
		if (host) {
339
			sprintf(request + strlen(request),
383
			sprintf(request + strlen(request), "Host: %s:%s\r\n", host, myport);
340
				"Host: %s:%s\r\n", host, myport);
341
#if 0
384
#if 0
342
			free (host);
385
			free (host);
343
#endif
386
#endif
Lines 394-408 fail: Link Here
394
			exit(1);
437
			exit(1);
395
		}
438
		}
396
439
397
		if (strlen(httpauth1) || httpauth) {
440
		if (httpauth1 || httpauth) {
398
			char buf[1023];
441
			char *buf;
399
			strcat (request,"Authorization: Basic ");
442
			strcat (request,"Authorization: Basic ");
400
                        if(strlen(httpauth1))
443
			if(httpauth1) {
401
                          encode64(httpauth1,buf);
444
				buf=(char *)malloc((strlen(httpauth1) + 1) * 4 * sizeof(char));
402
                        else
445
				if(!buf) {
403
			  encode64(httpauth,buf);
446
					fprintf(stderr, "Error allocating sufficient memory for http authentication.  Exiting.");
404
			strcat (request,buf);
447
					exit(1);
448
				}
449
				encode64(httpauth1,buf);
450
				free(httpauth1);
451
			} else {
452
				buf=(char *)malloc((strlen(httpauth) + 1) * 4 * sizeof(char));
453
				if(!buf) {
454
					fprintf(stderr, "Error allocating sufficient memory for http authentication.  Exiting.");
455
					exit(1);
456
				}
457
				encode64(httpauth,buf);
458
			}
459
460
			strcat (request, buf);
405
			strcat (request,"\r\n");
461
			strcat (request,"\r\n");
462
			free(buf);
406
		}
463
		}
407
		strcat (request, "\r\n");
464
		strcat (request, "\r\n");
408
465
Lines 428-443 fail: Link Here
428
		}
485
		}
429
		do {
486
		do {
430
			readstring (request, linelength-1, myfile);
487
			readstring (request, linelength-1, myfile);
431
			if (!strncmp(request, "Location:", 9))
488
			if (!strncmp(request, "Location:", 9)) {
432
				strncpy (purl, request+10, 1023);
489
				strncpy (purl, request+10, purl_length);
490
				purl[purl_length - 1] = 0;
491
			}
433
		} while (request[0] != '\r' && request[0] != '\n');
492
		} while (request[0] != '\r' && request[0] != '\n');
493
		
494
		free(request);
434
	} while (relocate && purl[0] && numrelocs++ < 5);
495
	} while (relocate && purl[0] && numrelocs++ < 5);
435
	if (relocate) {
496
	if (relocate) {
436
		fprintf (stderr, "Too many HTTP relocations.\n");
497
		fprintf (stderr, "Too many HTTP relocations.\n");
437
		exit (1);
498
		exit (1);
438
	}
499
	}
439
	free (purl);
500
	free(purl);
440
	free (request);
441
	free(host);
501
	free(host);
442
	free(proxyport);
502
	free(proxyport);
443
	free(myport);
503
	free(myport);

Return to bug 133988