]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-3.4-20190106-nonprod 20181226-nonprod
authorWietse Venema <wietse@porcupine.org>
Sun, 6 Jan 2019 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <postfix-users@dukhovni.org>
Tue, 8 Jan 2019 00:20:34 +0000 (19:20 -0500)
12 files changed:
postfix/WISHLIST
postfix/html/postconf.5.html
postfix/html/postmap.1.html
postfix/man/man1/postmap.1
postfix/man/man5/postconf.5
postfix/proto/postconf.proto
postfix/src/global/mail_version.h
postfix/src/postmap/postmap.c
postfix/src/tls/tls_certkey.c
postfix/src/tls/tls_misc.c
postfix/src/util/dict_file.c
postfix/src/util/dict_open.c

index edc77926a9f2f65f62a343a1bc2f1b80b3b924e9..67a0abb8ecbd9609a52ebd5db49d037c57d2a3f9 100644 (file)
@@ -1,8 +1,5 @@
 Wish list:
 
-       With DICT_FLAG_RHS_IS_FILE, should dict_update() open a
-       file? base64-encode the value?
-
        In smtpd(8) and postscreen(8), set the ehlo_discard_mask
        to ~0 so that STARTTLS, BDAT, DSN, etc. work only for clients
        that send EHLO.
index 9abc9f8f1e6bd44cf0ff421a39e955101ae928b4..17e67f0a7616eeeff81c7f614a0370acaf1089cf 100644 (file)
@@ -18632,7 +18632,7 @@ appropriate keys and certificate chains.  This parameter is implemented
 in the Postfix TLS library, and applies to both <a href="smtpd.8.html">smtpd(8)</a> and the SMTP
 server mode of <a href="tlsproxy.8.html">tlsproxy(8)</a>. </p>
 
-<p> The lookup key is either the verbatim SNI domain name or a an
+<p> The lookup key is either the verbatim SNI domain name or an
 ancestor domain prefixed with a leading dot.  For internationalized
 domains, the lookup key must be in IDNA 2008 A-label form (as
 required in the TLS SNI extension). </p>
index d7a2056609c872c805bb88267c0a2f6bf72ae73f..5e84454725f5b252dec6088ee91c2a28e0c50ff8 100644 (file)
@@ -41,143 +41,146 @@ POSTMAP(1)                                                          POSTMAP(1)
        space is stripped off. Whitespace in lookup keys  is  supported  as  of
        Postfix 3.2.
 
-       When  the  <b>-F</b>  option  is  given,  the  <i>value</i>  must specify a filename;
-       <a href="postmap.1.html"><b>postmap</b>(1)</a> will store the base64-encoded content of that  file  instead
-       of the <i>value</i> itself.
+       When  the  <b>-F</b> option is given, the <i>value</i> must specify one or more file-
+       names separated by comma and/or whitespace; <a href="postmap.1.html"><b>postmap</b>(1)</a> will concatenate
+       the  file content (with a newline character inserted between files) and
+       will store the base64-encoded result instead of the <i>value</i>.
 
-       When  the <i>key</i> specifies email address information, the localpart should
+       When the <i>key</i> specifies email address information, the localpart  should
        be enclosed with double quotes if required by <a href="http://tools.ietf.org/html/rfc5322">RFC 5322</a>. For example, an
        address localpart that contains ";", or a localpart that starts or ends
        with ".".
 
-       By default the lookup key is mapped to lowercase to  make  the  lookups
+       By  default  the  lookup key is mapped to lowercase to make the lookups
        case insensitive; as of Postfix 2.3 this case folding happens only with
        tables whose lookup keys are fixed-case strings such as <a href="DATABASE_README.html#types">btree</a>:, <a href="DATABASE_README.html#types">dbm</a>: or
        <a href="DATABASE_README.html#types">hash</a>:. With earlier versions, the lookup key is folded even with tables
-       where a lookup field can match both upper and lower case text, such  as
-       <a href="regexp_table.5.html">regexp</a>:  and  <a href="pcre_table.5.html">pcre</a>:.  This resulted in loss of information with $<i>number</i>
+       where  a lookup field can match both upper and lower case text, such as
+       <a href="regexp_table.5.html">regexp</a>: and <a href="pcre_table.5.html">pcre</a>:. This resulted in loss of  information  with  $<i>number</i>
        substitutions.
 
 <b>COMMAND-LINE ARGUMENTS</b>
-       <b>-b</b>     Enable message body query mode. When reading  lookup  keys  from
-              standard  input  with  "<b>-q  -</b>", process the input as if it is an
-              email message in <a href="http://tools.ietf.org/html/rfc5322">RFC 5322</a> format.  Each  line  of  body  content
+       <b>-b</b>     Enable  message  body  query mode. When reading lookup keys from
+              standard input with "<b>-q -</b>", process the input as  if  it  is  an
+              email  message  in  <a href="http://tools.ietf.org/html/rfc5322">RFC  5322</a> format.  Each line of body content
               becomes one lookup key.
 
-              By  default,  the <b>-b</b> option starts generating lookup keys at the
-              first non-header line, and stops when the end of the message  is
-              reached.   To  simulate  <a href="header_checks.5.html"><b>body_checks</b>(5)</a>  processing, enable MIME
-              parsing  with  <b>-m</b>.  With  this,  the  <b>-b</b>  option  generates   no
-              body-style  lookup  keys  for  attachment  MIME  headers and for
+              By default, the <b>-b</b> option starts generating lookup keys  at  the
+              first  non-header line, and stops when the end of the message is
+              reached.  To simulate  <a href="header_checks.5.html"><b>body_checks</b>(5)</a>  processing,  enable  MIME
+              parsing   with  <b>-m</b>.  With  this,  the  <b>-b</b>  option  generates  no
+              body-style lookup keys  for  attachment  MIME  headers  and  for
               attached message/* headers.
 
-              NOTE: with "<a href="postconf.5.html#smtputf8_enable">smtputf8_enable</a> = yes", the <b>-b</b>  option  option  dis-
-              ables  UTF-8  syntax  checks  on  query keys and lookup results.
+              NOTE:  with  "<a href="postconf.5.html#smtputf8_enable">smtputf8_enable</a>  = yes", the <b>-b</b> option option dis-
+              ables UTF-8 syntax checks on  query  keys  and  lookup  results.
               Specify the <b>-U</b> option to force UTF-8 syntax checks anyway.
 
               This feature is available in Postfix version 2.6 and later.
 
        <b>-c</b> <i>config</i><b>_</b><i>dir</i>
-              Read the <a href="postconf.5.html"><b>main.cf</b></a>  configuration  file  in  the  named  directory
+              Read  the  <a href="postconf.5.html"><b>main.cf</b></a>  configuration  file  in  the named directory
               instead of the default configuration directory.
 
-       <b>-d</b> <i>key</i> Search  the specified maps for <i>key</i> and remove one entry per map.
-              The exit status is  zero  when  the  requested  information  was
+       <b>-d</b> <i>key</i> Search the specified maps for <i>key</i> and remove one entry per  map.
+              The  exit  status  is  zero  when  the requested information was
               found.
 
-              If  a  key value of <b>-</b> is specified, the program reads key values
-              from the standard input stream. The exit status is zero when  at
+              If a key value of <b>-</b> is specified, the program reads  key  values
+              from  the standard input stream. The exit status is zero when at
               least one of the requested keys was found.
 
-       <b>-f</b>     Do  not  fold  the  lookup  key  to lower case while creating or
+       <b>-f</b>     Do not fold the lookup key  to  lower  case  while  creating  or
               querying a table.
 
-              With Postfix version 2.3 and later, this option  has  no  effect
+              With  Postfix  version  2.3 and later, this option has no effect
               for regular expression tables. There, case folding is controlled
               by appending a flag to a pattern.
 
-       <b>-F</b>     When creating a map from source file, replace  each  value  with
-              the  base64-encoded  content of the named file.  When querying a
-              map, or listing a map, base64-decode each value.
+       <b>-F</b>     When querying a map, or listing a map, base64-decode each value.
+              When creating a map from source file, process each  value  as  a
+              list  of  filenames, concatenate the content of those files, and
+              store the base64-encoded result instead of the value (see  INPUT
+              FORMAT for details).
 
-       <b>-h</b>     Enable message header query mode. When reading lookup keys  from
-              standard  input  with  "<b>-q  -</b>", process the input as if it is an
-              email message in <a href="http://tools.ietf.org/html/rfc5322">RFC 5322</a>  format.   Each  logical  header  line
-              becomes  one  lookup key. A multi-line header becomes one lookup
+       <b>-h</b>     Enable  message header query mode. When reading lookup keys from
+              standard input with "<b>-q -</b>", process the input as  if  it  is  an
+              email  message  in  <a href="http://tools.ietf.org/html/rfc5322">RFC  5322</a>  format.  Each logical header line
+              becomes one lookup key. A multi-line header becomes  one  lookup
               key with one or more embedded newline characters.
 
-              By default, the <b>-h</b> option generates lookup keys until the  first
-              non-header  line  is reached.  To simulate <a href="header_checks.5.html"><b>header_checks</b>(5)</a> pro-
-              cessing, enable MIME parsing with <b>-m</b>. With this, the  <b>-h</b>  option
-              also  generates  header-style  lookup  keys  for attachment MIME
+              By  default, the <b>-h</b> option generates lookup keys until the first
+              non-header line is reached.  To simulate  <a href="header_checks.5.html"><b>header_checks</b>(5)</a>  pro-
+              cessing,  enable  MIME parsing with <b>-m</b>. With this, the <b>-h</b> option
+              also generates header-style  lookup  keys  for  attachment  MIME
               headers and for attached message/* headers.
 
-              NOTE: with "<a href="postconf.5.html#smtputf8_enable">smtputf8_enable</a> = yes", the <b>-b</b>  option  option  dis-
-              ables  UTF-8  syntax  checks  on  query keys and lookup results.
+              NOTE:  with  "<a href="postconf.5.html#smtputf8_enable">smtputf8_enable</a>  = yes", the <b>-b</b> option option dis-
+              ables UTF-8 syntax checks on  query  keys  and  lookup  results.
               Specify the <b>-U</b> option to force UTF-8 syntax checks anyway.
 
               This feature is available in Postfix version 2.6 and later.
 
-       <b>-i</b>     Incremental mode. Read entries from standard input  and  do  not
-              truncate  an existing database. By default, <a href="postmap.1.html"><b>postmap</b>(1)</a> creates a
+       <b>-i</b>     Incremental  mode.  Read  entries from standard input and do not
+              truncate an existing database. By default, <a href="postmap.1.html"><b>postmap</b>(1)</a> creates  a
               new database from the entries in <b>file_name</b>.
 
        <b>-m</b>     Enable MIME parsing with "<b>-b</b>" and "<b>-h</b>".
 
               This feature is available in Postfix version 2.6 and later.
 
-       <b>-N</b>     Include the terminating null character  that  terminates  lookup
-              keys  and  values.  By  default, <a href="postmap.1.html"><b>postmap</b>(1)</a> does whatever is the
+       <b>-N</b>     Include  the  terminating  null character that terminates lookup
+              keys and values. By default, <a href="postmap.1.html"><b>postmap</b>(1)</a>  does  whatever  is  the
               default for the host operating system.
 
-       <b>-n</b>     Don't include the terminating  null  character  that  terminates
-              lookup  keys and values. By default, <a href="postmap.1.html"><b>postmap</b>(1)</a> does whatever is
+       <b>-n</b>     Don't  include  the  terminating  null character that terminates
+              lookup keys and values. By default, <a href="postmap.1.html"><b>postmap</b>(1)</a> does whatever  is
               the default for the host operating system.
 
-       <b>-o</b>     Do not release root privileges when processing a non-root  input
-              file.  By  default, <a href="postmap.1.html"><b>postmap</b>(1)</a> drops root privileges and runs as
+       <b>-o</b>     Do  not release root privileges when processing a non-root input
+              file. By default, <a href="postmap.1.html"><b>postmap</b>(1)</a> drops root privileges and  runs  as
               the source file owner instead.
 
-       <b>-p</b>     Do not inherit the file access permissions from the  input  file
-              when  creating  a  new  file.   Instead,  create a new file with
+       <b>-p</b>     Do  not  inherit the file access permissions from the input file
+              when creating a new file.   Instead,  create  a  new  file  with
               default access permissions (mode 0644).
 
-       <b>-q</b> <i>key</i> Search the specified maps for <i>key</i>  and  write  the  first  value
-              found  to  the  standard  output stream. The exit status is zero
+       <b>-q</b> <i>key</i> Search  the  specified  maps  for  <i>key</i> and write the first value
+              found to the standard output stream. The  exit  status  is  zero
               when the requested information was found.
 
-              Note: this performs a single query with the  key  as  specified,
-              and  does  not make iterative queries with substrings of the key
-              as described for  <a href="access.5.html">access(5)</a>,  <a href="canonical.5.html">canonical(5)</a>,  <a href="transport.5.html">transport(5)</a>,  <a href="virtual.5.html">vir-</a>
+              Note:  this  performs  a single query with the key as specified,
+              and does not make iterative queries with substrings of  the  key
+              as  described  for  <a href="access.5.html">access(5)</a>,  <a href="canonical.5.html">canonical(5)</a>, <a href="transport.5.html">transport(5)</a>, <a href="virtual.5.html">vir-</a>
               <a href="virtual.5.html">tual(5)</a> and other Postfix table-driven features.
 
-              If  a  key value of <b>-</b> is specified, the program reads key values
-              from the standard input stream and writes one line of <i>key  value</i>
+              If a key value of <b>-</b> is specified, the program reads  key  values
+              from  the standard input stream and writes one line of <i>key value</i>
               output for each key that was found. The exit status is zero when
               at least one of the requested keys was found.
 
-       <b>-r</b>     When updating a table, do not complain about attempts to  update
+       <b>-r</b>     When  updating a table, do not complain about attempts to update
               existing entries, and make those updates anyway.
 
-       <b>-s</b>     Retrieve  all database elements, and write one line of <i>key value</i>
-              output for each element. The elements are  printed  in  database
-              order,  which  is not necessarily the same as the original input
+       <b>-s</b>     Retrieve all database elements, and write one line of <i>key  value</i>
+              output  for  each  element. The elements are printed in database
+              order, which is not necessarily the same as the  original  input
               order.
 
-              This feature is available in Postfix version 2.2 and later,  and
+              This  feature is available in Postfix version 2.2 and later, and
               is not available for all database types.
 
-       <b>-u</b>     Disable  UTF-8 support. UTF-8 support is enabled by default when
-              "<a href="postconf.5.html#smtputf8_enable">smtputf8_enable</a> = yes". It requires that keys  and  values  are
+       <b>-u</b>     Disable UTF-8 support. UTF-8 support is enabled by default  when
+              "<a href="postconf.5.html#smtputf8_enable">smtputf8_enable</a>  =  yes".  It requires that keys and values are
               valid UTF-8 strings.
 
        <b>-U</b>     With "<a href="postconf.5.html#smtputf8_enable">smtputf8_enable</a> = yes", force UTF-8 syntax checks with the
               <b>-b</b> and <b>-h</b> options.
 
-       <b>-v</b>     Enable verbose  logging  for  debugging  purposes.  Multiple  <b>-v</b>
+       <b>-v</b>     Enable  verbose  logging  for  debugging  purposes.  Multiple <b>-v</b>
               options make the software increasingly verbose.
 
-       <b>-w</b>     When  updating a table, do not complain about attempts to update
+       <b>-w</b>     When updating a table, do not complain about attempts to  update
               existing entries, and ignore those attempts.
 
        Arguments:
@@ -189,32 +192,32 @@ POSTMAP(1)                                                          POSTMAP(1)
               The <a href="postmap.1.html"><b>postmap</b>(1)</a> command can query any supported file type, but it
               can create only the following file types:
 
-              <b>btree</b>  The output file is  a  btree  file,  named  <i>file</i><b>_</b><i>name</i><b>.db</b>.
-                     This  is  available  on systems with support for <b>db</b> data-
+              <b>btree</b>  The  output  file  is  a  btree file, named <i>file</i><b>_</b><i>name</i><b>.db</b>.
+                     This is available on systems with support  for  <b>db</b>  data-
                      bases.
 
-              <b>cdb</b>    The output consists of  one  file,  named  <i>file</i><b>_</b><i>name</i><b>.cdb</b>.
-                     This  is  available on systems with support for <b>cdb</b> data-
+              <b>cdb</b>    The  output  consists  of  one file, named <i>file</i><b>_</b><i>name</i><b>.cdb</b>.
+                     This is available on systems with support for  <b>cdb</b>  data-
                      bases.
 
               <b>dbm</b>    The output consists of two files, named <i>file</i><b>_</b><i>name</i><b>.pag</b> and
                      <i>file</i><b>_</b><i>name</i><b>.dir</b>.  This is available on systems with support
                      for <b>dbm</b> databases.
 
-              <b>hash</b>   The output file is a  hashed  file,  named  <i>file</i><b>_</b><i>name</i><b>.db</b>.
-                     This  is  available  on systems with support for <b>db</b> data-
+              <b>hash</b>   The  output  file  is  a hashed file, named <i>file</i><b>_</b><i>name</i><b>.db</b>.
+                     This is available on systems with support  for  <b>db</b>  data-
                      bases.
 
-              <b>fail</b>   A table that reliably fails all requests. The lookup  ta-
-                     ble  name  is used for logging only. This table exists to
+              <b>fail</b>   A  table that reliably fails all requests. The lookup ta-
+                     ble name is used for logging only. This table  exists  to
                      simplify Postfix error tests.
 
               <b>sdbm</b>   The output consists of two files, named <i>file</i><b>_</b><i>name</i><b>.pag</b> and
                      <i>file</i><b>_</b><i>name</i><b>.dir</b>.  This is available on systems with support
                      for <b>sdbm</b> databases.
 
-              When no <i>file</i><b>_</b><i>type</i> is specified, the software uses  the  database
-              type   specified  via  the  <b><a href="postconf.5.html#default_database_type">default_database_type</a></b>  configuration
+              When  no  <i>file</i><b>_</b><i>type</i> is specified, the software uses the database
+              type  specified  via  the  <b><a href="postconf.5.html#default_database_type">default_database_type</a></b>   configuration
               parameter.
 
        <i>file</i><b>_</b><i>name</i>
@@ -223,11 +226,11 @@ POSTMAP(1)                                                          POSTMAP(1)
 
 <b>DIAGNOSTICS</b>
        Problems are logged to the standard error stream and to <b>syslogd</b>(8).  No
-       output means that no problems  were  detected.  Duplicate  entries  are
+       output  means  that  no  problems  were detected. Duplicate entries are
        skipped and are flagged with a warning.
 
        <a href="postmap.1.html"><b>postmap</b>(1)</a> terminates with zero exit status in case of success (includ-
-       ing successful "<b>postmap -q</b>" lookup) and terminates with  non-zero  exit
+       ing  successful  "<b>postmap -q</b>" lookup) and terminates with non-zero exit
        status in case of failure.
 
 <b>ENVIRONMENT</b>
@@ -238,12 +241,12 @@ POSTMAP(1)                                                          POSTMAP(1)
               Enable verbose logging for debugging purposes.
 
 <b>CONFIGURATION PARAMETERS</b>
-       The  following  <a href="postconf.5.html"><b>main.cf</b></a> parameters are especially relevant to this pro-
-       gram.  The text below provides only  a  parameter  summary.  See  <a href="postconf.5.html"><b>post-</b></a>
+       The following <a href="postconf.5.html"><b>main.cf</b></a> parameters are especially relevant to  this  pro-
+       gram.   The  text  below  provides  only a parameter summary. See <a href="postconf.5.html"><b>post-</b></a>
        <a href="postconf.5.html"><b>conf</b>(5)</a> for more details including examples.
 
        <b><a href="postconf.5.html#berkeley_db_create_buffer_size">berkeley_db_create_buffer_size</a> (16777216)</b>
-              The  per-table I/O buffer size for programs that create Berkeley
+              The per-table I/O buffer size for programs that create  Berkeley
               DB hash or btree tables.
 
        <b><a href="postconf.5.html#berkeley_db_read_buffer_size">berkeley_db_read_buffer_size</a> (131072)</b>
@@ -251,7 +254,7 @@ POSTMAP(1)                                                          POSTMAP(1)
               hash or btree tables.
 
        <b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
-              The  default  location of the Postfix <a href="postconf.5.html">main.cf</a> and <a href="master.5.html">master.cf</a> con-
+              The default location of the Postfix <a href="postconf.5.html">main.cf</a> and  <a href="master.5.html">master.cf</a>  con-
               figuration files.
 
        <b><a href="postconf.5.html#default_database_type">default_database_type</a> (see 'postconf -d' output)</b>
@@ -259,19 +262,19 @@ POSTMAP(1)                                                          POSTMAP(1)
               and <a href="postmap.1.html"><b>postmap</b>(1)</a> commands.
 
        <b><a href="postconf.5.html#import_environment">import_environment</a> (see 'postconf -d' output)</b>
-              The  list  of  environment  parameters that a privileged Postfix
-              process will  import  from  a  non-Postfix  parent  process,  or
+              The list of environment parameters  that  a  privileged  Postfix
+              process  will  import  from  a  non-Postfix  parent  process, or
               name=value environment overrides.
 
        <b><a href="postconf.5.html#smtputf8_enable">smtputf8_enable</a> (yes)</b>
-              Enable  preliminary SMTPUTF8 support for the protocols described
+              Enable preliminary SMTPUTF8 support for the protocols  described
               in <a href="http://tools.ietf.org/html/rfc6531">RFC 6531</a>..6533.
 
        <b><a href="postconf.5.html#syslog_facility">syslog_facility</a> (mail)</b>
               The syslog facility of Postfix logging.
 
        <b><a href="postconf.5.html#syslog_name">syslog_name</a> (see 'postconf -d' output)</b>
-              A prefix that  is  prepended  to  the  process  name  in  syslog
+              A  prefix  that  is  prepended  to  the  process  name in syslog
               records, so that, for example, "smtpd" becomes "prefix/smtpd".
 
 <b>SEE ALSO</b>
index a6f32c4dbb3d49c1a1373b2fd417dc2d379a5b4c..bfb06328d794677b3d16932f5dbe5b2f15f06c49 100644 (file)
@@ -49,9 +49,11 @@ surrounding white space is stripped off. Whitespace in lookup
 keys is supported as of Postfix 3.2.
 
 When the \fB\-F\fR option is given, the \fIvalue\fR must
-specify a filename; \fBpostmap\fR(1) will store the
-base64\-encoded content of that file instead of the \fIvalue\fR
-itself.
+specify one or more filenames separated by comma and/or
+whitespace; \fBpostmap\fR(1) will concatenate the file
+content (with a newline character inserted between files)
+and will store the base64\-encoded result instead of the
+\fIvalue\fR.
 
 When the \fIkey\fR specifies email address information, the
 localpart should be enclosed with double quotes if required
@@ -109,9 +111,11 @@ With Postfix version 2.3 and later, this option has no
 effect for regular expression tables. There, case folding
 is controlled by appending a flag to a pattern.
 .IP \fB\-F\fR
-When creating a map from source file, replace each value
-with the base64\-encoded content of the named file.  When
-querying a map, or listing a map, base64\-decode each value.
+When querying a map, or listing a map, base64\-decode each
+value. When creating a map from source file, process each
+value as a list of filenames, concatenate the content of
+those files, and store the base64\-encoded result instead
+of the value (see INPUT FORMAT for details).
 .IP \fB\-h\fR
 Enable message header query mode. When reading lookup keys
 from standard input with "\fB\-q \-\fR", process the input
index b6669acd983c03f91591c3ed401be602e687236e..7263bbda8657f79c9e98ba056327024f7b210fd3 100644 (file)
@@ -13001,7 +13001,7 @@ appropriate keys and certificate chains.  This parameter is implemented
 in the Postfix TLS library, and applies to both \fBsmtpd\fR(8) and the SMTP
 server mode of \fBtlsproxy\fR(8).
 .PP
-The lookup key is either the verbatim SNI domain name or a an
+The lookup key is either the verbatim SNI domain name or an
 ancestor domain prefixed with a leading dot.  For internationalized
 domains, the lookup key must be in IDNA 2008 A\-label form (as
 required in the TLS SNI extension).
index 83060a104c339c5eab7dec139911bb9fd26cd6e9..979f422c07e500820f870fce16e7e0d05675ef81 100644 (file)
@@ -17430,7 +17430,7 @@ appropriate keys and certificate chains.  This parameter is implemented
 in the Postfix TLS library, and applies to both smtpd(8) and the SMTP
 server mode of tlsproxy(8). </p>
 
-<p> The lookup key is either the verbatim SNI domain name or a an
+<p> The lookup key is either the verbatim SNI domain name or an
 ancestor domain prefixed with a leading dot.  For internationalized
 domains, the lookup key must be in IDNA 2008 A-label form (as
 required in the TLS SNI extension). </p>
index 012f65a779a9f053b8b0915e2bbdc555c6e26055..f4091897b4e112b5d01dd69237396972775965f1 100644 (file)
@@ -20,7 +20,7 @@
   * Patches change both the patchlevel and the release date. Snapshots have no
   * patchlevel; they change the release date only.
   */
-#define MAIL_RELEASE_DATE      "20181229"
+#define MAIL_RELEASE_DATE      "20190106"
 #define MAIL_VERSION_NUMBER    "3.4"
 
 #ifdef SNAPSHOT
index 9f368abb552607c3889b6637d3fcc6af408d1789..db40a38c3c21d10ea9accb423642bd0deb77d106 100644 (file)
 /*     keys is supported as of Postfix 3.2.
 /*
 /*     When the \fB-F\fR option is given, the \fIvalue\fR must
-/*     specify a filename; \fBpostmap\fR(1) will store the
-/*     base64-encoded content of that file instead of the \fIvalue\fR
-/*     itself.
+/*     specify one or more filenames separated by comma and/or
+/*     whitespace; \fBpostmap\fR(1) will concatenate the file
+/*     content (with a newline character inserted between files)
+/*     and will store the base64-encoded result instead of the
+/*     \fIvalue\fR.
 /*
 /*     When the \fIkey\fR specifies email address information, the
 /*     localpart should be enclosed with double quotes if required
 /*     effect for regular expression tables. There, case folding
 /*     is controlled by appending a flag to a pattern.
 /* .IP \fB-F\fR
-/*     When creating a map from source file, replace each value
-/*     with the base64-encoded content of the named file.  When
-/*     querying a map, or listing a map, base64-decode each value.
+/*     When querying a map, or listing a map, base64-decode each
+/*     value. When creating a map from source file, process each
+/*     value as a list of filenames, concatenate the content of
+/*     those files, and store the base64-encoded result instead
+/*     of the value (see INPUT FORMAT for details).
 /* .IP \fB-h\fR
 /*     Enable message header query mode. When reading lookup keys
 /*     from standard input with "\fB-q -\fR", process the input
@@ -884,9 +888,9 @@ static void postmap_seq(const char *map_type, const char *map_name,
            if ((unb64 = dict_file_from_b64(dict, value)) == 0) {
                err = dict_file_get_error(dict);
                msg_warn("table %s:%s: key %s: %s",
-                        dict->type, dict->name,
-                        key, err);
+                        dict->type, dict->name, key, err);
                myfree(err);
+               /* dict->error = DICT_ERR_CONFIG; */
                continue;
            }
            value = STR(unb64);
index 997e26830703a8ac220345a1bddd83c98702d78e..1bb806bac3cb6ced5df57a1c0fe0bfa94fc1dda0 100644 (file)
@@ -53,8 +53,8 @@
 /*     tls_load_pem_chain() loads one or more (key, cert, [chain])
 /*     triples from an in-memory PEM blob.  The "origin" argument
 /*     is used for error logging, to identify the provenance of the
-/*     PEM blob.  Exactly one of "ctx" or "ssl" must be non-zero,
-/*     and the keys and certificates will be loaded into that object.
+/*     PEM blob. "ssl" must be non-zero, and the keys and certificates
+/*     will be loaded into that object.
 /* LICENSE
 /* .ad
 /* .fi
 #define TLS_INTERNAL
 #include <tls.h>
 
-#define STATE_PEM_NOGO -2              /* Unusable object or sequence */
-#define STATE_PEM_FAIL -1              /* Error in libcrypto */
-#define STATE_PEM_DONE 0               /* End of PEM file, return value only */
-#define STATE_PEM_INIT 1               /* No PEM objects seen */
-#define STATE_PEM_PKEY 2               /* Last object was a private key */
-#define STATE_PEM_CERT 3               /* Last object was a certificate */
-#define STATE_PEM_BOTH 4               /* Unordered, key + first cert seen */
+#define PEM_LOAD_STATE_NOGO    -2      /* Unusable object or sequence */
+#define PEM_LOAD_STATE_FAIL    -1      /* Error in libcrypto */
+#define PEM_LOAD_STATE_DONE    0       /* End of PEM file, return value only */
+#define PEM_LOAD_STATE_INIT    1       /* No PEM objects seen */
+#define PEM_LOAD_STATE_PKEY    2       /* Last object was a private key */
+#define PEM_LOAD_STATE_CERT    3       /* Last object was a certificate */
+#define PEM_LOAD_STATE_BOTH    4       /* Unordered, key + first cert seen */
 
-#define LOAD_MODE_MIXED        0               /* Key order not fixed */
-#define LOAD_MODE_MORE 1               /* Keys first, more files */
-#define LOAD_MODE_LAST 2               /* Keys first, last file */
+#define PEM_LOAD_MODE_MIXED    0       /* Key order not fixed */
+#define PEM_LOAD_MODE_MORE     1       /* Keys first, more files */
+#define PEM_LOAD_MODE_LAST     2       /* Keys first, last file */
 
-typedef struct pem_load_state {
+typedef struct pem_load_state_t {
     const char *origin;                        /* PEM chain origin description */
     const char *source;                        /* PEM BIO origin description */
     const char *keysrc;                        /* Source of last key */
@@ -120,11 +120,11 @@ typedef struct pem_load_state {
     int     keynum;                    /* Index of last key */
     int     objnum;                    /* Index in current source */
     int     state;                     /* Current state, never "DONE" */
-} pem_load_state;
+} pem_load_state_t;
 
 /* init_pem_load_state - fill in initial pem_load_state structure */
 
-static void init_pem_load_state(pem_load_state *st, SSL_CTX *ctx, SSL *ssl,
+static void init_pem_load_state(pem_load_state_t *st, SSL_CTX *ctx, SSL *ssl,
                                        const char *origin)
 {
     st->origin = origin;
@@ -138,13 +138,13 @@ static void init_pem_load_state(pem_load_state *st, SSL_CTX *ctx, SSL *ssl,
     st->chain = 0;
     st->keynum = 0;
     st->objnum = 0;
-    st->state = STATE_PEM_INIT;
+    st->state = PEM_LOAD_STATE_INIT;
 }
 
 /* use_chain - load cert, key and chain into ctx or ssl */
 
 #if OPENSSL_VERSION_NUMBER >= 0x1010100fUL
-static int use_chain(pem_load_state *st)
+static int use_chain(pem_load_state_t *st)
 {
     int     ret;
     int     replace = 0;
@@ -178,7 +178,7 @@ static int use_chain(pem_load_state *st)
 #else
 
 /* Legacy OpenSSL 1.0.2 and 1.1.0 interface */
-static int use_chain(pem_load_state *st)
+static int use_chain(pem_load_state_t *st)
 {
     int     ret = 1;
 
@@ -221,7 +221,7 @@ static int use_chain(pem_load_state *st)
 
 /* load_cert - decode and load a DER-encoded X509 certificate */
 
-static void load_cert(pem_load_state *st, int mode, unsigned char *buf,
+static void load_cert(pem_load_state_t *st, int mode, unsigned char *buf,
                              long buflen)
 {
     const unsigned char *p = buf;
@@ -231,30 +231,30 @@ static void load_cert(pem_load_state *st, int mode, unsigned char *buf,
      * When expecting one or more keys, each key must precede the associated
      * certicate (chain).
      */
-    if (mode != LOAD_MODE_MIXED && st->state == STATE_PEM_INIT) {
+    if (mode != PEM_LOAD_MODE_MIXED && st->state == PEM_LOAD_STATE_INIT) {
        msg_warn("error loading chain from %s: key not first", st->source);
        if (cert)
            X509_free(cert);
-       st->state = STATE_PEM_NOGO;
+       st->state = PEM_LOAD_STATE_NOGO;
        return;
     }
     if (!cert) {
        msg_warn("error loading certificate (PEM object number %d) from %s",
                 st->objnum, st->source);
-       st->state = STATE_PEM_FAIL;
+       st->state = PEM_LOAD_STATE_FAIL;
        return;
     }
     if (p - buf != buflen) {
        msg_warn("error loading certificate (PEM object number %d) from %s:"
                 " excess data", st->objnum, st->source);
        X509_free(cert);
-       st->state = STATE_PEM_NOGO;
+       st->state = PEM_LOAD_STATE_NOGO;
        return;
     }
 
     /*
      * The first certificate after a new key becomes the leaf certificate for
-     * that key, and the additional issuer certificte list is cleared.
+     * that key, and the additional issuer certificate list is cleared.
      * Subsequent certificates are added to the issuer chain (without an
      * "upref" so they are now owne by the chain, and must not be freed).
      * 
@@ -266,24 +266,24 @@ static void load_cert(pem_load_state *st, int mode, unsigned char *buf,
     } else if ((!st->chain && (st->chain = sk_X509_new_null()) == 0)
               || !sk_X509_push(st->chain, cert)) {
        X509_free(cert);
-       st->state = STATE_PEM_FAIL;
+       st->state = PEM_LOAD_STATE_FAIL;
        return;
     }
-    if (st->state == STATE_PEM_INIT) {
-       st->state = STATE_PEM_CERT;
+    if (st->state == PEM_LOAD_STATE_INIT) {
+       st->state = PEM_LOAD_STATE_CERT;
        return;
     }
-    if (st->state != STATE_PEM_PKEY)
+    if (st->state != PEM_LOAD_STATE_PKEY)
        return;
-    if (mode == LOAD_MODE_MIXED)
-       st->state = STATE_PEM_BOTH;
+    if (mode == PEM_LOAD_MODE_MIXED)
+       st->state = PEM_LOAD_STATE_BOTH;
     else
-       st->state = STATE_PEM_CERT;
+       st->state = PEM_LOAD_STATE_CERT;
 }
 
 /* load_pkey - decode and load a DER-encoded private key */
 
-static void load_pkey(pem_load_state *st, int mode, int pkey_type,
+static void load_pkey(pem_load_state_t *st, int mode, int pkey_type,
                              unsigned char *buf, long buflen)
 {
     const char *myname = "load_pkey";
@@ -315,31 +315,31 @@ static void load_pkey(pem_load_state *st, int mode, int pkey_type,
      * ignored with a warning.
      */
     switch (st->state) {
-    case STATE_PEM_INIT:
+    case PEM_LOAD_STATE_INIT:
        break;
 
-    case STATE_PEM_CERT:
+    case PEM_LOAD_STATE_CERT:
 
        /*
         * When processing the key of a "next" chain, we're in the "CERT"
         * state, and first complete the processing of the previous chain.
         */
-       if (mode != LOAD_MODE_MIXED && !use_chain(st)) {
+       if (mode != PEM_LOAD_MODE_MIXED && !use_chain(st)) {
            msg_warn("error loading certificate chain: "
                     "key number %d in %s does not match the certificate",
                     st->keynum, st->keysrc);
-           st->state = STATE_PEM_FAIL;
+           st->state = PEM_LOAD_STATE_FAIL;
            return;
        }
        break;
 
-    case STATE_PEM_PKEY:
-    case STATE_PEM_BOTH:
+    case PEM_LOAD_STATE_PKEY:
+    case PEM_LOAD_STATE_BOTH:
        if (pkey)
            EVP_PKEY_free(pkey);
 
        /* XXX: Legacy behaviour was silent, should we stay silent? */
-       if (mode == LOAD_MODE_MIXED) {
+       if (mode == PEM_LOAD_MODE_MIXED) {
            msg_warn("ignoring 2nd key at index %d in %s after 1st at %d",
                     st->objnum, st->source, st->keynum);
            return;
@@ -348,19 +348,19 @@ static void load_pkey(pem_load_state *st, int mode, int pkey_type,
        msg_warn("error loading certificate chain: "
                 "key number %d in %s not followed by a certificate",
                 st->keynum, st->keysrc);
-       st->state = STATE_PEM_NOGO;
+       st->state = PEM_LOAD_STATE_NOGO;
        return;
 
     default:
        msg_error("%s: internal error: bad state: %d", myname, st->state);
-       st->state = STATE_PEM_NOGO;
+       st->state = PEM_LOAD_STATE_NOGO;
        return;
     }
 
     if (!pkey) {
        msg_warn("error loading private key (PEM object number %d) from %s",
                 st->objnum, st->source);
-       st->state = STATE_PEM_FAIL;
+       st->state = PEM_LOAD_STATE_FAIL;
        return;
     }
     /* Reject unexpected data beyond the end of the DER-encoded object */
@@ -368,26 +368,26 @@ static void load_pkey(pem_load_state *st, int mode, int pkey_type,
        msg_warn("error loading private key (PEM object number %d) from %s:"
                 " excess data", st->objnum, st->source);
        EVP_PKEY_free(pkey);
-       st->state = STATE_PEM_NOGO;
+       st->state = PEM_LOAD_STATE_NOGO;
        return;
     }
     /* All's well, update the state */
     st->pkey = pkey;
-    if (st->state == STATE_PEM_INIT) {
-       st->state = STATE_PEM_PKEY;
+    if (st->state == PEM_LOAD_STATE_INIT) {
+       st->state = PEM_LOAD_STATE_PKEY;
        return;
     }
-    if (st->state != STATE_PEM_CERT)
+    if (st->state != PEM_LOAD_STATE_CERT)
        return;
-    if (mode == LOAD_MODE_MIXED)
-       st->state = STATE_PEM_BOTH;
+    if (mode == PEM_LOAD_MODE_MIXED)
+       st->state = PEM_LOAD_STATE_BOTH;
     else
-       st->state = STATE_PEM_PKEY;
+       st->state = PEM_LOAD_STATE_PKEY;
 }
 
 /* load_pem_object - load next pkey or cert from open BIO */
 
-static int load_pem_object(pem_load_state *st, int mode)
+static int load_pem_object(pem_load_state_t *st, int mode)
 {
     char   *name = 0;
     char   *header = 0;
@@ -397,11 +397,11 @@ static int load_pem_object(pem_load_state *st, int mode)
 
     if (!PEM_read_bio(st->pembio, &name, &header, &buf, &buflen)) {
        if (ERR_GET_REASON(ERR_peek_last_error()) != PEM_R_NO_START_LINE)
-           return (st->state = STATE_PEM_FAIL);
+           return (st->state = PEM_LOAD_STATE_FAIL);
 
        ERR_clear_error();
        /* Clean EOF, preserve stored state for any next input file */
-       return (STATE_PEM_DONE);
+       return (PEM_LOAD_STATE_DONE);
     }
     if (strcmp(name, PEM_STRING_X509) == 0
        || strcmp(name, PEM_STRING_X509_OLD) == 0) {
@@ -414,9 +414,9 @@ static int load_pem_object(pem_load_state *st, int mode)
               || ((pkey_type = EVP_PKEY_DSA) != NID_undef
                   && strcmp(name, PEM_STRING_DSA) == 0)) {
        load_pkey(st, mode, pkey_type, buf, buflen);
-    } else if (mode != LOAD_MODE_MIXED) {
+    } else if (mode != PEM_LOAD_MODE_MIXED) {
        msg_warn("error loading %s: unexpected PEM type: %s", st->source, name);
-       st->state = STATE_PEM_NOGO;
+       st->state = PEM_LOAD_STATE_NOGO;
     }
     OPENSSL_free(name);
     OPENSSL_free(header);
@@ -426,7 +426,7 @@ static int load_pem_object(pem_load_state *st, int mode)
 
 /* load_pem_bio - load all key/certs from bio and free the bio */
 
-static int load_pem_bio(pem_load_state *st, int mode)
+static int load_pem_bio(pem_load_state_t *st, int mode)
 {
     int     state = st->state;
 
@@ -434,23 +434,21 @@ static int load_pem_bio(pem_load_state *st, int mode)
     ERR_clear_error();
 
     /*
-     * When "mode" == LOAD_MODE_MORE, more files will be loaded after the
+     * When "mode" ==PEM_LOAD_MODE_MORE, more files will be loaded after the
      * current file, and final processing for the last key and chain is
      * deferred.
      * 
-     * When "mode" == LOAD_MODE_LAST, this is the last file in the list, and we
-     * validate the final chain.
+     * When "mode" ==PEM_LOAD_MODE_LAST, this is the last file in the list, and
+     * we validate the final chain.
      * 
-     * When "mode" == LOAD_MODE_MIXED, this is the only file, and its key can
+     * When "mode" ==PEM_LOAD_MODE_MIXED, this is the only file, and its key can
      * occur at any location.  In this case we load at most one key.
      */
-    for (st->objnum = 1; state > STATE_PEM_DONE; ++st->objnum) {
+    for (st->objnum = 1; state > PEM_LOAD_STATE_DONE; ++st->objnum) {
        state = load_pem_object(st, mode);
-       if (state == STATE_PEM_PKEY || state == STATE_PEM_BOTH) {
-           if (mode != LOAD_MODE_MIXED) {
-               st->keynum = st->objnum;
-               st->keysrc = st->source;
-           } else if (st->keynum == 0) {
+       if (state == PEM_LOAD_STATE_PKEY || state == PEM_LOAD_STATE_BOTH) {
+           if (mode != PEM_LOAD_MODE_MIXED
+               || (mode == PEM_LOAD_MODE_MIXED && st->keynum == 0)) {
                st->keynum = st->objnum;
                st->keysrc = st->source;
            }
@@ -460,27 +458,27 @@ static int load_pem_bio(pem_load_state *st, int mode)
     BIO_free(st->pembio);
 
     /* Success with current file, go back for more? */
-    if (mode == LOAD_MODE_MORE && state >= STATE_PEM_DONE)
+    if (mode == PEM_LOAD_MODE_MORE && state >= PEM_LOAD_STATE_DONE)
        return 0;
 
     /*
      * If all is well so far, complete processing for the final chain.
      */
-    if (st->state >= STATE_PEM_INIT) {
-       if (st->state == STATE_PEM_INIT) {
+    if (st->state >= PEM_LOAD_STATE_INIT) {
+       if (st->state == PEM_LOAD_STATE_INIT) {
            msg_warn("No PEM data in %s", st->origin);
-           st->state = STATE_PEM_NOGO;
-       } else if (st->state == STATE_PEM_PKEY) {
+           st->state = PEM_LOAD_STATE_NOGO;
+       } else if (st->state == PEM_LOAD_STATE_PKEY) {
            msg_warn("No certs for key number %d in %s",
                     st->keynum, st->keysrc);
-           st->state = STATE_PEM_NOGO;
-       } else if (mode == LOAD_MODE_MIXED && st->state == STATE_PEM_CERT) {
+           st->state = PEM_LOAD_STATE_NOGO;
+       } else if (mode == PEM_LOAD_MODE_MIXED && st->state == PEM_LOAD_STATE_CERT) {
            msg_warn("No private key found in %s", st->origin);
-           st->state = STATE_PEM_NOGO;
+           st->state = PEM_LOAD_STATE_NOGO;
        } else if (!use_chain(st)) {
            msg_warn("key number %d in %s does not match next certificate",
                     st->keynum, st->keysrc);
-           st->state = STATE_PEM_FAIL;
+           st->state = PEM_LOAD_STATE_FAIL;
        } else {
            /* use_chain() freed the key and certs, and zeroed the pointers */
            return (0);
@@ -492,7 +490,7 @@ static int load_pem_bio(pem_load_state *st, int mode)
     sk_X509_pop_free(st->chain, X509_free);
 
     switch (st->state) {
-    case STATE_PEM_FAIL:
+    case PEM_LOAD_STATE_FAIL:
        tls_print_errors();
        /* FALLTHROUGH */
     default:
@@ -507,7 +505,7 @@ static int load_pem_bio(pem_load_state *st, int mode)
 
 static int load_chain_files(SSL_CTX *ctx, const char *chain_files)
 {
-    pem_load_state st;
+    pem_load_state_t st;
     ARGV   *files = argv_split(chain_files, CHARS_COMMA_SP);
     char  **filep;
     int     ret = 0;
@@ -518,10 +516,10 @@ static int load_chain_files(SSL_CTX *ctx, const char *chain_files)
        st.source = *filep;
        if ((st.pembio = BIO_new_file(st.source, "r")) == NULL) {
            msg_warn("error opening chain file: %s: %m", st.source);
-           st.state = STATE_PEM_NOGO;
+           st.state = PEM_LOAD_STATE_NOGO;
            break;
        }
-       mode = filep[1] ? LOAD_MODE_MORE : LOAD_MODE_LAST;
+       mode = filep[1] ? PEM_LOAD_MODE_MORE : PEM_LOAD_MODE_LAST;
        /* load_pem_bio() frees the BIO */
        ret = load_pem_bio(&st, mode);
     }
@@ -576,7 +574,7 @@ static int set_cert_stuff(SSL_CTX *ctx, const char *cert_type,
      * single pass, avoiding potential race conditions during key rollover.
      */
     if (strcmp(cert_file, key_file) == 0) {
-       pem_load_state st;
+       pem_load_state_t st;
 
        init_pem_load_state(&st, ctx, 0, cert_file);
        if ((st.pembio = BIO_new_file(st.source, "r")) == NULL) {
@@ -584,7 +582,7 @@ static int set_cert_stuff(SSL_CTX *ctx, const char *cert_type,
            return (-1);
        }
        /* load_pem_bio() frees the BIO */
-       return (load_pem_bio(&st, LOAD_MODE_MIXED) == 0);
+       return (load_pem_bio(&st, PEM_LOAD_MODE_MIXED) == 0);
     }
 
     /*
@@ -657,7 +655,7 @@ int     tls_set_my_certificate_key_info(SSL_CTX *ctx, const char *chain_files,
 int     tls_load_pem_chain(SSL *ssl, const char *pem, const char *origin)
 {
     static VSTRING *obuf;
-    pem_load_state st;
+    pem_load_state_t st;
 
     if (!obuf)
        obuf = vstring_alloc(100);
@@ -670,7 +668,7 @@ int     tls_load_pem_chain(SSL *ssl, const char *pem, const char *origin)
        return (-1);
     }
     /* load_pem_bio() frees the BIO */
-    return (load_pem_bio(&st, LOAD_MODE_LAST));
+    return (load_pem_bio(&st, PEM_LOAD_MODE_LAST));
 }
 
 #endif
index a2ad6aea59175a279aaa7eb1c1b9aa8305263681..5489d323687ab6bb2b66e06f26f85a4fa1f5e058 100644 (file)
@@ -20,6 +20,9 @@
 /*
 /*     const char **tls_pkey_algorithms(void)
 /*
+/*     void    tls_pre_jail_init(TLS_ROLE)
+/*     TLS_ROLE role;
+/*
 /* .SH Internal functions
 /* .nf
 /* .na
@@ -66,9 +69,6 @@
 /*
 /*     void    tls_param_init()
 /*
-/*     void    tls_pre_jail_init(TLS_ROLE)
-/*     TLS_ROLE role;
-/*
 /*     int     tls_protocol_mask(plist)
 /*     const char *plist;
 /*
index ca4924c850801394537889b662b45f38b0e554c5..eb86b3522b301caf0212cf4f4039b3211a3b1b0f 100644 (file)
@@ -222,9 +222,7 @@ const char *dict_file_lookup(DICT *dict, const char *key)
        return (0);
     if ((unb64 = dict_file_from_b64(dict, res)) == 0) {
        err = dict_file_get_error(dict);
-       msg_warn("table %s:%s: key %s: %s",
-                dict->type, dict->name,
-                key, err);
+       msg_warn("table %s:%s: key %s: %s", dict->type, dict->name, key, err);
        myfree(err);
        dict->error = DICT_ERR_CONFIG;
        return (0);
index ca8df67eea5abd2ce6a5c1892ec56f0efec23501..afea3917f05496cc9a0c2a398fca6f414064cfa3 100644 (file)
 /*     request with a non-UTF-8 key, skip an update request with
 /*     a non-UTF-8 value, and fail a lookup request with a non-UTF-8
 /*     value.
+/* .IP DICT_FLAG_SRC_RHS_IS_FILE
+/*     With dictionaries that are created from source text, each
+/*     value in the source of a dictionary specifies a list of
+/*     file names separated by comma and/or whitespace. The file
+/*     contents are concatenated with a newline inserted between
+/*     files, and the base64-encoded result is stored under the
+/*     key.
+/* .sp
+/*     NOTE 1: it is up to the application to decode lookup results
+/*     with dict_file_lookup() or equivalent (this requires that
+/*     the dictionary is opened with DICT_FLAG_SRC_RHS_IS_FILE).
+/*     Decoding is not built into the normal dictionary lookup
+/*     method, because that would complicate dictionary nesting,
+/*     pipelining, and proxying.
+/* .sp
+/*     NOTE 2: it is up to the application to convert file names
+/*     into base64-encoded file content before calling the dictionary
+/*     update method (see dict_file(3) for support). Automatic
+/*     file content encoding is available only when a dictionary
+/*     is created from source text.
 /* .PP
 /*     Specify DICT_FLAG_NONE for no special processing.
 /*