]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Prevent buffer overrun in read_tablespace_map().
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 17 Mar 2021 20:10:38 +0000 (16:10 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 17 Mar 2021 20:10:38 +0000 (16:10 -0400)
Robert Foggia of Trustwave reported that read_tablespace_map()
fails to prevent an overrun of its on-stack input buffer.
Since the tablespace map file is presumed trustworthy, this does
not seem like an interesting security vulnerability, but still
we should fix it just in the name of robustness.

While here, document that pg_basebackup's --tablespace-mapping option
doesn't work with tar-format output, because it doesn't.  To make it
work, we'd have to modify the tablespace_map file within the tarball
sent by the server, which might be possible but I'm not volunteering.
(Less-painful solutions would require changing the basebackup protocol
so that the source server could adjust the map.  That's not very
appetizing either.)

doc/src/sgml/ref/pg_basebackup.sgml
src/backend/access/transam/xlog.c

index 85af452ee9bd6806afa6169bc5c6984dc9cd66fa..8b5adc64495c39ecb6aeb21a0efe0090ab53875d 100644 (file)
@@ -155,7 +155,8 @@ PostgreSQL documentation
             the target directory. If the cluster contains additional
             tablespaces, the main data directory will be placed in the
             target directory, but all other tablespaces will be placed
-            in the same absolute path as they have on the server.
+            in the same absolute path as they have on the source server.
+            (See <option>--tablespace-mapping</option> to change that.)
            </para>
            <para>
             This is the default format.
@@ -249,7 +250,12 @@ PostgreSQL documentation
         the main data directory are updated to point to the new location.  So
         the new data directory is ready to be used for a new server instance
         with all tablespaces in the updated locations.
-        </para>
+       </para>
+
+       <para>
+        Currently, this option only works with plain output format; it is
+        ignored if tar format is selected.
+       </para>
       </listitem>
      </varlistentry>
 
index 9c72fe711bd36738098b48e8d9316097725dde0d..42b902b298b3972dbfd29d6278a5eb03039b3384 100644 (file)
@@ -11626,7 +11626,7 @@ read_tablespace_map(List **tablespaces)
                }
                else if ((ch == '\n' || ch == '\r') && prev_ch == '\\')
                        str[i - 1] = ch;
-               else
+               else if (i < sizeof(str) - 1)
                        str[i++] = ch;
                prev_ch = ch;
        }