• Tom Lane's avatar
    Fix pg_restore's misdesigned code for detecting archive file format. · ec03f2df
    Tom Lane authored
    Despite the clear comments pointing out that the duplicative code
    segments in ReadHead() and _discoverArchiveFormat() needed to be
    in sync, they were not: the latter did not bother to apply any of
    the sanity checks in the former.  We'd missed noticing this partly
    because none of those checks would fail in scenarios we customarily
    test, and partly because the oversight would be masked if both
    segments execute, which they would in cases other than needing to
    autodetect the format of a non-seekable stdin source.  However,
    in a case meeting all these requirements --- for example, trying
    to read a newer-than-supported archive format from non-seekable
    stdin --- pg_restore missed applying the version check and would
    likely dump core or otherwise misbehave.
    
    The whole thing is silly anyway, because there seems little reason
    to duplicate the logic beyond the one-line verification that the
    file starts with "PGDMP".  There seems to have been an undocumented
    assumption that multiple major formats (major enough to require
    separate reader modules) would nonetheless share the first half-dozen
    fields of the custom-format header.  This seems unlikely, so let's
    fix it by just nuking the duplicate logic in _discoverArchiveFormat().
    
    Also get rid of the pointless attempt to seek back to the start of
    the file after successful autodetection.  That wastes cycles and
    it means we have four behaviors to verify not two.
    
    Per bug #16951 from Sergey Koposov.  This has been broken for
    decades, so back-patch to all supported versions.
    
    Discussion: https://postgr.es/m/16951-a4dd68cf0de23048@postgresql.org
    ec03f2df
pg_backup_archiver.h 17.5 KB