Deliver 1.00 patch #4
Chip Salzenberg
chip at ateng.ateng.com
Tue Nov 29 03:32:27 AEST 1988
This is an offical patch for deliver 1.00. Please apply it.
Patch number: 4
Date: 28 Nov 1988
Priority: MEDIUM-RARE
Changes:
Add return type of signal handlers to config.h.
Provide a version of getopt() for systems that lack it.
Call va_end() in routines that use varargs.
Make consistent checks for valid address strings.
Index: patchlevel.h
Prereq: 3
***************
*** 1 ****
! #define PATCHLEVEL 3
--- 1 ----
! #define PATCHLEVEL 4
Index: config.h
***************
*** 1,8 ****
! /* $Header: config.h,v 1.5 88/11/21 13:12:11 network Exp $
*
* Deliver configuration.
*
* $Log: config.h,v $
* Revision 1.5 88/11/21 13:12:11 network
* patch3: Fix Makefile for GNU Make.
* patch3: Remove hard-coded shell name.
--- 1,14 ----
! /* $Header: config.h,v 1.6 88/11/26 13:19:37 network Exp $
*
* Deliver configuration.
*
* $Log: config.h,v $
+ * Revision 1.6 88/11/26 13:19:37 network
+ * patch4: Add return type of signal handlers to config.h.
+ * patch4: Provide a version of getopt() for systems that lack it.
+ * patch4: Call va_end() in routines that use varargs.
+ * patch4: Make consistent checks for valid address strings.
+ *
* Revision 1.5 88/11/21 13:12:11 network
* patch3: Fix Makefile for GNU Make.
* patch3: Remove hard-coded shell name.
***************
*** 36,41 ****
--- 42,55 ----
#define TRUSTED_USERS "root", "uucp"
/*----------------------------------------------------------------------
+ * Signal function type.
+ * Signal catching routines have this return value.
+ * (For System V Release 3.0 or later, use "void".)
+ */
+
+ #define SIGTYPE int
+
+ /*----------------------------------------------------------------------
* Signal flag type.
* Variables of this type may be set by signal catching routines.
*/
***************
*** 103,120 ****
/*----------------------------------------------------------------------
* Are vprintf() and friends available?
- * Is putenv() available?
*/
#ifndef BSD
#define HAS_VPRINTF
#define HAS_PUTENV
#endif
/*----------------------------------------------------------------------
! * Is setvbuf() backwards? (Blech!)
*/
#ifdef M_XENIX
#define XENIX_SETVBUF
#endif
--- 117,148 ----
/*----------------------------------------------------------------------
* Are vprintf() and friends available?
*/
#ifndef BSD
#define HAS_VPRINTF
+ #endif
+
+ /*----------------------------------------------------------------------
+ * Is putenv() available?
+ */
+
+ #ifndef BSD
#define HAS_PUTENV
#endif
/*----------------------------------------------------------------------
! * Is getopt() available?
*/
+ #ifndef BSD
+ #define HAS_GETOPT
+ #endif
+
+ /*----------------------------------------------------------------------
+ * Is setvbuf() backwards?
+ */
+
#ifdef M_XENIX
#define XENIX_SETVBUF
#endif
***************
*** 124,129 ****
--- 152,164 ----
*/
#define SHELL "/bin/sh"
+
+ /*----------------------------------------------------------------------
+ * Characters that may not appear in addresses.
+ * (This string should include all metacharacters for your chosen shell.)
+ */
+
+ #define SANITIZE "$*?=\\`'\"|^&;{}()<>"
/*----------------------------------------------------------------------
* Standard mailbox location.
Index: debug.c
***************
*** 1,8 ****
! /* $Header: debug.c,v 1.1 88/06/06 09:38:23 chip Exp $
*
* Debugging output.
*
* $Log: debug.c,v $
* Revision 1.1 88/06/06 09:38:23 chip
* Initial revision
*
--- 1,14 ----
! /* $Header: debug.c,v 1.2 88/11/26 13:20:38 network Exp $
*
* Debugging output.
*
* $Log: debug.c,v $
+ * Revision 1.2 88/11/26 13:20:38 network
+ * patch4: Add return type of signal handlers to config.h.
+ * patch4: Provide a version of getopt() for systems that lack it.
+ * patch4: Call va_end() in routines that use varargs.
+ * patch4: Make consistent checks for valid address strings.
+ *
* Revision 1.1 88/06/06 09:38:23 chip
* Initial revision
*
***************
*** 23,45 ****
for (d = first_dest(); d; d = next_dest(d))
{
message("\t%s", d->name);
- if (d->class == CL_MBOX)
- message(":%s", d->mailbox);
- message(" (");
switch (d->class)
{
case CL_USER:
! message("User");
break;
case CL_MBOX:
! message("Mailbox");
break;
case CL_UUCP:
! message("UUCP");
break;
}
! message(", ");
switch (d->state)
{
case ST_WORKING:
--- 29,48 ----
for (d = first_dest(); d; d = next_dest(d))
{
message("\t%s", d->name);
switch (d->class)
{
case CL_USER:
! /* it's understood */
break;
case CL_MBOX:
! message(", mailbox='%s'", d->mailbox);
break;
case CL_UUCP:
! message(" (UUCP)");
break;
}
! message("; ");
switch (d->state)
{
case ST_WORKING:
***************
*** 52,60 ****
message("Done");
break;
case ST_ERROR:
! message("Error: %s", d->error);
break;
}
! message(")\n");
}
}
--- 55,63 ----
message("Done");
break;
case ST_ERROR:
! message("Error (%s)", d->error);
break;
}
! message("\n");
}
}
Index: dest.c
***************
*** 1,8 ****
! /* $Header: dest.c,v 1.2 88/08/30 16:12:40 network Exp $
*
* Operations on the list of mail destinations.
*
* $Log: dest.c,v $
* Revision 1.2 88/08/30 16:12:40 network
* Use savestr() instead of strdup().
*
--- 1,14 ----
! /* $Header: dest.c,v 1.3 88/11/26 13:20:42 network Exp $
*
* Operations on the list of mail destinations.
*
* $Log: dest.c,v $
+ * Revision 1.3 88/11/26 13:20:42 network
+ * patch4: Add return type of signal handlers to config.h.
+ * patch4: Provide a version of getopt() for systems that lack it.
+ * patch4: Call va_end() in routines that use varargs.
+ * patch4: Make consistent checks for valid address strings.
+ *
* Revision 1.2 88/08/30 16:12:40 network
* Use savestr() instead of strdup().
*
***************
*** 75,86 ****
if (class == CL_MBOX)
d->mailbox = copystr(mailbox);
! if (class != CL_UUCP
&& name_context(name) == NULL)
{
d->state = ST_ERROR;
d->error = "No such user";
}
d->prev = HEADPTR->prev;
d->next = HEADPTR;
--- 81,106 ----
if (class == CL_MBOX)
d->mailbox = copystr(mailbox);
! /*
! * Check address for validity.
! */
!
! if (!valid_address(name))
! {
! d->state = ST_ERROR;
! d->error = "Invalid address string";
! }
! else if (class != CL_UUCP
&& name_context(name) == NULL)
{
d->state = ST_ERROR;
d->error = "No such user";
}
+
+ /*
+ * Put new address at the end of of the chain.
+ * (This is important! Other code depends on it.)
+ */
d->prev = HEADPTR->prev;
d->next = HEADPTR;
Index: dfile.c
***************
*** 1,8 ****
! /* $Header: dfile.c,v 1.4 88/11/21 13:12:19 network Exp $
*
* Filter destination(s) through delivery file(s).
*
* $Log: dfile.c,v $
* Revision 1.4 88/11/21 13:12:19 network
* patch3: Fix Makefile for GNU Make.
* patch3: Remove hard-coded shell name.
--- 1,14 ----
! /* $Header: dfile.c,v 1.5 88/11/26 13:20:45 network Exp $
*
* Filter destination(s) through delivery file(s).
*
* $Log: dfile.c,v $
+ * Revision 1.5 88/11/26 13:20:45 network
+ * patch4: Add return type of signal handlers to config.h.
+ * patch4: Provide a version of getopt() for systems that lack it.
+ * patch4: Call va_end() in routines that use varargs.
+ * patch4: Make consistent checks for valid address strings.
+ *
* Revision 1.4 88/11/21 13:12:19 network
* patch3: Fix Makefile for GNU Make.
* patch3: Remove hard-coded shell name.
***************
*** 72,99 ****
goodnames = 0;
for (a = 0; a < dac; ++a)
{
! char *p;
! for (p = dav[a]; *p; ++p)
{
! if (!isalpha(*p)
! && !isdigit(*p)
! && !strchr("#%-+._", *p))
! break;
! }
! if (*p)
! {
! /* Invalid name -- note it and go on. */
!
! (void) dest(dav[a], (char *) NULL);
}
else
{
! /* Valid name -- let the delivery file handle it. */
! fav[fac++] = dav[a];
! ++goodnames;
}
}
--- 78,98 ----
goodnames = 0;
for (a = 0; a < dac; ++a)
{
! char *addr;
! addr = dav[a];
! if (valid_address(addr))
{
! /* Let the delivery file handle valid addresses. */
! fav[fac++] = addr;
! ++goodnames;
}
else
{
! /* Note invalid address(es); report them later. */
! (void) dest(addr, (char *) NULL);
}
}
Index: main.c
***************
*** 1,8 ****
! /* $Header: main.c,v 1.7 88/11/18 12:17:17 network Exp $
*
* A program to deliver local mail with some flexibility.
*
* $Log: main.c,v $
* Revision 1.7 88/11/18 12:17:17 network
* patch2: Improved signal handling.
* patch2: Make sure all environment variables are always provided.
--- 1,14 ----
! /* $Header: main.c,v 1.8 88/11/26 13:20:51 network Exp $
*
* A program to deliver local mail with some flexibility.
*
* $Log: main.c,v $
+ * Revision 1.8 88/11/26 13:20:51 network
+ * patch4: Add return type of signal handlers to config.h.
+ * patch4: Provide a version of getopt() for systems that lack it.
+ * patch4: Call va_end() in routines that use varargs.
+ * patch4: Make consistent checks for valid address strings.
+ *
* Revision 1.7 88/11/18 12:17:17 network
* patch2: Improved signal handling.
* patch2: Make sure all environment variables are always provided.
***************
*** 94,100 ****
* Local functions.
*/
! static int sighup(), sigint(), sigquit();
/*----------------------------------------------------------------------
* The Program.
--- 100,106 ----
* Local functions.
*/
! static SIGTYPE sighup(), sigint(), sigquit();
/*----------------------------------------------------------------------
* The Program.
***************
*** 503,509 ****
(void) signal(SIGQUIT, SIG_IGN);
}
! static int
sighup()
{
(void) signal(SIGHUP, sighup);
--- 509,515 ----
(void) signal(SIGQUIT, SIG_IGN);
}
! static SIGTYPE
sighup()
{
(void) signal(SIGHUP, sighup);
***************
*** 510,516 ****
got_sig = TRUE;
}
! static int
sigint()
{
(void) signal(SIGINT, sigint);
--- 516,522 ----
got_sig = TRUE;
}
! static SIGTYPE
sigint()
{
(void) signal(SIGINT, sigint);
***************
*** 517,523 ****
got_sig = TRUE;
}
! static int
sigquit()
{
(void) signal(SIGQUIT, sigquit);
--- 523,529 ----
got_sig = TRUE;
}
! static SIGTYPE
sigquit()
{
(void) signal(SIGQUIT, sigquit);
***************
*** 547,553 ****
hostname);
}
! message("\tuser \"%s\"", d->name);
if (d->class == CL_MBOX)
message(", mailbox \"%s\"", d->mailbox);
message(": %s\n", d->error);
--- 553,559 ----
hostname);
}
! message("\t\"%s\"", d->name);
if (d->class == CL_MBOX)
message(", mailbox \"%s\"", d->mailbox);
message(": %s\n", d->error);
Index: misc.h
***************
*** 1,8 ****
! /* $Header: misc.h,v 1.3 88/11/21 13:12:29 network Exp $
*
* Miscellaneous definitions.
*
* $Log: misc.h,v $
* Revision 1.3 88/11/21 13:12:29 network
* patch3: Fix Makefile for GNU Make.
* patch3: Remove hard-coded shell name.
--- 1,14 ----
! /* $Header: misc.h,v 1.4 88/11/26 13:21:01 network Exp $
*
* Miscellaneous definitions.
*
* $Log: misc.h,v $
+ * Revision 1.4 88/11/26 13:21:01 network
+ * patch4: Add return type of signal handlers to config.h.
+ * patch4: Provide a version of getopt() for systems that lack it.
+ * patch4: Call va_end() in routines that use varargs.
+ * patch4: Make consistent checks for valid address strings.
+ *
* Revision 1.3 88/11/21 13:12:29 network
* patch3: Fix Makefile for GNU Make.
* patch3: Remove hard-coded shell name.
***************
*** 67,72 ****
--- 73,79 ----
extern long lseek();
extern long time();
extern void free();
+ extern SIGTYPE (*signal())();
/*
* Library differences
Index: procs.c
***************
*** 1,8 ****
! /* $Header: procs.c,v 1.2 88/09/14 19:42:28 network Exp $
*
* Process management and misc support.
*
* $Log: procs.c,v $
* Revision 1.2 88/09/14 19:42:28 network
* Portability to System V and BSD.
* General fixup.
--- 1,14 ----
! /* $Header: procs.c,v 1.3 88/11/26 13:21:07 network Exp $
*
* Process management and misc support.
*
* $Log: procs.c,v $
+ * Revision 1.3 88/11/26 13:21:07 network
+ * patch4: Add return type of signal handlers to config.h.
+ * patch4: Provide a version of getopt() for systems that lack it.
+ * patch4: Call va_end() in routines that use varargs.
+ * patch4: Make consistent checks for valid address strings.
+ *
* Revision 1.2 88/09/14 19:42:28 network
* Portability to System V and BSD.
* General fixup.
***************
*** 27,33 ****
*/
static int child_pid = -1;
! static int (*saved_sigpipe)() = SIG_DFL;
/*----------------------------------------------------------------------
* Like popen(), but execute the child in a specific context.
--- 33,39 ----
*/
static int child_pid = -1;
! static SIGTYPE (*saved_sigpipe)() = SIG_DFL;
/*----------------------------------------------------------------------
* Like popen(), but execute the child in a specific context.
Index: subs.c
***************
*** 1,8 ****
! /* $Header: subs.c,v 1.4 88/10/13 12:20:34 network Exp $
*
* Miscellaneous subroutines.
*
* $Log: subs.c,v $
* Revision 1.4 88/10/13 12:20:34 network
* patch1: add "-n" option, and general bug fixes.
*
--- 1,14 ----
! /* $Header: subs.c,v 1.5 88/11/26 13:21:11 network Exp $
*
* Miscellaneous subroutines.
*
* $Log: subs.c,v $
+ * Revision 1.5 88/11/26 13:21:11 network
+ * patch4: Add return type of signal handlers to config.h.
+ * patch4: Provide a version of getopt() for systems that lack it.
+ * patch4: Call va_end() in routines that use varargs.
+ * patch4: Make consistent checks for valid address strings.
+ *
* Revision 1.4 88/10/13 12:20:34 network
* patch1: add "-n" option, and general bug fixes.
*
***************
*** 117,120 ****
--- 123,145 ----
b = name;
return (b);
+ }
+
+ /*----------------------------------------------------------------------
+ * Check an address for validity.
+ */
+
+ valid_address(addr)
+ char *addr;
+ {
+ char *p;
+ static char sanitize[] = SANITIZE;
+
+ for (p = addr; *p; ++p)
+ {
+ if (strchr(sanitize, *p))
+ return FALSE;
+ }
+
+ return TRUE;
}
Index: sysdep.c
***************
*** 1,4 ****
! /* $Header: sysdep.c,v 1.4 88/10/13 12:20:39 network Exp $
*
* Routines which are (or might well be) system-dependant.
* I've put the message routines here since you may need to use
--- 1,4 ----
! /* $Header: sysdep.c,v 1.5 88/11/26 13:21:15 network Exp $
*
* Routines which are (or might well be) system-dependant.
* I've put the message routines here since you may need to use
***************
*** 5,10 ****
--- 5,16 ----
* the ANSI <stdarg.h> instead of <varargs.h>.
*
* $Log: sysdep.c,v $
+ * Revision 1.5 88/11/26 13:21:15 network
+ * patch4: Add return type of signal handlers to config.h.
+ * patch4: Provide a version of getopt() for systems that lack it.
+ * patch4: Call va_end() in routines that use varargs.
+ * patch4: Make consistent checks for valid address strings.
+ *
* Revision 1.4 88/10/13 12:20:39 network
* patch1: add "-n" option, and general bug fixes.
*
***************
*** 59,64 ****
--- 65,72 ----
va_start(args);
(void) vfprintf(stderr, fmt, args);
+
+ va_end(args);
}
/*----------------------------------------------------------------------
***************
*** 75,80 ****
--- 83,90 ----
(void) fprintf(stderr, "%s: ", progname);
(void) vfprintf(stderr, fmt, args);
+
+ va_end(args);
}
/*----------------------------------------------------------------------
***************
*** 96,101 ****
--- 106,113 ----
(void) fprintf(stderr, ": %s\n", sys_errlist[e]);
else
(void) fprintf(stderr, ": unknown system error %d\n", e);
+
+ va_end(args);
}
/*----------------------------------------------------------------------
***************
*** 239,245 ****
(void) sprintf(s, fmt, a,b,c,d,e,f,g,h);
}
! #endif /* HAS_VPRINTF */
/*----------------------------------------------------------------------
* Add a new environment variable.
--- 251,257 ----
(void) sprintf(s, fmt, a,b,c,d,e,f,g,h);
}
! #endif /* !HAS_VPRINTF */
/*----------------------------------------------------------------------
* Add a new environment variable.
***************
*** 295,298 ****
return 0;
}
! #endif /* HAS_PUTENV */
--- 307,392 ----
return 0;
}
! #endif /* !HAS_PUTENV */
!
! /*----------------------------------------------------------------------
! * Get command line options.
! * This is essentially the public domain version, reformatted to
! * my style and using my error message routine.
! */
!
! #ifndef HAS_GETOPT
!
! int opterr = 1;
! int optind = 1;
! int optopt = 0;
! char *optarg = NULL;
!
! int
! getopt(argc, argv, opts)
! int argc;
! char **argv;
! char *opts;
! {
! static int sp = 1;
! int c;
! char *cp;
!
! if (sp == 1)
! {
! if (optind >= argc
! || argv[optind][0] != '-' || argv[optind][1] == '\0')
! return EOF;
!
! if (strcmp(argv[optind], "--") == NULL)
! {
! optind++;
! return EOF;
! }
! }
!
! optopt = c = argv[optind][sp];
!
! if (c == ':' || (cp = strchr(opts, c)) == NULL)
! {
! if (opterr)
! error("illegal option -- %c\n", c);
! if (argv[optind][++sp] == '\0')
! {
! optind++;
! sp = 1;
! }
! return '?';
! }
!
! if (*++cp == ':')
! {
! if (argv[optind][sp + 1] != '\0')
! optarg = &argv[optind++][sp + 1];
! else if (++optind >= argc)
! {
! if (opterr)
! error("option requires an argument -- %c\n", c);
! sp = 1;
! return '?';
! }
! else
! optarg = argv[optind++];
!
! sp = 1;
! }
! else
! {
! if (argv[optind][++sp] == '\0')
! {
! sp = 1;
! optind++;
! }
!
! optarg = NULL;
! }
!
! return c;
! }
!
! #endif /* !HAS_GETOPT */
--
Chip Salzenberg <chip at ateng.com> or <uunet!ateng!chip>
A T Engineering Me? Speak for my company? Surely you jest!
Beware of programmers carrying screwdrivers.
More information about the Comp.sources.bugs
mailing list