[net.bugs.4bsd] 4.2BSD rmail fixes

geoff@utcsstat.UUCP (Geoffrey Collyer) (04/01/84)

The 4.2BSD rmail has a number of bugs.

It wastes 512 bytes on a scanf argument rather than using %*s.
(All the world's a VAX, I guess.)

It originally allowed `From a!b!user date' without `remote from sys'
and therefore greatly increased the probability of misinterpreting
a body line starting with From as part of the postmark (e.g. a
"forwarded by" line generated by /bin/mail (wazzat?)).  Ever seen
a return address like `foo!somewhere!bar!aps'?  They are caused by
this bit of brain-damage.  We nuked it utterly.

rmail now checks fgets and sscanf return values and exits if EOF
or too few matches.  If you have ever seen your rmail looping
infinitely (we have), this may be the cause.  Feeding null input
to rmail will make it loop.

Henry Spencer (utzoo!henry) helped find and fix these.
As usual, honey danber probably fixes these better than we have.

Diffs follow. Lines numbers are approximate and may vary.
----
35d30
< 	register char *uf;	/* ptr into ufrom */
41d35
< 	char junk[512];	/* scratchpad */
58,60c52
< 
< 	for (;;) {
< 		(void) fgets(lbuf, sizeof lbuf, stdin);
---
> 	while (fgets(lbuf, sizeof lbuf, stdin) != NULL) {
64,79c56
< 		(void) sscanf(lbuf, "%s %s", junk, ufrom);
< 		cp = lbuf;
< 		uf = ufrom;
< 		for (;;) {
< 			cp = index(cp+1, 'r');
< 			if (cp == NULL) {
< 				register char *p = rindex(uf, '!');
< 
< 				if (p != NULL) {
< 					*p = '\0';
< 					(void) strcpy(sys, uf);
< 					uf = p + 1;
< 					break;
< 				}
< 				cp = "remote from somewhere";
< 			}
---
> 		for (cp = index(lbuf, 'r'); cp != NULL; cp = index(cp+1, 'r')) {
87,88c64,69
< 		if (cp != NULL)
< 			(void) sscanf(cp, "remote from %s", sys);
---
> 		if (cp == NULL)		/* "remote" missing */
> 			break;
> 		if (sscanf(cp, "remote from %s", sys) < 1)
> 			break;
> 		if (sscanf(lbuf, "%*s %s", ufrom) < 1)
> 			break;
94c75
< 				uf, sys, from);
---
> 				ufrom, sys, from);
97c78
< 	(void) strcat(from, uf);
---
> 	(void) strcat(from, ufrom);

Geoff Collyer, U. of Toronto