1From: Bill Gianopoulos <wag@sccux1.msd.ray.com>
2Message-Id: <199405191527.LAA03463@sccux1.msd.ray.com>
3Subject: Patch to rmail to elliminate need for snprintf
4To: sendmail@CS.Berkeley.EDU
5Date: Thu, 19 May 1994 11:27:16 -0400 (EDT)
6
7I have written the following patch to rmail which removes the requirement
8for snprintf while maintaining the protection from buffer overruns.  It also
9fixes it to compile with compilers which don't understand ANSI function
10prototypes.  Perhaps this should be included in the next version?
11
12*** rmail/rmail.c.orig	Mon May 31 18:10:44 1993
13--- rmail/rmail.c	Thu May 19 11:04:50 1994
14***************
15*** 78,86 ****
16--- 78,109 ----
17  #include <sysexits.h>
18  #include <unistd.h>
19
20+ #ifdef __STDC__
21  void err __P((int, const char *, ...));
22  void usage __P((void));
23+ #else
24+ void err ();
25+ void usage ();
26+ #endif
27
28+ #define strdup(s)	strcpy(xalloc(strlen(s) + 1), s)
29+
30+ char *
31+ xalloc(sz)
32+ 	register int sz;
33+ {
34+ 	register char *p;
35+
36+ 	/* some systems can't handle size zero mallocs */
37+ 	if (sz <= 0)
38+ 		sz = 1;
39+
40+ 	p = malloc((unsigned) sz);
41+ 	if (p == NULL)
42+ 		err(EX_UNAVAILABLE, "Out of memory!!");
43+ 	return (p);
44+ }
45+
46  int
47  main(argc, argv)
48  	int argc;
49***************
50*** 230,250 ****
51  	args[i++] = "-oi";		/* Ignore '.' on a line by itself. */
52
53  	if (from_sys != NULL) {		/* Set sender's host name. */
54! 		if (strchr(from_sys, '.') == NULL)
55! 			(void)snprintf(buf, sizeof(buf),
56  			    "-oMs%s.%s", from_sys, domain);
57! 		else
58! 			(void)snprintf(buf, sizeof(buf), "-oMs%s", from_sys);
59  		if ((args[i++] = strdup(buf)) == NULL)
60  			 err(EX_TEMPFAIL, NULL);
61  	}
62  					/* Set protocol used. */
63! 	(void)snprintf(buf, sizeof(buf), "-oMr%s", domain);
64  	if ((args[i++] = strdup(buf)) == NULL)
65  		err(EX_TEMPFAIL, NULL);
66
67  					/* Set name of ``from'' person. */
68! 	(void)snprintf(buf, sizeof(buf), "-f%s%s",
69  	    from_path ? from_path : "", from_user);
70  	if ((args[i++] = strdup(buf)) == NULL)
71  		err(EX_TEMPFAIL, NULL);
72--- 253,285 ----
73  	args[i++] = "-oi";		/* Ignore '.' on a line by itself. */
74
75  	if (from_sys != NULL) {		/* Set sender's host name. */
76! 		if (strchr(from_sys, '.') == NULL) {
77! 			if ((strlen(from_sys) + strlen(domain) + 6)
78! 			    > sizeof(buf))
79! 				err(EX_DATAERR, "sender hostname too long");
80! 			(void)sprintf(buf,
81  			    "-oMs%s.%s", from_sys, domain);
82! 		}
83! 		else {
84! 			if ((strlen(from_sys) + 5) > sizeof(buf))
85! 				err(EX_DATAERR ,"sender hostname too long");
86! 			(void)sprintf(buf, "-oMs%s", from_sys);
87! 		}
88  		if ((args[i++] = strdup(buf)) == NULL)
89  			 err(EX_TEMPFAIL, NULL);
90  	}
91  					/* Set protocol used. */
92! 	if ((strlen(domain) + 5) > sizeof(buf))
93! 		err(EX_DATAERR, "protocol name too long");
94! 	(void)sprintf(buf, "-oMr%s", domain);
95  	if ((args[i++] = strdup(buf)) == NULL)
96  		err(EX_TEMPFAIL, NULL);
97
98  					/* Set name of ``from'' person. */
99! 	if (((from_path ? strlen(from_path) : 0) + strlen(from_user) + 3)
100! 	    > sizeof(buf))
101! 		err(EX_DATAERR, "from address too long");
102! 	(void)sprintf(buf, "-f%s%s",
103  	    from_path ? from_path : "", from_user);
104  	if ((args[i++] = strdup(buf)) == NULL)
105  		err(EX_TEMPFAIL, NULL);
106--
107William A. Gianopoulos; Raytheon Missile Systems Division
108wag@sccux1.msd.ray.com
109