command must wait until its requests have reached the pickup
and qmgr servers before closing the UNIX-domain request
sockets. Files: postqueue/postqueue.c, postqueue/Makefile.in.
+
+20120621
+
+ Bugfix (introduced: Postfix 2.8): the unused "pass" trigger
+ client could close the wrong file descriptors. File:
+ util/unix_pass_trigger.c.
+
+20120702
+
+ Bugfix (introduced: 19990127): the BIFF client leaked an
+ unprivileged UDP socket. Fix by Jaroslav Skarvada. File:
+ local/biff_notify.c.
+
+20120730
+
+ Bugfix (introduced: 20000314): AUTH is not allowed after
+ MAIL. Timo Sirainen. File: smtpd/smtpd_sasl_proto.c.
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20120520"
-#define MAIL_VERSION_NUMBER "2.8.11"
+#define MAIL_RELEASE_DATE "20120801"
+#define MAIL_VERSION_NUMBER "2.8.12"
#ifdef SNAPSHOT
# define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE
/* Utility library. */
#include <msg.h>
+#include <iostuff.h>
/* Application-specific. */
/*
* Open a socket, or re-use an existing one.
*/
- if (sock < 0 && (sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
- msg_warn("socket: %m");
- return;
+ if (sock < 0) {
+ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+ msg_warn("socket: %m");
+ return;
+ }
+ close_on_exec(sock, CLOSE_ON_EXEC);
}
/*
smtpd_chat_reply(state, "503 5.5.1 Error: authentication not enabled");
return (-1);
}
+#define IN_MAIL_TRANSACTION(state) ((state)->sender != 0)
+ if (IN_MAIL_TRANSACTION(state)) {
+ state->error_mask |= MAIL_ERROR_PROTOCOL;
+ smtpd_chat_reply(state, "503 5.5.1 Error: MAIL transaction in progress");
+ return (-1);
+ }
if (smtpd_milters != 0 && (err = milter_other_event(smtpd_milters)) != 0) {
if (err[0] == '5') {
state->error_mask |= MAIL_ERROR_POLICY;
struct unix_pass_trigger {
int fd;
char *service;
- int *pair;
+ int pair[2];
};
/* unix_pass_trigger_event - disconnect from peer */
up = (struct unix_pass_trigger *) mymalloc(sizeof(*up));
up->fd = fd;
up->service = mystrdup(service);
- up->pair = pair;
+ up->pair[0] = pair[0];
+ up->pair[1] = pair[1];
/*
* Write the request...