Module Name: src
Committed By: riz
Date: Thu Mar 24 19:54:09 UTC 2011
Modified Files:
src/external/ibm-public/postfix/dist [netbsd-5]: HISTORY makedefs
src/external/ibm-public/postfix/dist/src/cleanup [netbsd-5]:
cleanup_map1n.c
src/external/ibm-public/postfix/dist/src/global [netbsd-5]:
mail_version.h
src/external/ibm-public/postfix/dist/src/local [netbsd-5]: recipient.c
src/external/ibm-public/postfix/dist/src/master [netbsd-5]:
master_sig.c
src/external/ibm-public/postfix/dist/src/smtp [netbsd-5]: smtp_proto.c
src/external/ibm-public/postfix/dist/src/smtpd [netbsd-5]: smtpd.c
src/external/ibm-public/postfix/dist/src/util [netbsd-5]: host_port.c
make_dirs.c sys_defs.h watchdog.c
Log Message:
Apply patches (requested by tron in ticket #1576):
Update postfix to version 2.7.3:
- Fix for CVE-2011-0411: discard buffered plaintext input, after
reading the SMTP "STARTTLS" command or response.
- Fix to the local delivery agent: look up the "unextended" address
in the local aliases database, when that address has a malformed
address extension.
- Fix to virtual alias expansion: report a tempfail error, instead of
silently ignoring recipients that exceed the
virtual_alias_expansion_limit or the virtual_alias_recursion_limit.
- Fix for BSD-ish mkdir() to prevent maildir directories from
inheriting their group ownership from the parent directory.
- Fix to the SMTP client: missing support for mail to [ipv6:ipv6addr]
address literal destinations.
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.2.2.4 -r1.1.1.2.2.5 \
src/external/ibm-public/postfix/dist/HISTORY
cvs rdiff -u -r1.1.1.1.2.3 -r1.1.1.1.2.4 \
src/external/ibm-public/postfix/dist/makedefs
cvs rdiff -u -r1.1.1.1.2.3 -r1.1.1.1.2.4 \
src/external/ibm-public/postfix/dist/src/cleanup/cleanup_map1n.c
cvs rdiff -u -r1.1.1.2.2.4 -r1.1.1.2.2.5 \
src/external/ibm-public/postfix/dist/src/global/mail_version.h
cvs rdiff -u -r1.1.1.1.2.4 -r1.1.1.1.2.5 \
src/external/ibm-public/postfix/dist/src/local/recipient.c
cvs rdiff -u -r1.1.1.1.2.3 -r1.1.1.1.2.4 \
src/external/ibm-public/postfix/dist/src/master/master_sig.c
cvs rdiff -u -r1.1.1.1.2.4 -r1.1.1.1.2.5 \
src/external/ibm-public/postfix/dist/src/smtp/smtp_proto.c
cvs rdiff -u -r1.2.2.4 -r1.2.2.5 \
src/external/ibm-public/postfix/dist/src/smtpd/smtpd.c
cvs rdiff -u -r1.1.1.1.2.3 -r1.1.1.1.2.4 \
src/external/ibm-public/postfix/dist/src/util/host_port.c \
src/external/ibm-public/postfix/dist/src/util/make_dirs.c \
src/external/ibm-public/postfix/dist/src/util/watchdog.c
cvs rdiff -u -r1.1.1.1.2.4 -r1.1.1.1.2.5 \
src/external/ibm-public/postfix/dist/src/util/sys_defs.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/ibm-public/postfix/dist/HISTORY
diff -u src/external/ibm-public/postfix/dist/HISTORY:1.1.1.2.2.4 src/external/ibm-public/postfix/dist/HISTORY:1.1.1.2.2.5
--- src/external/ibm-public/postfix/dist/HISTORY:1.1.1.2.2.4 Fri Jan 7 01:23:55 2011
+++ src/external/ibm-public/postfix/dist/HISTORY Thu Mar 24 19:54:07 2011
@@ -15730,6 +15730,18 @@
The last protocol change was in Postfix 2.1. File:
util/dict_open.c.
+20100422
+
+ Workaround (introduced: postfix-19990906 a.k.a. Postfix
+ 0.8.0). The Postfix local delivery agent did not properly
+ distinguish between "address has no extension" and "address
+ has an extension, but the extension is invalid". In both
+ cases it would run only the full recipient local-part through
+ the alias maps. Instead, it now drops the faulty extension
+ from the recipient address local-part (it would be too
+ error-prone to replace all tests for "no extension" by tests
+ for "no valid extension". File: local/recipient.c.
+
20100515
Bugfix (introduced Postfix 2.6): the Postfix SMTP client
@@ -15816,3 +15828,59 @@
compliance. We now make an exception for "final" replies,
as permitted by RFC. Solution by Victor Duchovni. File:
smtpd/smtpd.c.
+
+20101201
+
+ Workaround: BSD-ish mkdir() ignores the effective GID and
+ copies group ownership from the parent directory. File:
+ util/make_dirs.c.
+
+20101202
+
+ Cleanup: the cleanup server now reports a temporary delivery
+ error when it reaches the virtual_alias_expansion_limit or
+ virtual_alias_recursion_limit. Previously, it would silently
+ ignore the excess recipients and deliver the message. File:
+ cleanup/cleanup_map1n.c.
+
+20110105
+
+ Bugfix (introduced with the Postfix TLS patch): discard
+ plaintext following the STARTTLS command or response. This
+ matters only for the minority of SMTP clients that actually
+ verify server certificates. Files: smtpd/smtpd.c,
+ smtp/smtp_proto.c.
+
+ This vulnerability is also known as CVE-2011-0411.
+
+20110109
+
+ Bugfix (introduced Postfix 2.4): on Solaris the Postfix
+ event engine was deaf for SIGHUP and SIGALRM signals after
+ the switch to /dev/poll. Symptoms were delayed "postfix
+ reload" response, and killed processes when the watchdog
+ timeout was less than max_idle. The fix is to set up SIGHUP
+ and SIGALRM handlers that write to a pipe, and to monitor
+ that pipe for read events via the Postfix event engine.
+ Files: master/master_sig.c, util/watchdog.c, util/sys_defs.h.
+
+20110117
+
+ Bugfix (introduced Postfix alpha, or thereabouts): on HP-UX
+ the Postfix event engine was deaf for SIGALRM signals.
+ Symptoms were killed processes when the watchdog timeout
+ was less than max_idle. The fix is the same as Solaris fix
+ 20110109. Since we can't know what other systems need this,
+ the workaround is enabled by default. Files: util/sys_defs.h.
+
+20110225
+
+ Workaround (problem introduced with IPv6 support in Postfix
+ 2.2): the SMTP client did not support mail to [ipv6:ipv6addr].
+ Fix based on a patch by Gurusamy Sarathy (Sophos). File:
+ util/host_port.c and regression test files.
+
+20110227
+
+ Portability: FreeBSD closefrom() support time window. Sahil
+ Tandon. File: util/sys_defs.h.
Index: src/external/ibm-public/postfix/dist/makedefs
diff -u src/external/ibm-public/postfix/dist/makedefs:1.1.1.1.2.3 src/external/ibm-public/postfix/dist/makedefs:1.1.1.1.2.4
--- src/external/ibm-public/postfix/dist/makedefs:1.1.1.1.2.3 Sun Nov 21 18:31:22 2010
+++ src/external/ibm-public/postfix/dist/makedefs Thu Mar 24 19:54:07 2011
@@ -228,6 +228,12 @@
done
;;
AIX.*) case "`uname -v`" in
+ 6) SYSTYPE=AIX6
+ case "$CC" in
+ cc|*/cc|xlc|*/xlc) CCARGS="$CCARGS -w -blibpath:/usr/lib:/lib:/usr/local/lib";;
+ esac
+ CCARGS="$CCARGS -D_ALL_SOURCE -DHAS_POSIX_REGEXP"
+ ;;
5) SYSTYPE=AIX5
case "$CC" in
cc|*/cc|xlc|*/xlc) CCARGS="$CCARGS -w -blibpath:/usr/lib:/lib:/usr/local/lib";;
Index: src/external/ibm-public/postfix/dist/src/cleanup/cleanup_map1n.c
diff -u src/external/ibm-public/postfix/dist/src/cleanup/cleanup_map1n.c:1.1.1.1.2.3 src/external/ibm-public/postfix/dist/src/cleanup/cleanup_map1n.c:1.1.1.1.2.4
--- src/external/ibm-public/postfix/dist/src/cleanup/cleanup_map1n.c:1.1.1.1.2.3 Fri Jan 7 01:24:00 2011
+++ src/external/ibm-public/postfix/dist/src/cleanup/cleanup_map1n.c Thu Mar 24 19:54:07 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: cleanup_map1n.c,v 1.1.1.1.2.3 2011/01/07 01:24:00 riz Exp $ */
+/* $NetBSD: cleanup_map1n.c,v 1.1.1.1.2.4 2011/03/24 19:54:07 riz Exp $ */
/*++
/* NAME
@@ -17,13 +17,18 @@
/* This module implements one-to-many table mapping via table lookup.
/* Table lookups are done with quoted (externalized) address forms.
/* The process is recursive. The recursion terminates when the
-/* left-hand side appears in its own expansion, or when a maximal
-/* nesting level is reached.
+/* left-hand side appears in its own expansion.
/*
/* cleanup_map1n_internal() is the interface for addresses in
/* internal (unquoted) form.
/* DIAGNOSTICS
-/* Recoverable errors: the global \fIcleanup_errs\fR flag is updated.
+/* When the maximal expansion or recursion limit is reached,
+/* the alias is not expanded and the CLEANUP_STAT_DEFER error
+/* is raised with reason "4.6.0 Alias expansion error".
+/*
+/* When table lookup fails, the alias is not expanded and the
+/* CLEANUP_STAT_WRITE error is raised with reason "4.6.0 Alias
+/* expansion error".
/* SEE ALSO
/* mail_addr_map(3) address mappings
/* mail_addr_find(3) address lookups
@@ -95,15 +100,26 @@
* must index the array explicitly, instead of running along it with a
* pointer.
*/
-#define UPDATE(ptr,new) { myfree(ptr); ptr = mystrdup(new); }
+#define UPDATE(ptr,new) do { \
+ if (ptr) myfree(ptr); ptr = mystrdup(new); \
+ } while (0)
#define STR vstring_str
-#define RETURN(x) { been_here_free(been_here); return (x); }
+#define RETURN(x) do { \
+ been_here_free(been_here); return (x); \
+ } while (0)
+#define UNEXPAND(argv, addr) do { \
+ argv_truncate((argv), 0); argv_add((argv), (addr), (char *) 0); \
+ } while (0)
for (arg = 0; arg < argv->argc; arg++) {
if (argv->argc > var_virt_expan_limit) {
- msg_warn("%s: unreasonable %s map expansion size for %s",
+ msg_warn("%s: unreasonable %s map expansion size for %s -- "
+ "deferring delivery",
state->queue_id, maps->title, addr);
- break;
+ state->errs |= CLEANUP_STAT_DEFER;
+ UPDATE(state->reason, "4.6.0 Alias expansion error");
+ UNEXPAND(argv, addr);
+ RETURN(argv);
}
for (count = 0; /* void */ ; count++) {
@@ -113,9 +129,13 @@
if (been_here_check_fixed(been_here, argv->argv[arg]) != 0)
break;
if (count >= var_virt_recur_limit) {
- msg_warn("%s: unreasonable %s map nesting for %s",
+ msg_warn("%s: unreasonable %s map nesting for %s -- "
+ "deferring delivery",
state->queue_id, maps->title, addr);
- break;
+ state->errs |= CLEANUP_STAT_DEFER;
+ UPDATE(state->reason, "4.6.0 Alias expansion error");
+ UNEXPAND(argv, addr);
+ RETURN(argv);
}
quote_822_local(state->temp1, argv->argv[arg]);
if ((lookup = mail_addr_map(maps, STR(state->temp1), propagate)) != 0) {
@@ -138,9 +158,12 @@
myfree(saved_lhs);
argv_free(lookup);
} else if (dict_errno != 0) {
- msg_warn("%s: %s map lookup problem for %s",
+ msg_warn("%s: %s map lookup problem for %s -- "
+ "deferring delivery",
state->queue_id, maps->title, addr);
state->errs |= CLEANUP_STAT_WRITE;
+ UPDATE(state->reason, "4.6.0 Alias expansion error");
+ UNEXPAND(argv, addr);
RETURN(argv);
} else {
break;
Index: src/external/ibm-public/postfix/dist/src/global/mail_version.h
diff -u src/external/ibm-public/postfix/dist/src/global/mail_version.h:1.1.1.2.2.4 src/external/ibm-public/postfix/dist/src/global/mail_version.h:1.1.1.2.2.5
--- src/external/ibm-public/postfix/dist/src/global/mail_version.h:1.1.1.2.2.4 Fri Jan 7 01:24:04 2011
+++ src/external/ibm-public/postfix/dist/src/global/mail_version.h Thu Mar 24 19:54:07 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mail_version.h,v 1.1.1.2.2.4 2011/01/07 01:24:04 riz Exp $ */
+/* $NetBSD: mail_version.h,v 1.1.1.2.2.5 2011/03/24 19:54:07 riz Exp $ */
#ifndef _MAIL_VERSION_H_INCLUDED_
#define _MAIL_VERSION_H_INCLUDED_
@@ -22,8 +22,8 @@
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20101123"
-#define MAIL_VERSION_NUMBER "2.7.2"
+#define MAIL_RELEASE_DATE "20110303"
+#define MAIL_VERSION_NUMBER "2.7.3"
#ifdef SNAPSHOT
# define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE
Index: src/external/ibm-public/postfix/dist/src/local/recipient.c
diff -u src/external/ibm-public/postfix/dist/src/local/recipient.c:1.1.1.1.2.4 src/external/ibm-public/postfix/dist/src/local/recipient.c:1.1.1.1.2.5
--- src/external/ibm-public/postfix/dist/src/local/recipient.c:1.1.1.1.2.4 Fri Jan 7 01:24:06 2011
+++ src/external/ibm-public/postfix/dist/src/local/recipient.c Thu Mar 24 19:54:08 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: recipient.c,v 1.1.1.1.2.4 2011/01/07 01:24:06 riz Exp $ */
+/* $NetBSD: recipient.c,v 1.1.1.1.2.5 2011/03/24 19:54:08 riz Exp $ */
/*++
/* NAME
@@ -252,6 +252,10 @@
/*
* Address extension management.
+ *
+ * XXX Fix 20100422, finalized 20100529: it is too error-prone to
+ * distinguish between "no extension" and "no valid extension", so we
+ * drop an invalid extension from the recipient address local-part.
*/
state.msg_attr.user = mystrdup(state.msg_attr.local);
if (*var_rcpt_delim) {
@@ -261,6 +265,9 @@
msg_warn("%s: address with illegal extension: %s",
state.msg_attr.queue_id, state.msg_attr.local);
state.msg_attr.extension = 0;
+ /* XXX Can't myfree + mystrdup, must truncate instead. */
+ state.msg_attr.local[strlen(state.msg_attr.user)] = 0;
+ /* Truncating is safe. The code below rejects null usernames. */
}
} else
state.msg_attr.extension = 0;
Index: src/external/ibm-public/postfix/dist/src/master/master_sig.c
diff -u src/external/ibm-public/postfix/dist/src/master/master_sig.c:1.1.1.1.2.3 src/external/ibm-public/postfix/dist/src/master/master_sig.c:1.1.1.1.2.4
--- src/external/ibm-public/postfix/dist/src/master/master_sig.c:1.1.1.1.2.3 Fri Jan 7 01:24:07 2011
+++ src/external/ibm-public/postfix/dist/src/master/master_sig.c Thu Mar 24 19:54:08 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: master_sig.c,v 1.1.1.1.2.3 2011/01/07 01:24:07 riz Exp $ */
+/* $NetBSD: master_sig.c,v 1.1.1.1.2.4 2011/03/24 19:54:08 riz Exp $ */
/*++
/* NAME
@@ -55,9 +55,8 @@
#ifdef USE_SIG_RETURN
#include <sys/syscall.h>
-#endif
-
-#ifndef USE_SIG_RETURN
+#undef USE_SIG_PIPE
+#else
#define USE_SIG_PIPE
#endif
@@ -78,6 +77,8 @@
int master_gotsigchld;
int master_gotsighup;
+#ifdef USE_SIG_RETURN
+
/* master_sighup - register arrival of hangup signal */
static void master_sighup(int sig)
@@ -94,8 +95,6 @@
/* master_sigchld - register arrival of child death signal */
-#ifdef USE_SIG_RETURN
-
static void master_sigchld(int sig, int code, struct sigcontext * scp)
{
@@ -118,7 +117,25 @@
#else
-#ifdef USE_SIG_PIPE
+/* master_sighup - register arrival of hangup signal */
+
+static void master_sighup(int sig)
+{
+ int saved_errno = errno;
+
+ /*
+ * WARNING WARNING WARNING.
+ *
+ * This code runs at unpredictable moments, as a signal handler. Don't put
+ * any code here other than for setting a global flag, or code that is
+ * intended to be run within a signal handler. Restore errno in case we
+ * are interrupting the epilog of a failed system call.
+ */
+ master_gotsighup = sig;
+ if (write(SIG_PIPE_WRITE_FD, "", 1) != 1)
+ msg_warn("write to SIG_PIPE_WRITE_FD failed: %m");
+ errno = saved_errno;
+}
/* master_sigchld - force wakeup from select() */
@@ -134,6 +151,7 @@
* intended to be run within a signal handler. Restore errno in case we
* are interrupting the epilog of a failed system call.
*/
+ master_gotsigchld = 1;
if (write(SIG_PIPE_WRITE_FD, "", 1) != 1)
msg_warn("write to SIG_PIPE_WRITE_FD failed: %m");
errno = saved_errno;
@@ -147,24 +165,8 @@
while (read(SIG_PIPE_READ_FD, c, 1) > 0)
/* void */ ;
- master_gotsigchld = 1;
}
-#else
-
-static void master_sigchld(int sig)
-{
-
- /*
- * WARNING WARNING WARNING.
- *
- * This code runs at unpredictable moments, as a signal handler. Don't put
- * any code here other than for setting a global flag.
- */
- master_gotsigchld = sig;
-}
-
-#endif
#endif
/* master_sigdeath - die, women and children first */
Index: src/external/ibm-public/postfix/dist/src/smtp/smtp_proto.c
diff -u src/external/ibm-public/postfix/dist/src/smtp/smtp_proto.c:1.1.1.1.2.4 src/external/ibm-public/postfix/dist/src/smtp/smtp_proto.c:1.1.1.1.2.5
--- src/external/ibm-public/postfix/dist/src/smtp/smtp_proto.c:1.1.1.1.2.4 Fri Jan 7 01:24:13 2011
+++ src/external/ibm-public/postfix/dist/src/smtp/smtp_proto.c Thu Mar 24 19:54:08 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: smtp_proto.c,v 1.1.1.1.2.4 2011/01/07 01:24:13 riz Exp $ */
+/* $NetBSD: smtp_proto.c,v 1.1.1.1.2.5 2011/03/24 19:54:08 riz Exp $ */
/*++
/* NAME
@@ -814,6 +814,9 @@
SMTP_RESP_FAKE(&fake, "4.7.5"),
"Server certificate not verified"));
+ /* At this point there must not be any pending plaintext. */
+ vstream_fpurge(session->stream, VSTREAM_PURGE_BOTH);
+
/*
* At this point we have to re-negotiate the "EHLO" to reget the
* feature-list.
Index: src/external/ibm-public/postfix/dist/src/smtpd/smtpd.c
diff -u src/external/ibm-public/postfix/dist/src/smtpd/smtpd.c:1.2.2.4 src/external/ibm-public/postfix/dist/src/smtpd/smtpd.c:1.2.2.5
--- src/external/ibm-public/postfix/dist/src/smtpd/smtpd.c:1.2.2.4 Fri Jan 7 01:24:13 2011
+++ src/external/ibm-public/postfix/dist/src/smtpd/smtpd.c Thu Mar 24 19:54:08 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: smtpd.c,v 1.2.2.4 2011/01/07 01:24:13 riz Exp $ */
+/* $NetBSD: smtpd.c,v 1.2.2.5 2011/03/24 19:54:08 riz Exp $ */
/*++
/* NAME
@@ -4098,6 +4098,8 @@
smtpd_chat_reply(state, "220 2.0.0 Ready to start TLS");
/* Flush before we switch the stream's read/write routines. */
smtp_flush(state->client);
+ /* At this point there must not be any pending plaintext. */
+ vstream_fpurge(state->client, VSTREAM_PURGE_BOTH);
/*
* Reset all inputs to the initial state.
Index: src/external/ibm-public/postfix/dist/src/util/host_port.c
diff -u src/external/ibm-public/postfix/dist/src/util/host_port.c:1.1.1.1.2.3 src/external/ibm-public/postfix/dist/src/util/host_port.c:1.1.1.1.2.4
--- src/external/ibm-public/postfix/dist/src/util/host_port.c:1.1.1.1.2.3 Fri Jan 7 01:24:17 2011
+++ src/external/ibm-public/postfix/dist/src/util/host_port.c Thu Mar 24 19:54:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: host_port.c,v 1.1.1.1.2.3 2011/01/07 01:24:17 riz Exp $ */
+/* $NetBSD: host_port.c,v 1.1.1.1.2.4 2011/03/24 19:54:09 riz Exp $ */
/*++
/* NAME
@@ -97,22 +97,41 @@
#include <host_port.h>
+ /*
+ * Point-fix workaround. The libutil library should be email agnostic, but
+ * we can't rip up the library APIs in the stable releases.
+ */
+#include <string.h>
+#ifdef STRCASECMP_IN_STRINGS_H
+#include <strings.h>
+#endif
+#define IPV6_COL "IPv6:" /* RFC 2821 */
+#define IPV6_COL_LEN (sizeof(IPV6_COL) - 1)
+#define HAS_IPV6_COL(str) (strncasecmp((str), IPV6_COL, IPV6_COL_LEN) == 0)
+
/* host_port - parse string into host and port, destroy string */
const char *host_port(char *buf, char **host, char *def_host,
char **port, char *def_service)
{
char *cp = buf;
+ int ipv6 = 0;
/*
* [host]:port, [host]:, [host].
+ * [ipv6:ipv6addr]:port, [ipv6:ipv6addr]:, [ipv6:ipv6addr].
*/
if (*cp == '[') {
- *host = ++cp;
+ ++cp;
+ if ((ipv6 = HAS_IPV6_COL(cp)) != 0)
+ cp += IPV6_COL_LEN;
+ *host = cp;
if ((cp = split_at(cp, ']')) == 0)
return ("missing \"]\"");
if (*cp && *cp++ != ':')
return ("garbage after \"]\"");
+ if (ipv6 && !valid_ipv6_hostaddr(*host, DONT_GRIPE))
+ return ("malformed IPv6 address");
*port = *cp ? cp : def_service;
}
Index: src/external/ibm-public/postfix/dist/src/util/make_dirs.c
diff -u src/external/ibm-public/postfix/dist/src/util/make_dirs.c:1.1.1.1.2.3 src/external/ibm-public/postfix/dist/src/util/make_dirs.c:1.1.1.1.2.4
--- src/external/ibm-public/postfix/dist/src/util/make_dirs.c:1.1.1.1.2.3 Fri Jan 7 01:24:18 2011
+++ src/external/ibm-public/postfix/dist/src/util/make_dirs.c Thu Mar 24 19:54:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: make_dirs.c,v 1.1.1.1.2.3 2011/01/07 01:24:18 riz Exp $ */
+/* $NetBSD: make_dirs.c,v 1.1.1.1.2.4 2011/03/24 19:54:09 riz Exp $ */
/*++
/* NAME
@@ -39,6 +39,7 @@
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
+#include <unistd.h>
/* Utility library. */
@@ -51,12 +52,14 @@
int make_dirs(const char *path, int perms)
{
+ const char *myname = "make_dirs";
char *saved_path;
unsigned char *cp;
int saved_ch;
struct stat st;
int ret;
mode_t saved_mode = 0;
+ gid_t egid = -1;
/*
* Initialize. Make a copy of the path that we can safely clobber.
@@ -119,6 +122,21 @@
break;
}
}
+
+ /*
+ * Fix directory ownership when mkdir() ignores the effective
+ * GID. Don't change the effective UID for doing this.
+ */
+ if ((ret = stat(saved_path, &st)) < 0) {
+ msg_warn("%s: stat %s: %m", myname, saved_path);
+ break;
+ }
+ if (egid == -1)
+ egid = getegid();
+ if (st.st_gid != egid && (ret = chown(saved_path, -1, egid)) < 0) {
+ msg_warn("%s: chgrp %s: %m", myname, saved_path);
+ break;
+ }
}
if (saved_ch != 0)
*cp = saved_ch;
Index: src/external/ibm-public/postfix/dist/src/util/watchdog.c
diff -u src/external/ibm-public/postfix/dist/src/util/watchdog.c:1.1.1.1.2.3 src/external/ibm-public/postfix/dist/src/util/watchdog.c:1.1.1.1.2.4
--- src/external/ibm-public/postfix/dist/src/util/watchdog.c:1.1.1.1.2.3 Fri Jan 7 01:24:21 2011
+++ src/external/ibm-public/postfix/dist/src/util/watchdog.c Thu Mar 24 19:54:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: watchdog.c,v 1.1.1.1.2.3 2011/01/07 01:24:21 riz Exp $ */
+/* $NetBSD: watchdog.c,v 1.1.1.1.2.4 2011/03/24 19:54:09 riz Exp $ */
/*++
/* NAME
@@ -121,6 +121,31 @@
*/
static WATCHDOG *watchdog_curr;
+ /*
+ * Workaround for systems where the alarm signal does not wakeup the event
+ * machinery, and therefore does not restart the watchdog timer in the
+ * single_server etc. skeletons. The symptom is that programs abort when the
+ * watchdog timeout is less than the max_idle time.
+ */
+#ifdef USE_WATCHDOG_PIPE
+#include <errno.h>
+#include <iostuff.h>
+#include <events.h>
+
+static int watchdog_pipe[2];
+
+/* watchdog_read - read event pipe */
+
+static void watchdog_read(int unused_event, char *unused_context)
+{
+ char ch;
+
+ while (read(watchdog_pipe[0], &ch, 1) > 0)
+ /* void */ ;
+}
+
+#endif /* USE_WATCHDOG_PIPE */
+
/* watchdog_event - handle timeout event */
static void watchdog_event(int unused_sig)
@@ -139,6 +164,14 @@
if (msg_verbose > 1)
msg_info("%s: %p %d", myname, (void *) wp, wp->trip_run);
if (++(wp->trip_run) < WATCHDOG_STEPS) {
+#ifdef USE_WATCHDOG_PIPE
+ int saved_errno = errno;
+
+ /* Wake up the events(3) engine. */
+ if (write(watchdog_pipe[1], "", 1) != 1)
+ msg_warn("%s: write watchdog_pipe: %m", myname);
+ errno = saved_errno;
+#endif
alarm(wp->timeout);
} else {
if (wp->action)
@@ -179,6 +212,15 @@
msg_fatal("%s: sigaction(SIGALRM): %m", myname);
if (msg_verbose > 1)
msg_info("%s: %p %d", myname, (void *) wp, timeout);
+#ifdef USE_WATCHDOG_PIPE
+ if (watchdog_curr == 0) {
+ if (pipe(watchdog_pipe) < 0)
+ msg_fatal("%s: pipe: %m", myname);
+ non_blocking(watchdog_pipe[0], NON_BLOCKING);
+ non_blocking(watchdog_pipe[1], NON_BLOCKING);
+ event_enable_read(watchdog_pipe[0], watchdog_read, (char *) 0);
+ }
+#endif
return (watchdog_curr = wp);
}
@@ -195,6 +237,13 @@
if (wp->saved_time)
alarm(wp->saved_time);
myfree((char *) wp);
+#ifdef USE_WATCHDOG_PIPE
+ if (watchdog_curr == 0) {
+ event_disable_readwrite(watchdog_pipe[0]);
+ (void) close(watchdog_pipe[0]);
+ (void) close(watchdog_pipe[1]);
+ }
+#endif
if (msg_verbose > 1)
msg_info("%s: %p", myname, (void *) wp);
}
Index: src/external/ibm-public/postfix/dist/src/util/sys_defs.h
diff -u src/external/ibm-public/postfix/dist/src/util/sys_defs.h:1.1.1.1.2.4 src/external/ibm-public/postfix/dist/src/util/sys_defs.h:1.1.1.1.2.5
--- src/external/ibm-public/postfix/dist/src/util/sys_defs.h:1.1.1.1.2.4 Fri Jan 7 01:24:20 2011
+++ src/external/ibm-public/postfix/dist/src/util/sys_defs.h Thu Mar 24 19:54:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_defs.h,v 1.1.1.1.2.4 2011/01/07 01:24:20 riz Exp $ */
+/* $NetBSD: sys_defs.h,v 1.1.1.1.2.5 2011/03/24 19:54:09 riz Exp $ */
#ifndef _SYS_DEFS_H_INCLUDED_
#define _SYS_DEFS_H_INCLUDED_
@@ -113,7 +113,8 @@
#define HAS_DUPLEX_PIPE /* 4.1 breaks with kqueue(2) */
#endif
-#if __FreeBSD_version >= 800107 /* safe; don't believe the experts */
+#if (__FreeBSD_version >= 702104 && __FreeBSD_version <= 800000) \
+ || __FreeBSD_version >= 800100
#define HAS_CLOSEFROM
#endif
@@ -515,7 +516,7 @@
* AIX: a SYSV-flavored hybrid. NB: fcntl() and flock() access the same
* underlying locking primitives.
*/
-#ifdef AIX5
+#if defined(AIX5) || defined(AIX6)
#define SUPPORTED
#include <sys/types.h>
#define UINT32_TYPE unsigned int
@@ -1279,6 +1280,17 @@
#endif
/*
+ * Workaround: after a watchdog alarm signal, wake up from select/poll/etc.
+ * by writing to a pipe. Solaris needs this, and HP-UX apparently, too. The
+ * run-time cost is negligible so we just turn it on for all systems. As a
+ * side benefit, making this code system-independent will simplify the
+ * detection of bit-rot problems.
+ */
+#ifndef NO_WATCHDOG_PIPE
+#define USE_WATCHDOG_PIPE
+#endif
+
+ /*
* Defaults for systems without kqueue, /dev/poll or epoll support.
* master/multi-server.c and *qmgr/qmgr_transport.c depend on this.
*/