109 lines
3.2 KiB
Diff
109 lines
3.2 KiB
Diff
|
From: Bill Gianopoulos <wag@sccux1.msd.ray.com>
|
||
|
Message-Id: <199405191527.LAA03463@sccux1.msd.ray.com>
|
||
|
Subject: Patch to rmail to elliminate need for snprintf
|
||
|
To: sendmail@CS.Berkeley.EDU
|
||
|
Date: Thu, 19 May 1994 11:27:16 -0400 (EDT)
|
||
|
|
||
|
I have written the following patch to rmail which removes the requirement
|
||
|
for snprintf while maintaining the protection from buffer overruns. It also
|
||
|
fixes it to compile with compilers which don't understand ANSI function
|
||
|
prototypes. Perhaps this should be included in the next version?
|
||
|
|
||
|
*** rmail/rmail.c.orig Mon May 31 18:10:44 1993
|
||
|
--- rmail/rmail.c Thu May 19 11:04:50 1994
|
||
|
***************
|
||
|
*** 78,86 ****
|
||
|
--- 78,109 ----
|
||
|
#include <sysexits.h>
|
||
|
#include <unistd.h>
|
||
|
|
||
|
+ #ifdef __STDC__
|
||
|
void err __P((int, const char *, ...));
|
||
|
void usage __P((void));
|
||
|
+ #else
|
||
|
+ void err ();
|
||
|
+ void usage ();
|
||
|
+ #endif
|
||
|
|
||
|
+ #define strdup(s) strcpy(xalloc(strlen(s) + 1), s)
|
||
|
+
|
||
|
+ char *
|
||
|
+ xalloc(sz)
|
||
|
+ register int sz;
|
||
|
+ {
|
||
|
+ register char *p;
|
||
|
+
|
||
|
+ /* some systems can't handle size zero mallocs */
|
||
|
+ if (sz <= 0)
|
||
|
+ sz = 1;
|
||
|
+
|
||
|
+ p = malloc((unsigned) sz);
|
||
|
+ if (p == NULL)
|
||
|
+ err(EX_UNAVAILABLE, "Out of memory!!");
|
||
|
+ return (p);
|
||
|
+ }
|
||
|
+
|
||
|
int
|
||
|
main(argc, argv)
|
||
|
int argc;
|
||
|
***************
|
||
|
*** 230,250 ****
|
||
|
args[i++] = "-oi"; /* Ignore '.' on a line by itself. */
|
||
|
|
||
|
if (from_sys != NULL) { /* Set sender's host name. */
|
||
|
! if (strchr(from_sys, '.') == NULL)
|
||
|
! (void)snprintf(buf, sizeof(buf),
|
||
|
"-oMs%s.%s", from_sys, domain);
|
||
|
! else
|
||
|
! (void)snprintf(buf, sizeof(buf), "-oMs%s", from_sys);
|
||
|
if ((args[i++] = strdup(buf)) == NULL)
|
||
|
err(EX_TEMPFAIL, NULL);
|
||
|
}
|
||
|
/* Set protocol used. */
|
||
|
! (void)snprintf(buf, sizeof(buf), "-oMr%s", domain);
|
||
|
if ((args[i++] = strdup(buf)) == NULL)
|
||
|
err(EX_TEMPFAIL, NULL);
|
||
|
|
||
|
/* Set name of ``from'' person. */
|
||
|
! (void)snprintf(buf, sizeof(buf), "-f%s%s",
|
||
|
from_path ? from_path : "", from_user);
|
||
|
if ((args[i++] = strdup(buf)) == NULL)
|
||
|
err(EX_TEMPFAIL, NULL);
|
||
|
--- 253,285 ----
|
||
|
args[i++] = "-oi"; /* Ignore '.' on a line by itself. */
|
||
|
|
||
|
if (from_sys != NULL) { /* Set sender's host name. */
|
||
|
! if (strchr(from_sys, '.') == NULL) {
|
||
|
! if ((strlen(from_sys) + strlen(domain) + 6)
|
||
|
! > sizeof(buf))
|
||
|
! err(EX_DATAERR, "sender hostname too long");
|
||
|
! (void)sprintf(buf,
|
||
|
"-oMs%s.%s", from_sys, domain);
|
||
|
! }
|
||
|
! else {
|
||
|
! if ((strlen(from_sys) + 5) > sizeof(buf))
|
||
|
! err(EX_DATAERR ,"sender hostname too long");
|
||
|
! (void)sprintf(buf, "-oMs%s", from_sys);
|
||
|
! }
|
||
|
if ((args[i++] = strdup(buf)) == NULL)
|
||
|
err(EX_TEMPFAIL, NULL);
|
||
|
}
|
||
|
/* Set protocol used. */
|
||
|
! if ((strlen(domain) + 5) > sizeof(buf))
|
||
|
! err(EX_DATAERR, "protocol name too long");
|
||
|
! (void)sprintf(buf, "-oMr%s", domain);
|
||
|
if ((args[i++] = strdup(buf)) == NULL)
|
||
|
err(EX_TEMPFAIL, NULL);
|
||
|
|
||
|
/* Set name of ``from'' person. */
|
||
|
! if (((from_path ? strlen(from_path) : 0) + strlen(from_user) + 3)
|
||
|
! > sizeof(buf))
|
||
|
! err(EX_DATAERR, "from address too long");
|
||
|
! (void)sprintf(buf, "-f%s%s",
|
||
|
from_path ? from_path : "", from_user);
|
||
|
if ((args[i++] = strdup(buf)) == NULL)
|
||
|
err(EX_TEMPFAIL, NULL);
|
||
|
--
|
||
|
William A. Gianopoulos; Raytheon Missile Systems Division
|
||
|
wag@sccux1.msd.ray.com
|