20170620
Bugfix (introduced: Postfix 3.2) extension propagation was
- broken with "recipient_delimiter = .", because of code that
- was too clever by half. Files: global/mail_adr_crunch.c,
- global/mail_addr_crunch.ref.
+ broken with "recipient_delimiter = .". This change reverts
+ a change that was trying to be too clever. Files:
+ global/mail_adr_crunch.c, global/mail_addr_crunch.ref.
20170704
20170831
- Portability (introduced Postfix 1.0): possible cause for
- panic in postqueue when listing the deferred queue. This
- assigned the result from unsigned integer subtraction to a
- signed integer, followed by a safety check to ensure that
- the result was non-negative. This assignment relied on
- undefined behavior, meaning that a compiler may eliminate
- the safety check, causing the program to fail later. File:
- postqueue/showq_compat.c.
+ Undefined behavior (introduced Postfix 1.0): after subtracting
+ a larger unsigned integer from a smaller one, do not assign
+ the result to a signed integer. File: postqueue/showq_compat.c.
20170910
width and precision in format strings (%*, %.*, and %*.*).
These checks were lost with the Postfix 3.2.2 rewrite of
the vbuf_print formatter. File: vbuf_print.c.
+
+ Bugfix (introduced: postfix-alpha): improve the 'fatal:
+ invalid option' message to show the optopt value instead of
+ the getopt() result. Files: master/*server.c.
+
+20170923
+
+ Bugfix (introduced: Postfix 3.2): panic in the postqueue
+ command after output write error while listing the queue.
+ This change restores a write error check that was lost with
+ the Postfix 3.2.2 rewrite of the vbuf_print formatter.
+ Problem reported by Andreas Schulze. File: util/vbuf_print.c.
;;
*)
- $ERROR "unknown command: '$1'"
- $FATAL "usage: postfix start (or stop, reload, abort, flush, check, status, set-permissions, upgrade-configuration)"
+ $FATAL "unknown command: '$1'. Usage: postfix start (or stop, reload, abort, flush, check, status, set-permissions, upgrade-configuration)"
exit 1
;;
#ifndef NO_SNPRINTF
#define VBUF_SNPRINTF(bp, sz, fmt, arg) do { \
ssize_t _ret; \
- VBUF_SPACE((bp), (sz)); \
+ if (VBUF_SPACE((bp), (sz)) != 0) \
+ return (bp); \
_ret = snprintf((char *) (bp)->ptr, (bp)->cnt, (fmt), (arg)); \
if (_ret < 0) \
msg_panic("%s: output error for '%s'", myname, mystrdup(fmt)); \
} while (0)
#else
#define VBUF_SNPRINTF(bp, sz, fmt, arg) do { \
- VBUF_SPACE((bp), (sz)); \
+ if (VBUF_SPACE((bp), (sz)) != 0) \
+ return (bp); \
sprintf((char *) (bp)->ptr, (fmt), (arg)); \
VBUF_SKIP(bp); \
} while (0)