[4903] in Athena Bugs

home help back first fref pref prev next nref lref last post

uuencode/decode: don't check return values

daemon@ATHENA.MIT.EDU (Jonathan I. Kamens)
Wed May 9 19:33:43 1990

Date: Wed, 9 May 90 19:33:25 -0400
From: Jonathan I. Kamens <jik@pit-manager.MIT.EDU>
To: bugs@ATHENA.MIT.EDU
In article <1990May9.203433.19501@cc.ic.ac.uk>, dds@cc.ic.ac.uk
(Diomidis Spinellis) writes:
|> Index:  usr.bin/uucp/uuencode.c usr.bin/uucp/uudecode.c 4.3BSD
|> 
|> Description:
|>         Uuencode and uudecode do not check the return value of the functions
|> 	used to create the output file.  As a result when the output device
|> 	becomes full or disk quota are exceeded the program terminates 
|> 	without an error indication.
|> 
|> Repeat-By:
|> 	Run uuencode vmunix </vmunix >file with disk quota set to 100k.
|> 	Then run uudecode <file with the same disk quota.
|> 
|> Fix:
|> 	Change usr.bin/uucp/uuencode.c and usr.bin/uucp/uudecode.c by 
|> 	applying the following patch:
|> 
|> *** uudecode.c.orig	Wed May  9 21:14:30 1990
|> --- uudecode.c	Wed May  9 21:21:30 1990
|> ***************
|> *** 33,44 ****
|>   /* single character decode */
|>   #define DEC(c)	(((c) - ' ') & 077)
|>   
|>   main(argc, argv)
|>   char **argv;
|>   {
|>   	FILE *in, *out;
|>   	int mode;
|> - 	char dest[128];
|>   	char buf[80];
|>   
|>   	/* optional input arg */
|> --- 33,51 ----
|>   /* single character decode */
|>   #define DEC(c)	(((c) - ' ') & 077)
|>   
|> + static char dest[128];
|> + 
|> + #define eputc(c, f) \
|> + 	if (putc(c, f) == EOF) { \
|> + 		perror(dest); \
|> + 		exit(1); \
|> + 	}
|> + 
|>   main(argc, argv)
|>   char **argv;
|>   {
|>   	FILE *in, *out;
|>   	int mode;
|>   	char buf[80];
|>   
|>   	/* optional input arg */
|> ***************
|> *** 52,58 ****
|>   		in = stdin;
|>   
|>   	if (argc != 1) {
|> ! 		printf("Usage: uudecode [infile]\n");
|>   		exit(2);
|>   	}
|>   
|> --- 59,65 ----
|>   		in = stdin;
|>   
|>   	if (argc != 1) {
|> ! 		fprintf(stderr, "Usage: uudecode [infile]\n");
|>   		exit(2);
|>   	}
|>   
|> ***************
|> *** 105,110 ****
|> --- 112,121 ----
|>   		fprintf(stderr, "No end line\n");
|>   		exit(5);
|>   	}
|> + 	if (fclose(out) == EOF) {
|> + 		perror(dest);
|> + 		exit(1);
|> + 	}
|>   	exit(0);
|>   }
|>   
|> ***************
|> *** 154,162 ****
|>   	c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
|>   	c3 = DEC(p[2]) << 6 | DEC(p[3]);
|>   	if (n >= 1)
|> ! 		putc(c1, f);
|>   	if (n >= 2)
|> ! 		putc(c2, f);
|>   	if (n >= 3)
|> ! 		putc(c3, f);
|>   }
|> --- 165,173 ----
|>   	c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
|>   	c3 = DEC(p[2]) << 6 | DEC(p[3]);
|>   	if (n >= 1)
|> ! 		eputc(c1, f);
|>   	if (n >= 2)
|> ! 		eputc(c2, f);
|>   	if (n >= 3)
|> ! 		eputc(c3, f);
|>   }
|> *** uuencode.c.orig	Wed May  9 21:14:31 1990
|> --- uuencode.c	Wed May  9 21:16:31 1990
|> ***************
|> *** 31,36 ****
|> --- 31,42 ----
|>   /* ENC is the basic 1 character encoding function to make a char
printing */
|>   #define ENC(c) ((c) ? ((c) & 077) + ' ': '`')
|>   
|> + #define eputc(c, f) \
|> + 	if (putc(c, f) == EOF) { \
|> + 		perror("write"); \
|> + 		exit(1); \
|> + 	}
|> + 
|>   main(argc, argv)
|>   char **argv;
|>   {
|> ***************
|> *** 58,68 ****
|>   		mode = 0666 & ~umask(0666);
|>   	else
|>   		mode = sbuf.st_mode & 0777;
|> ! 	printf("begin %o %s\n", mode, argv[1]);
|>   
|>   	encode(in, stdout);
|>   
|> ! 	printf("end\n");
|>   	exit(0);
|>   }
|>   
|> --- 64,84 ----
|>   		mode = 0666 & ~umask(0666);
|>   	else
|>   		mode = sbuf.st_mode & 0777;
|> ! 	if (printf("begin %o %s\n", mode, argv[1]) == EOF) {
|> ! 		perror("write");
|> ! 		exit(1);
|> ! 	}
|>   
|>   	encode(in, stdout);
|>   
|> ! 	if (printf("end\n") == EOF) {
|> ! 		perror("write");
|> ! 		exit(1);
|> ! 	}
|> ! 	if (fclose(stdout) == EOF) {
|> ! 		perror("write");
|> ! 		exit(1);
|> ! 	}
|>   	exit(0);
|>   }
|>   
|> ***************
|> *** 79,90 ****
|>   	for (;;) {
|>   		/* 1 (up to) 45 character line */
|>   		n = fread(buf, 1, 45, in);
|> ! 		putc(ENC(n), out);
|>   
|>   		for (i=0; i<n; i += 3)
|>   			outdec(&buf[i], out);
|>   
|> ! 		putc('\n', out);
|>   		if (n <= 0)
|>   			break;
|>   	}
|> --- 95,106 ----
|>   	for (;;) {
|>   		/* 1 (up to) 45 character line */
|>   		n = fread(buf, 1, 45, in);
|> ! 		eputc(ENC(n), out);
|>   
|>   		for (i=0; i<n; i += 3)
|>   			outdec(&buf[i], out);
|>   
|> ! 		eputc('\n', out);
|>   		if (n <= 0)
|>   			break;
|>   	}
|> ***************
|> *** 103,110 ****
|>   	c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
|>   	c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
|>   	c4 = p[2] & 077;
|> ! 	putc(ENC(c1), f);
|> ! 	putc(ENC(c2), f);
|> ! 	putc(ENC(c3), f);
|> ! 	putc(ENC(c4), f);
|>   }
|> --- 119,126 ----
|>   	c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
|>   	c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
|>   	c4 = p[2] & 077;
|> ! 	eputc(ENC(c1), f);
|> ! 	eputc(ENC(c2), f);
|> ! 	eputc(ENC(c3), f);
|> ! 	eputc(ENC(c4), f);
|>   }
|> --
|> Diomidis Spinellis                  Internet:                
dds@cc.ic.ac.uk
|> Department of Computing             UUCP:                   
...!ukc!iccc!dds
|> Imperial College                    JANET:                   
dds@uk.ac.ic.cc
|> London SW7 2BZ                      #include "/dev/tty"

Jonathan Kamens			              USnail:
MIT Project Athena				11 Ashford Terrace
jik@Athena.MIT.EDU				Allston, MA  02134
Office: 617-253-8495			      Home: 617-782-0710

home help back first fref pref prev next nref lref last post