mirror of
https://github.com/vdukhovni/postfix
synced 2025-08-30 05:38:06 +00:00
postfix-2.3.14
This commit is contained in:
parent
c161b0e5df
commit
6fb2e07bcb
@ -13088,3 +13088,39 @@ Apologies for any names omitted.
|
|||||||
rate of delivery attempts when the queue file system is
|
rate of delivery attempts when the queue file system is
|
||||||
mounted with "noatime". File: flush/flush.c. Back-port
|
mounted with "noatime". File: flush/flush.c. Back-port
|
||||||
from Postfix 2.4/2.5.
|
from Postfix 2.4/2.5.
|
||||||
|
|
||||||
|
20071030
|
||||||
|
|
||||||
|
Bugfix (introduced Postfix 2.3): Postfix mistakenly enforced
|
||||||
|
the 64kbyte limit (for sending body parts TO Milter
|
||||||
|
applications) also while receiving packets FROM Milter
|
||||||
|
applications. The limit is now at least 1GB. File:
|
||||||
|
milter/milter8.c.
|
||||||
|
|
||||||
|
20071202
|
||||||
|
|
||||||
|
Bugfix (introduced Postfix 2.2): don't update the back-to-back
|
||||||
|
delivery time stamp while deferring mail. File: *qmgr/qmgr_entry.c.
|
||||||
|
|
||||||
|
20071211
|
||||||
|
|
||||||
|
Bugfix (introduced 19980315): the "write" equivalent of
|
||||||
|
bugfix 20030104. File: util/vstream.c.
|
||||||
|
|
||||||
|
20071213
|
||||||
|
|
||||||
|
Bugfix (introduced Postfix 2.3): the SMTP client never
|
||||||
|
marked corrupt files as corrupt. Victor Duchovni. File:
|
||||||
|
smtp/smtp_proto.c.
|
||||||
|
|
||||||
|
20071229
|
||||||
|
|
||||||
|
Bugfix: the Milter client did not replace the Postfix-specific
|
||||||
|
form for unknown host names by the Sendmail-specific form.
|
||||||
|
File: milter/milter8.c.
|
||||||
|
|
||||||
|
20080104
|
||||||
|
|
||||||
|
Workaround: minor change to the Dovecot AUTH request to
|
||||||
|
prevent dovecot-auth memory wastage. Timo Sirainen. File:
|
||||||
|
xsasl/xsasl_dovecot_server.c.
|
||||||
|
@ -20,8 +20,8 @@
|
|||||||
* Patches change both the patchlevel and the release date. Snapshots have no
|
* Patches change both the patchlevel and the release date. Snapshots have no
|
||||||
* patchlevel; they change the release date only.
|
* patchlevel; they change the release date only.
|
||||||
*/
|
*/
|
||||||
#define MAIL_RELEASE_DATE "20071017"
|
#define MAIL_RELEASE_DATE "20080131"
|
||||||
#define MAIL_VERSION_NUMBER "2.3.13"
|
#define MAIL_VERSION_NUMBER "2.3.14"
|
||||||
|
|
||||||
#ifdef SNAPSHOT
|
#ifdef SNAPSHOT
|
||||||
# define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE
|
# define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE
|
||||||
|
@ -63,6 +63,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <limits.h> /* INT_MAX */
|
||||||
|
|
||||||
#ifndef SHUT_RDWR
|
#ifndef SHUT_RDWR
|
||||||
#define SHUT_RDWR 2
|
#define SHUT_RDWR 2
|
||||||
@ -280,7 +281,7 @@ typedef struct {
|
|||||||
/*
|
/*
|
||||||
* We don't accept insane amounts of data.
|
* We don't accept insane amounts of data.
|
||||||
*/
|
*/
|
||||||
#define XXX_MAX_DATA (MILTER_CHUNK_SIZE * 2)
|
#define XXX_MAX_DATA (INT_MAX / 2)
|
||||||
#define XXX_TIMEOUT 10
|
#define XXX_TIMEOUT 10
|
||||||
|
|
||||||
#ifndef USE_LIBMILTER_INCLUDES
|
#ifndef USE_LIBMILTER_INCLUDES
|
||||||
@ -1624,6 +1625,17 @@ static const char *milter8_conn_event(MILTER *m,
|
|||||||
const char *myname = "milter8_conn_event";
|
const char *myname = "milter8_conn_event";
|
||||||
MILTER8 *milter = (MILTER8 *) m;
|
MILTER8 *milter = (MILTER8 *) m;
|
||||||
int port;
|
int port;
|
||||||
|
const char *sm_name;
|
||||||
|
char *ptr = 0;
|
||||||
|
const char *resp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Need a global definition for "unknown" host name or address that is
|
||||||
|
* shared by smtpd, cleanup and libmilter.
|
||||||
|
*/
|
||||||
|
#define XXX_UNKNOWN "unknown"
|
||||||
|
#define STR_EQ(x,y) (strcmp((x), (y)) == 0)
|
||||||
|
#define STR_NE(x,y) (strcmp((x), (y)) != 0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX Sendmail 8 libmilter closes the MTA-to-filter socket when it finds
|
* XXX Sendmail 8 libmilter closes the MTA-to-filter socket when it finds
|
||||||
@ -1655,40 +1667,51 @@ static const char *milter8_conn_event(MILTER *m,
|
|||||||
port = 0;
|
port = 0;
|
||||||
}
|
}
|
||||||
milter->state = MILTER8_STAT_ENVELOPE;
|
milter->state = MILTER8_STAT_ENVELOPE;
|
||||||
|
/* Transform unknown hostname from Postfix to Sendmail form. */
|
||||||
|
sm_name = (STR_NE(client_name, XXX_UNKNOWN) ? client_name :
|
||||||
|
STR_EQ(client_addr, XXX_UNKNOWN) ? client_name :
|
||||||
|
(ptr = concatenate("[", client_addr, "]", (char *) 0)));
|
||||||
switch (addr_family) {
|
switch (addr_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
return (milter8_event(milter, SMFIC_CONNECT, SMFIP_NOCONNECT,
|
resp = milter8_event(milter, SMFIC_CONNECT, SMFIP_NOCONNECT,
|
||||||
DONT_SKIP_REPLY, macros,
|
DONT_SKIP_REPLY, macros,
|
||||||
MILTER8_DATA_STRING, client_name,
|
MILTER8_DATA_STRING, sm_name,
|
||||||
MILTER8_DATA_OCTET, SMFIA_INET,
|
MILTER8_DATA_OCTET, SMFIA_INET,
|
||||||
MILTER8_DATA_NSHORT, htons(port),
|
MILTER8_DATA_NSHORT, htons(port),
|
||||||
MILTER8_DATA_STRING, client_addr,
|
MILTER8_DATA_STRING, client_addr,
|
||||||
MILTER8_DATA_END));
|
MILTER8_DATA_END);
|
||||||
|
break;
|
||||||
#ifdef HAS_IPV6
|
#ifdef HAS_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
return (milter8_event(milter, SMFIC_CONNECT, SMFIP_NOCONNECT,
|
resp = milter8_event(milter, SMFIC_CONNECT, SMFIP_NOCONNECT,
|
||||||
DONT_SKIP_REPLY, macros,
|
DONT_SKIP_REPLY, macros,
|
||||||
MILTER8_DATA_STRING, client_name,
|
MILTER8_DATA_STRING, sm_name,
|
||||||
MILTER8_DATA_OCTET, SMFIA_INET6,
|
MILTER8_DATA_OCTET, SMFIA_INET6,
|
||||||
MILTER8_DATA_NSHORT, htons(port),
|
MILTER8_DATA_NSHORT, htons(port),
|
||||||
MILTER8_DATA_STRING, client_addr,
|
MILTER8_DATA_STRING, client_addr,
|
||||||
MILTER8_DATA_END));
|
MILTER8_DATA_END);
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
case AF_UNIX:
|
case AF_UNIX:
|
||||||
return (milter8_event(milter, SMFIC_CONNECT, SMFIP_NOCONNECT,
|
resp = milter8_event(milter, SMFIC_CONNECT, SMFIP_NOCONNECT,
|
||||||
DONT_SKIP_REPLY, macros,
|
DONT_SKIP_REPLY, macros,
|
||||||
MILTER8_DATA_STRING, client_name,
|
MILTER8_DATA_STRING, sm_name,
|
||||||
MILTER8_DATA_OCTET, SMFIA_UNIX,
|
MILTER8_DATA_OCTET, SMFIA_UNIX,
|
||||||
MILTER8_DATA_NSHORT, htons(0),
|
MILTER8_DATA_NSHORT, htons(0),
|
||||||
MILTER8_DATA_STRING, client_addr,
|
MILTER8_DATA_STRING, client_addr,
|
||||||
MILTER8_DATA_END));
|
MILTER8_DATA_END);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return (milter8_event(milter, SMFIC_CONNECT, SMFIP_NOCONNECT,
|
resp = milter8_event(milter, SMFIC_CONNECT, SMFIP_NOCONNECT,
|
||||||
DONT_SKIP_REPLY, macros,
|
DONT_SKIP_REPLY, macros,
|
||||||
MILTER8_DATA_STRING, client_name,
|
MILTER8_DATA_STRING, sm_name,
|
||||||
MILTER8_DATA_OCTET, SMFIA_UNKNOWN,
|
MILTER8_DATA_OCTET, SMFIA_UNKNOWN,
|
||||||
MILTER8_DATA_END));
|
MILTER8_DATA_END);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
if (ptr != 0)
|
||||||
|
myfree(ptr);
|
||||||
|
return (resp);
|
||||||
default:
|
default:
|
||||||
msg_panic("%s: milter %s: bad state %d",
|
msg_panic("%s: milter %s: bad state %d",
|
||||||
myname, milter->m.name, milter->state);
|
myname, milter->m.name, milter->state);
|
||||||
|
@ -203,7 +203,8 @@ void qmgr_entry_done(QMGR_ENTRY *entry, int which)
|
|||||||
/*
|
/*
|
||||||
* Maintain back-to-back delivery status.
|
* Maintain back-to-back delivery status.
|
||||||
*/
|
*/
|
||||||
queue->last_done = event_time();
|
if (which == QMGR_QUEUE_BUSY)
|
||||||
|
queue->last_done = event_time();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When the in-core queue for this site is empty and when this site is
|
* When the in-core queue for this site is empty and when this site is
|
||||||
|
@ -840,7 +840,7 @@ static void get_service_attr(PIPE_ATTR *attr, char **argv)
|
|||||||
/*
|
/*
|
||||||
* null_sender=string
|
* null_sender=string
|
||||||
*/
|
*/
|
||||||
else if (strncasecmp("null_sender=", *argv, sizeof("eol=") - 1) == 0) {
|
else if (strncasecmp("null_sender=", *argv, sizeof("null_sender=") - 1) == 0) {
|
||||||
vstring_strcpy(attr->null_sender, *argv + sizeof("null_sender=") - 1);
|
vstring_strcpy(attr->null_sender, *argv + sizeof("null_sender=") - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,7 +276,8 @@ void qmgr_entry_done(QMGR_ENTRY *entry, int which)
|
|||||||
/*
|
/*
|
||||||
* Maintain back-to-back delivery status.
|
* Maintain back-to-back delivery status.
|
||||||
*/
|
*/
|
||||||
queue->last_done = event_time();
|
if (which == QMGR_QUEUE_BUSY)
|
||||||
|
queue->last_done = event_time();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When the in-core queue for this site is empty and when this site is
|
* When the in-core queue for this site is empty and when this site is
|
||||||
|
@ -1710,7 +1710,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
|
|||||||
fail_status = smtp_mesg_fail(state, DSN_BY_LOCAL_MTA,
|
fail_status = smtp_mesg_fail(state, DSN_BY_LOCAL_MTA,
|
||||||
SMTP_RESP_FAKE(&fake, "5.3.0"),
|
SMTP_RESP_FAKE(&fake, "5.3.0"),
|
||||||
"unreadable mail queue entry");
|
"unreadable mail queue entry");
|
||||||
if (fail_status == 0)
|
if (state->status == 0)
|
||||||
(void) mark_corrupt(state->src);
|
(void) mark_corrupt(state->src);
|
||||||
RETURN(fail_status);
|
RETURN(fail_status);
|
||||||
}
|
}
|
||||||
|
@ -477,6 +477,7 @@ static void vstream_buf_init(VBUF *bp, int flags)
|
|||||||
|
|
||||||
static void vstream_buf_alloc(VBUF *bp, ssize_t len)
|
static void vstream_buf_alloc(VBUF *bp, ssize_t len)
|
||||||
{
|
{
|
||||||
|
VSTREAM *stream = VBUF_TO_APPL(bp, VSTREAM, buf);
|
||||||
ssize_t used = bp->ptr - bp->data;
|
ssize_t used = bp->ptr - bp->data;
|
||||||
const char *myname = "vstream_buf_alloc";
|
const char *myname = "vstream_buf_alloc";
|
||||||
|
|
||||||
@ -492,10 +493,15 @@ static void vstream_buf_alloc(VBUF *bp, ssize_t len)
|
|||||||
bp->data = (unsigned char *)
|
bp->data = (unsigned char *)
|
||||||
(bp->data ? myrealloc((char *) bp->data, len) : mymalloc(len));
|
(bp->data ? myrealloc((char *) bp->data, len) : mymalloc(len));
|
||||||
bp->len = len;
|
bp->len = len;
|
||||||
if (bp->flags & VSTREAM_FLAG_READ)
|
if (bp->flags & VSTREAM_FLAG_READ) {
|
||||||
bp->ptr = bp->data + used;
|
bp->ptr = bp->data + used;
|
||||||
else
|
if (bp->flags & VSTREAM_FLAG_DOUBLE)
|
||||||
|
VSTREAM_SAVE_STATE(stream, read_buf, read_fd);
|
||||||
|
} else {
|
||||||
VSTREAM_BUF_AT_OFFSET(bp, used);
|
VSTREAM_BUF_AT_OFFSET(bp, used);
|
||||||
|
if (bp->flags & VSTREAM_FLAG_DOUBLE)
|
||||||
|
VSTREAM_SAVE_STATE(stream, write_buf, write_fd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vstream_buf_wipe - reset buffer to initial state */
|
/* vstream_buf_wipe - reset buffer to initial state */
|
||||||
@ -663,11 +669,8 @@ static int vstream_buf_get_ready(VBUF *bp)
|
|||||||
* allocation gives the application a chance to override the default
|
* allocation gives the application a chance to override the default
|
||||||
* buffering policy.
|
* buffering policy.
|
||||||
*/
|
*/
|
||||||
if (bp->data == 0) {
|
if (bp->data == 0)
|
||||||
vstream_buf_alloc(bp, VSTREAM_BUFSIZE);
|
vstream_buf_alloc(bp, VSTREAM_BUFSIZE);
|
||||||
if (bp->flags & VSTREAM_FLAG_DOUBLE)
|
|
||||||
VSTREAM_SAVE_STATE(stream, read_buf, read_fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the stream is double-buffered and the write buffer is not empty,
|
* If the stream is double-buffered and the write buffer is not empty,
|
||||||
|
@ -453,7 +453,7 @@ int xsasl_dovecot_server_first(XSASL_SERVER *xp, const char *sasl_method,
|
|||||||
/* send the request */
|
/* send the request */
|
||||||
server->last_request_id = ++server->impl->request_id_counter;
|
server->last_request_id = ++server->impl->request_id_counter;
|
||||||
vstream_fprintf(server->impl->sasl_stream,
|
vstream_fprintf(server->impl->sasl_stream,
|
||||||
"AUTH\t%u\t%s\tservice=%s",
|
"AUTH\t%u\t%s\tservice=%s\tnologin",
|
||||||
server->last_request_id, sasl_method,
|
server->last_request_id, sasl_method,
|
||||||
server->service);
|
server->service);
|
||||||
if (init_response) {
|
if (init_response) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user