On 3/25/18 2:16 PM, Tom Lane wrote: > Teodor Sigaev <teo...@sigaev.ru> writes: >> Exclude unlogged tables from base backups > > Buildfarm member skink (valgrind) has reported this during its last couple > of runs: > > 2018-03-24 03:18:23.409 UTC [17302] 010_pg_basebackup.pl LOG: received > replication command: BASE_BACKUP LABEL 'pg_basebackup base backup' NOWAIT > TABLESPACE_MAP > ==17302== VALGRINDERROR-BEGIN > ==17302== Conditional jump or move depends on uninitialised value(s) > ==17302== at 0x4C2FD88: strlen (vg_replace_strmem.c:458) > ==17302== by 0x6FBA3AB: vfprintf (vfprintf.c:1643) > ==17302== by 0x6FE19AF: vsnprintf (vsnprintf.c:114) > ==17302== by 0x6FC0F6E: snprintf (snprintf.c:33) > ==17302== by 0x4A3C97: sendDir (basebackup.c:1060) > ==17302== by 0x4A40C6: sendDir (basebackup.c:1221) > ==17302== by 0x4A52B2: sendTablespace (basebackup.c:937) > ==17302== by 0x4A5740: perform_base_backup (basebackup.c:313) > ==17302== by 0x4A635C: SendBaseBackup (basebackup.c:710) > ==17302== by 0x49FCF2: exec_replication_command (walsender.c:1520) > ==17302== by 0x4F61CE: PostgresMain (postgres.c:4143) > ==17302== by 0x4712ED: BackendRun (postmaster.c:4409) > ==17302== Uninitialised value was created by a stack allocation > ==17302== at 0x4A38EA: sendDir (basebackup.c:957) > ==17302== > ==17302== VALGRINDERROR-END > 2018-03-24 03:18:26.127 UTC [17302] 010_pg_basebackup.pl DEBUG: contents of > directory "pg_serial" excluded from backup > > I might be wrong to blame that on this patch, but nothing else has > touched basebackup.c lately. Sure looks like it deserves the blame -- the error is occurring right in the new code.
I think skink is using large values for rel oids and that has exposed a bug. The strncpy doesn't zero terminate the string if the oid has the max number of characters. At least, I was able to reproduce under those circumstances. The attached should fix it. Regards, -- -David da...@pgmasters.net
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index eb6eb7206d..e368943494 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -1056,6 +1056,7 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, * If any other type of fork, check if there is an init fork * with the same OID. If so, the file can be excluded. */ + memset(relOid, 0, sizeof(relOid)); strncpy(relOid, de->d_name, relOidChars); snprintf(initForkFile, sizeof(initForkFile), "%s/%s_init", path, relOid);