GCC 7 warnings
The release of GCC 7 is approaching [0]https://gcc.gnu.org/ml/gcc/2017-03/msg00066.html, and the number of warnings in
PostgreSQL has gone up since we last looked [1]/messages/by-id/CAFj8pRA=xV0_-aDF5UtGVY8HGvg+ovA_js_P8z4jLHxvX0Wa=A@mail.gmail.com. Output attached. (My
version is 7.0.1 20170408.)
Most of the issues have to do with concatenating two or more strings of
potential size MAXPGPATH into another buffer of size MAXPGPATH, which
could lead to truncation.
Possible fixes:
a) Ignore, hoping GCC will change before final release. (unlikely at
this point)
b) Add compiler option to disable this particular warning, worry about
it later. (Might be an option for backpatching.)
c) Expand the target buffer sizes until the warning goes away. (Sample
patch attached.)
d) Replace most of the problematic code with psprintf() and dynamically
sized buffers.
Comments?
[0]: https://gcc.gnu.org/ml/gcc/2017-03/msg00066.html
[1]: /messages/by-id/CAFj8pRA=xV0_-aDF5UtGVY8HGvg+ovA_js_P8z4jLHxvX0Wa=A@mail.gmail.com
/messages/by-id/CAFj8pRA=xV0_-aDF5UtGVY8HGvg+ovA_js_P8z4jLHxvX0Wa=A@mail.gmail.com
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachments:
0001-Fix-various-new-warnings-from-gcc-7.patchinvalid/octet-stream; name=0001-Fix-various-new-warnings-from-gcc-7.patchDownload
From acf0df33fe4b0da97557f664c32c511da79aaa2c Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Sat, 25 Mar 2017 14:02:32 -0400
Subject: [PATCH] Fix various new warnings from gcc-7
---
contrib/pg_standby/pg_standby.c | 6 +++---
src/backend/access/heap/rewriteheap.c | 4 ++--
src/backend/access/transam/xlog.c | 6 +++---
src/backend/catalog/objectaddress.c | 1 +
src/backend/postmaster/pgstat.c | 4 ++--
src/backend/replication/basebackup.c | 4 ++--
src/backend/replication/logical/reorderbuffer.c | 2 +-
src/backend/replication/logical/snapbuild.c | 4 ++--
src/backend/replication/slot.c | 6 +++---
src/backend/storage/file/copydir.c | 10 +++++-----
src/backend/storage/file/fd.c | 12 ++++++------
src/backend/storage/file/reinit.c | 8 ++++----
src/backend/storage/ipc/dsm.c | 4 ++--
src/backend/utils/adt/dbsize.c | 14 +++++++-------
src/backend/utils/adt/genfile.c | 4 ++--
src/backend/utils/cache/relcache.c | 4 ++--
src/backend/utils/error/elog.c | 2 +-
src/backend/utils/time/snapmgr.c | 4 ++--
src/bin/pg_archivecleanup/pg_archivecleanup.c | 4 ++--
src/bin/pg_basebackup/pg_receivewal.c | 4 ++--
src/bin/pg_resetwal/pg_resetwal.c | 8 ++++----
src/bin/pg_rewind/copy_fetch.c | 10 +++++-----
src/common/file_utils.c | 4 ++--
src/timezone/pgtz.c | 4 ++--
24 files changed, 67 insertions(+), 66 deletions(-)
diff --git a/contrib/pg_standby/pg_standby.c b/contrib/pg_standby/pg_standby.c
index e4d057e18e..5703032397 100644
--- a/contrib/pg_standby/pg_standby.c
+++ b/contrib/pg_standby/pg_standby.c
@@ -57,7 +57,7 @@ char *xlogFilePath; /* where we are going to restore to */
char *nextWALFileName; /* the file we need to get from archive */
char *restartWALFileName; /* the file from which we can restart restore */
char *priorWALFileName; /* the file we need to get from archive */
-char WALFilePath[MAXPGPATH]; /* the file path including archive */
+char WALFilePath[MAXPGPATH * 2]; /* the file path including archive */
char restoreCommand[MAXPGPATH]; /* run this to restore */
char exclusiveCleanupFileName[MAXFNAMELEN]; /* the file we need to
* get from archive */
@@ -259,9 +259,9 @@ CustomizableCleanupPriorWALFiles(void)
strcmp(xlde->d_name + 8, exclusiveCleanupFileName + 8) < 0)
{
#ifdef WIN32
- snprintf(WALFilePath, MAXPGPATH, "%s\\%s", archiveLocation, xlde->d_name);
+ snprintf(WALFilePath, sizeof(WALFilePath), "%s\\%s", archiveLocation, xlde->d_name);
#else
- snprintf(WALFilePath, MAXPGPATH, "%s/%s", archiveLocation, xlde->d_name);
+ snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s", archiveLocation, xlde->d_name);
#endif
if (debug)
diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c
index d7f65a5e99..0044987322 100644
--- a/src/backend/access/heap/rewriteheap.c
+++ b/src/backend/access/heap/rewriteheap.c
@@ -1203,7 +1203,7 @@ CheckPointLogicalRewriteHeap(void)
XLogRecPtr redo;
DIR *mappings_dir;
struct dirent *mapping_de;
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2];
/*
* We start of with a minimum of the last redo pointer. No new decoding
@@ -1234,7 +1234,7 @@ CheckPointLogicalRewriteHeap(void)
strcmp(mapping_de->d_name, "..") == 0)
continue;
- snprintf(path, MAXPGPATH, "pg_logical/mappings/%s", mapping_de->d_name);
+ snprintf(path, sizeof(path), "pg_logical/mappings/%s", mapping_de->d_name);
if (lstat(path, &statbuf) == 0 && !S_ISREG(statbuf.st_mode))
continue;
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 45ed58ea34..dd4bc1a59c 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -4102,7 +4102,7 @@ CleanupBackupHistory(void)
{
DIR *xldir;
struct dirent *xlde;
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2];
xldir = AllocateDir(XLOGDIR);
if (xldir == NULL)
@@ -4120,7 +4120,7 @@ CleanupBackupHistory(void)
ereport(DEBUG2,
(errmsg("removing transaction log backup history file \"%s\"",
xlde->d_name)));
- snprintf(path, MAXPGPATH, XLOGDIR "/%s", xlde->d_name);
+ snprintf(path, sizeof(path), XLOGDIR "/%s", xlde->d_name);
unlink(path);
XLogArchiveCleanup(xlde->d_name);
}
@@ -10389,7 +10389,7 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p,
/* Collect information about all tablespaces */
while ((de = ReadDir(tblspcdir, "pg_tblspc")) != NULL)
{
- char fullpath[MAXPGPATH];
+ char fullpath[MAXPGPATH * 2];
char linkpath[MAXPGPATH];
char *relpath = NULL;
int rllen;
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index 1eb7930901..74cd639213 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -1593,6 +1593,7 @@ get_object_address_opf_member(ObjectType objtype,
/* find out left/right type names and OIDs */
i = 0;
+ typenames[0] = typenames[1] = NULL;
foreach(cell, lsecond(object))
{
ObjectAddress typaddr;
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 3fb57f060c..496e6aedde 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -606,7 +606,7 @@ pgstat_reset_remove_files(const char *directory)
{
DIR *dir;
struct dirent *entry;
- char fname[MAXPGPATH];
+ char fname[MAXPGPATH * 2];
dir = AllocateDir(directory);
while ((entry = ReadDir(dir, directory)) != NULL)
@@ -636,7 +636,7 @@ pgstat_reset_remove_files(const char *directory)
strcmp(entry->d_name + nchars, "stat") != 0)
continue;
- snprintf(fname, MAXPGPATH, "%s/%s", directory,
+ snprintf(fname, sizeof(fname), "%s/%s", directory,
entry->d_name);
unlink(fname);
}
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c
index e3a7ad5e9a..3ee0dd5aa4 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -959,7 +959,7 @@ sendDir(char *path, int basepathlen, bool sizeonly, List *tablespaces,
{
DIR *dir;
struct dirent *de;
- char pathbuf[MAXPGPATH];
+ char pathbuf[MAXPGPATH * 2];
struct stat statbuf;
int64 size = 0;
@@ -1011,7 +1011,7 @@ sendDir(char *path, int basepathlen, bool sizeonly, List *tablespaces,
if (excludeFound)
continue;
- snprintf(pathbuf, MAXPGPATH, "%s/%s", path, de->d_name);
+ snprintf(pathbuf, sizeof(pathbuf), "%s/%s", path, de->d_name);
/* Skip pg_control here to back up it last */
if (strcmp(pathbuf, "./global/pg_control") == 0)
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 12ebadca81..e5926cbfc2 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -2613,7 +2613,7 @@ StartupReorderBuffer(void)
while ((logical_de = ReadDir(logical_dir, "pg_replslot")) != NULL)
{
struct stat statbuf;
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 3];
if (strcmp(logical_de->d_name, ".") == 0 ||
strcmp(logical_de->d_name, "..") == 0)
diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c
index 227960452d..52051c6295 100644
--- a/src/backend/replication/logical/snapbuild.c
+++ b/src/backend/replication/logical/snapbuild.c
@@ -1868,7 +1868,7 @@ CheckPointSnapBuild(void)
XLogRecPtr redo;
DIR *snap_dir;
struct dirent *snap_de;
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2];
/*
* We start off with a minimum of the last redo pointer. No new replication
@@ -1895,7 +1895,7 @@ CheckPointSnapBuild(void)
strcmp(snap_de->d_name, "..") == 0)
continue;
- snprintf(path, MAXPGPATH, "pg_logical/snapshots/%s", snap_de->d_name);
+ snprintf(path, sizeof(path), "pg_logical/snapshots/%s", snap_de->d_name);
if (lstat(path, &statbuf) == 0 && !S_ISREG(statbuf.st_mode))
{
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 6ac0ce69c6..32067fa201 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1023,13 +1023,13 @@ StartupReplicationSlots(void)
while ((replication_de = ReadDir(replication_dir, "pg_replslot")) != NULL)
{
struct stat statbuf;
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2];
if (strcmp(replication_de->d_name, ".") == 0 ||
strcmp(replication_de->d_name, "..") == 0)
continue;
- snprintf(path, MAXPGPATH, "pg_replslot/%s", replication_de->d_name);
+ snprintf(path, sizeof(path), "pg_replslot/%s", replication_de->d_name);
/* we're only creating directories here, skip if it's not our's */
if (lstat(path, &statbuf) == 0 && !S_ISDIR(statbuf.st_mode))
@@ -1259,7 +1259,7 @@ RestoreSlotFromDisk(const char *name)
{
ReplicationSlotOnDisk cp;
int i;
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2];
int fd;
bool restored = false;
int readBytes;
diff --git a/src/backend/storage/file/copydir.c b/src/backend/storage/file/copydir.c
index dffe28376b..1e2691685a 100644
--- a/src/backend/storage/file/copydir.c
+++ b/src/backend/storage/file/copydir.c
@@ -38,8 +38,8 @@ copydir(char *fromdir, char *todir, bool recurse)
{
DIR *xldir;
struct dirent *xlde;
- char fromfile[MAXPGPATH];
- char tofile[MAXPGPATH];
+ char fromfile[MAXPGPATH * 2];
+ char tofile[MAXPGPATH * 2];
if (mkdir(todir, S_IRWXU) != 0)
ereport(ERROR,
@@ -63,8 +63,8 @@ copydir(char *fromdir, char *todir, bool recurse)
strcmp(xlde->d_name, "..") == 0)
continue;
- snprintf(fromfile, MAXPGPATH, "%s/%s", fromdir, xlde->d_name);
- snprintf(tofile, MAXPGPATH, "%s/%s", todir, xlde->d_name);
+ snprintf(fromfile, sizeof(fromfile), "%s/%s", fromdir, xlde->d_name);
+ snprintf(tofile, sizeof(tofile), "%s/%s", todir, xlde->d_name);
if (lstat(fromfile, &fst) < 0)
ereport(ERROR,
@@ -103,7 +103,7 @@ copydir(char *fromdir, char *todir, bool recurse)
strcmp(xlde->d_name, "..") == 0)
continue;
- snprintf(tofile, MAXPGPATH, "%s/%s", todir, xlde->d_name);
+ snprintf(tofile, sizeof(tofile), "%s/%s", todir, xlde->d_name);
/*
* We don't need to sync subdirectories here since the recursive
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index b14979496c..329faf3c36 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -2705,7 +2705,7 @@ CleanupTempFiles(bool isProcExit)
void
RemovePgTempFiles(void)
{
- char temp_path[MAXPGPATH];
+ char temp_path[MAXPGPATH * 2];
DIR *spc_dir;
struct dirent *spc_de;
@@ -2753,7 +2753,7 @@ RemovePgTempFilesInDir(const char *tmpdirname)
{
DIR *temp_dir;
struct dirent *temp_de;
- char rm_path[MAXPGPATH];
+ char rm_path[MAXPGPATH * 2];
temp_dir = AllocateDir(tmpdirname);
if (temp_dir == NULL)
@@ -2794,7 +2794,7 @@ RemovePgTempRelationFiles(const char *tsdirname)
{
DIR *ts_dir;
struct dirent *de;
- char dbspace_path[MAXPGPATH];
+ char dbspace_path[MAXPGPATH * 2];
ts_dir = AllocateDir(tsdirname);
if (ts_dir == NULL)
@@ -2835,7 +2835,7 @@ RemovePgTempRelationFilesInDbspace(const char *dbspacedirname)
{
DIR *dbspace_dir;
struct dirent *de;
- char rm_path[MAXPGPATH];
+ char rm_path[MAXPGPATH * 2];
dbspace_dir = AllocateDir(dbspacedirname);
if (dbspace_dir == NULL)
@@ -3022,7 +3022,7 @@ walkdir(const char *path,
while ((de = ReadDirExtended(dir, path, elevel)) != NULL)
{
- char subpath[MAXPGPATH];
+ char subpath[MAXPGPATH * 2];
struct stat fst;
int sret;
@@ -3032,7 +3032,7 @@ walkdir(const char *path,
strcmp(de->d_name, "..") == 0)
continue;
- snprintf(subpath, MAXPGPATH, "%s/%s", path, de->d_name);
+ snprintf(subpath, sizeof(subpath), "%s/%s", path, de->d_name);
if (process_symlinks)
sret = stat(subpath, &fst);
diff --git a/src/backend/storage/file/reinit.c b/src/backend/storage/file/reinit.c
index b883dfc657..6aab4dfe02 100644
--- a/src/backend/storage/file/reinit.c
+++ b/src/backend/storage/file/reinit.c
@@ -48,7 +48,7 @@ typedef struct
void
ResetUnloggedRelations(int op)
{
- char temp_path[MAXPGPATH];
+ char temp_path[MAXPGPATH * 2];
DIR *spc_dir;
struct dirent *spc_de;
MemoryContext tmpctx,
@@ -104,7 +104,7 @@ ResetUnloggedRelationsInTablespaceDir(const char *tsdirname, int op)
{
DIR *ts_dir;
struct dirent *de;
- char dbspace_path[MAXPGPATH];
+ char dbspace_path[MAXPGPATH * 2];
ts_dir = AllocateDir(tsdirname);
if (ts_dir == NULL)
@@ -145,7 +145,7 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op)
{
DIR *dbspace_dir;
struct dirent *de;
- char rm_path[MAXPGPATH];
+ char rm_path[MAXPGPATH * 2];
/* Caller must specify at least one operation. */
Assert((op & (UNLOGGED_RELATION_CLEANUP | UNLOGGED_RELATION_INIT)) != 0);
@@ -308,7 +308,7 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op)
ForkNumber forkNum;
int oidchars;
char oidbuf[OIDCHARS + 1];
- char srcpath[MAXPGPATH];
+ char srcpath[MAXPGPATH * 2];
char dstpath[MAXPGPATH];
/* Skip anything that doesn't look like a relation data file. */
diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c
index b65b63b721..265bc63ccc 100644
--- a/src/backend/storage/ipc/dsm.c
+++ b/src/backend/storage/ipc/dsm.c
@@ -307,9 +307,9 @@ dsm_cleanup_for_mmap(void)
if (strncmp(dent->d_name, PG_DYNSHMEM_MMAP_FILE_PREFIX,
strlen(PG_DYNSHMEM_MMAP_FILE_PREFIX)) == 0)
{
- char buf[MAXPGPATH];
+ char buf[MAXPGPATH * 2];
- snprintf(buf, MAXPGPATH, PG_DYNSHMEM_DIR "/%s", dent->d_name);
+ snprintf(buf, sizeof(buf), PG_DYNSHMEM_DIR "/%s", dent->d_name);
elog(DEBUG2, "removing file \"%s\"", buf);
diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c
index 6d56638208..81e6514ef8 100644
--- a/src/backend/utils/adt/dbsize.c
+++ b/src/backend/utils/adt/dbsize.c
@@ -41,7 +41,7 @@ db_dir_size(const char *path)
int64 dirsize = 0;
struct dirent *direntry;
DIR *dirdesc;
- char filename[MAXPGPATH];
+ char filename[MAXPGPATH * 2];
dirdesc = AllocateDir(path);
@@ -58,7 +58,7 @@ db_dir_size(const char *path)
strcmp(direntry->d_name, "..") == 0)
continue;
- snprintf(filename, MAXPGPATH, "%s/%s", path, direntry->d_name);
+ snprintf(filename, sizeof(filename), "%s/%s", path, direntry->d_name);
if (stat(filename, &fst) < 0)
{
@@ -86,7 +86,7 @@ calculate_database_size(Oid dbOid)
DIR *dirdesc;
struct dirent *direntry;
char dirpath[MAXPGPATH];
- char pathname[MAXPGPATH];
+ char pathname[MAXPGPATH * 2];
AclResult aclresult;
/*
@@ -104,7 +104,7 @@ calculate_database_size(Oid dbOid)
/* Shared storage in pg_global is not counted */
/* Include pg_default storage */
- snprintf(pathname, MAXPGPATH, "base/%u", dbOid);
+ snprintf(pathname, sizeof(pathname), "base/%u", dbOid);
totalsize = db_dir_size(pathname);
/* Scan the non-default tablespaces */
@@ -124,7 +124,7 @@ calculate_database_size(Oid dbOid)
strcmp(direntry->d_name, "..") == 0)
continue;
- snprintf(pathname, MAXPGPATH, "pg_tblspc/%s/%s/%u",
+ snprintf(pathname, sizeof(pathname), "pg_tblspc/%s/%s/%u",
direntry->d_name, TABLESPACE_VERSION_DIRECTORY, dbOid);
totalsize += db_dir_size(pathname);
}
@@ -172,7 +172,7 @@ static int64
calculate_tablespace_size(Oid tblspcOid)
{
char tblspcPath[MAXPGPATH];
- char pathname[MAXPGPATH];
+ char pathname[MAXPGPATH * 2];
int64 totalsize = 0;
DIR *dirdesc;
struct dirent *direntry;
@@ -215,7 +215,7 @@ calculate_tablespace_size(Oid tblspcOid)
strcmp(direntry->d_name, "..") == 0)
continue;
- snprintf(pathname, MAXPGPATH, "%s/%s", tblspcPath, direntry->d_name);
+ snprintf(pathname, sizeof(pathname), "%s/%s", tblspcPath, direntry->d_name);
if (stat(pathname, &fst) < 0)
{
diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c
index 8d0a236e6d..29f3ed9dfb 100644
--- a/src/backend/utils/adt/genfile.c
+++ b/src/backend/utils/adt/genfile.c
@@ -522,7 +522,7 @@ pg_ls_dir_files(FunctionCallInfo fcinfo, char *dir)
{
Datum values[3];
bool nulls[3];
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2 + 1];
struct stat attrib;
HeapTuple tuple;
@@ -531,7 +531,7 @@ pg_ls_dir_files(FunctionCallInfo fcinfo, char *dir)
continue;
/* Get the file info */
- snprintf(path, MAXPGPATH, "%s/%s", fctx->location, de->d_name);
+ snprintf(path, sizeof(path), "%s/%s", fctx->location, de->d_name);
if (stat(path, &attrib) < 0)
ereport(ERROR,
(errcode_for_file_access(),
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index ddb948528b..70535ede12 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -6074,7 +6074,7 @@ RelationCacheInitFileRemove(void)
const char *tblspcdir = "pg_tblspc";
DIR *dir;
struct dirent *de;
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2];
/*
* We zap the shared cache file too. In theory it can't get out of sync
@@ -6116,7 +6116,7 @@ RelationCacheInitFileRemoveInDir(const char *tblspcpath)
{
DIR *dir;
struct dirent *de;
- char initfilename[MAXPGPATH];
+ char initfilename[MAXPGPATH * 2];
/* Scan the tablespace directory to find per-database directories */
dir = AllocateDir(tblspcpath);
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 6e83cbedab..5169714817 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -2228,7 +2228,7 @@ static void
setup_formatted_log_time(void)
{
pg_time_t stamp_time;
- char msbuf[8];
+ char msbuf[10];
if (!saved_timeval_set)
{
diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c
index 3d92494e0b..814e72d9a1 100644
--- a/src/backend/utils/time/snapmgr.c
+++ b/src/backend/utils/time/snapmgr.c
@@ -1578,7 +1578,7 @@ XactHasExportedSnapshots(void)
void
DeleteAllExportedSnapshotFiles(void)
{
- char buf[MAXPGPATH];
+ char buf[MAXPGPATH * 2];
DIR *s_dir;
struct dirent *s_de;
@@ -1599,7 +1599,7 @@ DeleteAllExportedSnapshotFiles(void)
strcmp(s_de->d_name, "..") == 0)
continue;
- snprintf(buf, MAXPGPATH, SNAPSHOT_EXPORT_DIR "/%s", s_de->d_name);
+ snprintf(buf, sizeof(buf), SNAPSHOT_EXPORT_DIR "/%s", s_de->d_name);
/* Again, unlink failure is not worthy of FATAL */
if (unlink(buf))
elog(LOG, "could not unlink file \"%s\": %m", buf);
diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c
index f1651d4273..1760955586 100644
--- a/src/bin/pg_archivecleanup/pg_archivecleanup.c
+++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c
@@ -32,7 +32,7 @@ char *additional_ext = NULL; /* Extension to remove from filenames */
char *archiveLocation; /* where to find the archive? */
char *restartWALFileName; /* the file from which we can restart restore */
-char WALFilePath[MAXPGPATH]; /* the file path including archive */
+char WALFilePath[MAXPGPATH * 2]; /* the file path including archive */
char exclusiveCleanupFileName[MAXFNAMELEN]; /* the oldest file we
* want to remain in
* archive */
@@ -133,7 +133,7 @@ CleanupPriorWALFiles(void)
* extension that might have been chopped off before testing
* the sequence.
*/
- snprintf(WALFilePath, MAXPGPATH, "%s/%s",
+ snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s",
archiveLocation, xlde->d_name);
if (dryrun)
diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c
index 15348ada58..1a9fe81be1 100644
--- a/src/bin/pg_basebackup/pg_receivewal.c
+++ b/src/bin/pg_basebackup/pg_receivewal.c
@@ -244,7 +244,7 @@ FindStreamingStart(uint32 *tli)
if (!ispartial && !iscompress)
{
struct stat statbuf;
- char fullpath[MAXPGPATH];
+ char fullpath[MAXPGPATH * 2];
snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
if (stat(fullpath, &statbuf) != 0)
@@ -267,7 +267,7 @@ FindStreamingStart(uint32 *tli)
int fd;
char buf[4];
int bytes_out;
- char fullpath[MAXPGPATH];
+ char fullpath[MAXPGPATH * 2];
snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c
index bcb9ed938f..4d6d0822f2 100644
--- a/src/bin/pg_resetwal/pg_resetwal.c
+++ b/src/bin/pg_resetwal/pg_resetwal.c
@@ -958,7 +958,7 @@ KillExistingXLOG(void)
{
DIR *xldir;
struct dirent *xlde;
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2];
xldir = opendir(XLOGDIR);
if (xldir == NULL)
@@ -973,7 +973,7 @@ KillExistingXLOG(void)
if (IsXLogFileName(xlde->d_name) ||
IsPartialXLogFileName(xlde->d_name))
{
- snprintf(path, MAXPGPATH, "%s/%s", XLOGDIR, xlde->d_name);
+ snprintf(path, sizeof(path), "%s/%s", XLOGDIR, xlde->d_name);
if (unlink(path) < 0)
{
fprintf(stderr, _("%s: could not delete file \"%s\": %s\n"),
@@ -1007,7 +1007,7 @@ KillExistingArchiveStatus(void)
{
DIR *xldir;
struct dirent *xlde;
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2];
#define ARCHSTATDIR XLOGDIR "/archive_status"
@@ -1027,7 +1027,7 @@ KillExistingArchiveStatus(void)
strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.ready") == 0 ||
strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.done") == 0))
{
- snprintf(path, MAXPGPATH, "%s/%s", ARCHSTATDIR, xlde->d_name);
+ snprintf(path, sizeof(path), "%s/%s", ARCHSTATDIR, xlde->d_name);
if (unlink(path) < 0)
{
fprintf(stderr, _("%s: could not delete file \"%s\": %s\n"),
diff --git a/src/bin/pg_rewind/copy_fetch.c b/src/bin/pg_rewind/copy_fetch.c
index f8d3dfecfa..347d4e4d4c 100644
--- a/src/bin/pg_rewind/copy_fetch.c
+++ b/src/bin/pg_rewind/copy_fetch.c
@@ -65,14 +65,14 @@ recurse_dir(const char *datadir, const char *parentpath,
while (errno = 0, (xlde = readdir(xldir)) != NULL)
{
struct stat fst;
- char fullpath[MAXPGPATH];
- char path[MAXPGPATH];
+ char fullpath[MAXPGPATH * 2];
+ char path[MAXPGPATH * 2];
if (strcmp(xlde->d_name, ".") == 0 ||
strcmp(xlde->d_name, "..") == 0)
continue;
- snprintf(fullpath, MAXPGPATH, "%s/%s", fullparentpath, xlde->d_name);
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", fullparentpath, xlde->d_name);
if (lstat(fullpath, &fst) < 0)
{
@@ -93,9 +93,9 @@ recurse_dir(const char *datadir, const char *parentpath,
}
if (parentpath)
- snprintf(path, MAXPGPATH, "%s/%s", parentpath, xlde->d_name);
+ snprintf(path, sizeof(path), "%s/%s", parentpath, xlde->d_name);
else
- snprintf(path, MAXPGPATH, "%s", xlde->d_name);
+ snprintf(path, sizeof(path), "%s", xlde->d_name);
if (S_ISREG(fst.st_mode))
callback(path, FILE_TYPE_REGULAR, fst.st_size, NULL);
diff --git a/src/common/file_utils.c b/src/common/file_utils.c
index 72b0565c71..218b83f391 100644
--- a/src/common/file_utils.c
+++ b/src/common/file_utils.c
@@ -166,7 +166,7 @@ walkdir(const char *path,
while (errno = 0, (de = readdir(dir)) != NULL)
{
- char subpath[MAXPGPATH];
+ char subpath[MAXPGPATH * 2];
struct stat fst;
int sret;
@@ -174,7 +174,7 @@ walkdir(const char *path,
strcmp(de->d_name, "..") == 0)
continue;
- snprintf(subpath, MAXPGPATH, "%s/%s", path, de->d_name);
+ snprintf(subpath, sizeof(subpath), "%s/%s", path, de->d_name);
if (process_symlinks)
sret = stat(subpath, &fst);
diff --git a/src/timezone/pgtz.c b/src/timezone/pgtz.c
index 826857d943..b7cfc5f5ac 100644
--- a/src/timezone/pgtz.c
+++ b/src/timezone/pgtz.c
@@ -412,7 +412,7 @@ pg_tzenumerate_next(pg_tzenum *dir)
while (dir->depth >= 0)
{
struct dirent *direntry;
- char fullname[MAXPGPATH];
+ char fullname[MAXPGPATH * 2];
struct stat statbuf;
direntry = ReadDir(dir->dirdesc[dir->depth], dir->dirname[dir->depth]);
@@ -429,7 +429,7 @@ pg_tzenumerate_next(pg_tzenum *dir)
if (direntry->d_name[0] == '.')
continue;
- snprintf(fullname, MAXPGPATH, "%s/%s",
+ snprintf(fullname, sizeof(fullname), "%s/%s",
dir->dirname[dir->depth], direntry->d_name);
if (stat(fullname, &statbuf) != 0)
ereport(ERROR,
--
2.12.2
Hi Peter,
c) Expand the target buffer sizes until the warning goes away. (Sample
patch attached.)
I personally think it's a great patch. Unfortunately I don't have GCC
7.0 right now but at least it doesn't break anything on 6.3.1. Since
there is no rush I would suggest to add an entry to the next commitfest,
so this patch wouldn't accidentally be lost.
As a side node I believe it would be great to replace all sprintf calls
to snprintf just to be on a safe side. IIRC we did something similar to
str* procedures not a long time ago. Unless there are any objections
regarding this idea I'm willing to write such a patch.
--
Best regards,
Aleksander Alekseev
Hi,
On 2017-04-10 11:03:23 -0400, Peter Eisentraut wrote:
The release of GCC 7 is approaching [0], and the number of warnings in
PostgreSQL has gone up since we last looked [1]. Output attached. (My
version is 7.0.1 20170408.)Most of the issues have to do with concatenating two or more strings of
potential size MAXPGPATH into another buffer of size MAXPGPATH, which
could lead to truncation.
Hm, interesting - I don't see this with
gcc-7 (Debian 7-20170407-1) 7.0.1 20170407 (experimental) [trunk revision 246759]
although I do recall having seen them at some point. Not sure what's up
there.
I've to add -Wno-implicit-fallthrough to avoid noisyness, though.
Regards,
Andres
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 2017-04-10 09:10:07 -0700, Andres Freund wrote:
Hi,
On 2017-04-10 11:03:23 -0400, Peter Eisentraut wrote:
The release of GCC 7 is approaching [0], and the number of warnings in
PostgreSQL has gone up since we last looked [1]. Output attached. (My
version is 7.0.1 20170408.)Most of the issues have to do with concatenating two or more strings of
potential size MAXPGPATH into another buffer of size MAXPGPATH, which
could lead to truncation.Hm, interesting - I don't see this with
gcc-7 (Debian 7-20170407-1) 7.0.1 20170407 (experimental) [trunk revision 246759]
although I do recall having seen them at some point. Not sure what's up
there.
Hm. That's with -Wformat-truncation=1 (which is what's added by -Wextra
afaics), I see a good chunk more with -Wformat-truncation=2 - but that's
not enabled by -Wall/extra, so I don't really see a problem right now?
- Andres
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:
Possible fixes:
a) Ignore, hoping GCC will change before final release. (unlikely at
this point)
b) Add compiler option to disable this particular warning, worry about
it later. (Might be an option for backpatching.)
c) Expand the target buffer sizes until the warning goes away. (Sample
patch attached.)
d) Replace most of the problematic code with psprintf() and dynamically
sized buffers.
+1 for (c) as you have it. Later we might think about selectively
doing (d), but it seems like more work for probably not much benefit.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Tom Lane wrote:
Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:
d) Replace most of the problematic code with psprintf() and dynamically
sized buffers.+1 for (c) as you have it. Later we might think about selectively
doing (d), but it seems like more work for probably not much benefit.
Yeah -- also it's possible some of these code paths must not attempt to
palloc() for robustness reasons. I would go for c) only for now, and
only try d) for very specific cases where there are no such concerns.
--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 4/11/17 13:57, Alvaro Herrera wrote:
Tom Lane wrote:
Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:
d) Replace most of the problematic code with psprintf() and dynamically
sized buffers.+1 for (c) as you have it. Later we might think about selectively
doing (d), but it seems like more work for probably not much benefit.Yeah -- also it's possible some of these code paths must not attempt to
palloc() for robustness reasons. I would go for c) only for now, and
only try d) for very specific cases where there are no such concerns.
Attached is a more refined patch that I propose for PG10 now. Compared
to the previous rushed version, this one uses some more precise
arithmetic to size some of the buffers.
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachments:
v2-0001-Fix-new-warnings-from-GCC-7.patchinvalid/octet-stream; name=v2-0001-Fix-new-warnings-from-GCC-7.patchDownload
From 6fa0fe7f95d48bcd155e5f83026eb8fc3266d2ec Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Tue, 11 Apr 2017 14:13:31 -0400
Subject: [PATCH v2] Fix new warnings from GCC 7
This addresses the new warning types -Wformat-truncation
-Wformat-overflow that are part of -Wall, via -Wformat, in GCC 7.
---
contrib/pg_standby/pg_standby.c | 6 +++---
src/backend/access/heap/rewriteheap.c | 4 ++--
src/backend/access/transam/xlog.c | 6 +++---
src/backend/postmaster/pgstat.c | 4 ++--
src/backend/replication/basebackup.c | 4 ++--
src/backend/replication/logical/reorderbuffer.c | 2 +-
src/backend/replication/logical/snapbuild.c | 4 ++--
src/backend/replication/slot.c | 6 +++---
src/backend/storage/file/copydir.c | 10 +++++-----
src/backend/storage/file/fd.c | 12 ++++++------
src/backend/storage/file/reinit.c | 8 ++++----
src/backend/storage/ipc/dsm.c | 4 ++--
src/backend/utils/adt/dbsize.c | 14 +++++++-------
src/backend/utils/adt/genfile.c | 4 ++--
src/backend/utils/cache/relcache.c | 4 ++--
src/backend/utils/error/elog.c | 2 +-
src/backend/utils/time/snapmgr.c | 4 ++--
src/bin/pg_archivecleanup/pg_archivecleanup.c | 4 ++--
src/bin/pg_basebackup/pg_receivewal.c | 4 ++--
src/bin/pg_resetwal/pg_resetwal.c | 12 ++++++------
src/bin/pg_rewind/copy_fetch.c | 10 +++++-----
src/common/file_utils.c | 4 ++--
src/timezone/pgtz.c | 4 ++--
23 files changed, 68 insertions(+), 68 deletions(-)
diff --git a/contrib/pg_standby/pg_standby.c b/contrib/pg_standby/pg_standby.c
index e4d057e18e..5703032397 100644
--- a/contrib/pg_standby/pg_standby.c
+++ b/contrib/pg_standby/pg_standby.c
@@ -57,7 +57,7 @@ char *xlogFilePath; /* where we are going to restore to */
char *nextWALFileName; /* the file we need to get from archive */
char *restartWALFileName; /* the file from which we can restart restore */
char *priorWALFileName; /* the file we need to get from archive */
-char WALFilePath[MAXPGPATH]; /* the file path including archive */
+char WALFilePath[MAXPGPATH * 2]; /* the file path including archive */
char restoreCommand[MAXPGPATH]; /* run this to restore */
char exclusiveCleanupFileName[MAXFNAMELEN]; /* the file we need to
* get from archive */
@@ -259,9 +259,9 @@ CustomizableCleanupPriorWALFiles(void)
strcmp(xlde->d_name + 8, exclusiveCleanupFileName + 8) < 0)
{
#ifdef WIN32
- snprintf(WALFilePath, MAXPGPATH, "%s\\%s", archiveLocation, xlde->d_name);
+ snprintf(WALFilePath, sizeof(WALFilePath), "%s\\%s", archiveLocation, xlde->d_name);
#else
- snprintf(WALFilePath, MAXPGPATH, "%s/%s", archiveLocation, xlde->d_name);
+ snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s", archiveLocation, xlde->d_name);
#endif
if (debug)
diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c
index d7f65a5e99..60dcb67a20 100644
--- a/src/backend/access/heap/rewriteheap.c
+++ b/src/backend/access/heap/rewriteheap.c
@@ -1203,7 +1203,7 @@ CheckPointLogicalRewriteHeap(void)
XLogRecPtr redo;
DIR *mappings_dir;
struct dirent *mapping_de;
- char path[MAXPGPATH];
+ char path[MAXPGPATH + 20];
/*
* We start of with a minimum of the last redo pointer. No new decoding
@@ -1234,7 +1234,7 @@ CheckPointLogicalRewriteHeap(void)
strcmp(mapping_de->d_name, "..") == 0)
continue;
- snprintf(path, MAXPGPATH, "pg_logical/mappings/%s", mapping_de->d_name);
+ snprintf(path, sizeof(path), "pg_logical/mappings/%s", mapping_de->d_name);
if (lstat(path, &statbuf) == 0 && !S_ISREG(statbuf.st_mode))
continue;
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 45ed58ea34..c7667879c6 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -4102,7 +4102,7 @@ CleanupBackupHistory(void)
{
DIR *xldir;
struct dirent *xlde;
- char path[MAXPGPATH];
+ char path[MAXPGPATH + sizeof(XLOGDIR)];
xldir = AllocateDir(XLOGDIR);
if (xldir == NULL)
@@ -4120,7 +4120,7 @@ CleanupBackupHistory(void)
ereport(DEBUG2,
(errmsg("removing transaction log backup history file \"%s\"",
xlde->d_name)));
- snprintf(path, MAXPGPATH, XLOGDIR "/%s", xlde->d_name);
+ snprintf(path, sizeof(path), XLOGDIR "/%s", xlde->d_name);
unlink(path);
XLogArchiveCleanup(xlde->d_name);
}
@@ -10389,7 +10389,7 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p,
/* Collect information about all tablespaces */
while ((de = ReadDir(tblspcdir, "pg_tblspc")) != NULL)
{
- char fullpath[MAXPGPATH];
+ char fullpath[MAXPGPATH + 10];
char linkpath[MAXPGPATH];
char *relpath = NULL;
int rllen;
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 3fb57f060c..496e6aedde 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -606,7 +606,7 @@ pgstat_reset_remove_files(const char *directory)
{
DIR *dir;
struct dirent *entry;
- char fname[MAXPGPATH];
+ char fname[MAXPGPATH * 2];
dir = AllocateDir(directory);
while ((entry = ReadDir(dir, directory)) != NULL)
@@ -636,7 +636,7 @@ pgstat_reset_remove_files(const char *directory)
strcmp(entry->d_name + nchars, "stat") != 0)
continue;
- snprintf(fname, MAXPGPATH, "%s/%s", directory,
+ snprintf(fname, sizeof(fname), "%s/%s", directory,
entry->d_name);
unlink(fname);
}
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c
index e3a7ad5e9a..3ee0dd5aa4 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -959,7 +959,7 @@ sendDir(char *path, int basepathlen, bool sizeonly, List *tablespaces,
{
DIR *dir;
struct dirent *de;
- char pathbuf[MAXPGPATH];
+ char pathbuf[MAXPGPATH * 2];
struct stat statbuf;
int64 size = 0;
@@ -1011,7 +1011,7 @@ sendDir(char *path, int basepathlen, bool sizeonly, List *tablespaces,
if (excludeFound)
continue;
- snprintf(pathbuf, MAXPGPATH, "%s/%s", path, de->d_name);
+ snprintf(pathbuf, sizeof(pathbuf), "%s/%s", path, de->d_name);
/* Skip pg_control here to back up it last */
if (strcmp(pathbuf, "./global/pg_control") == 0)
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 12ebadca81..0c174be8ed 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -2613,7 +2613,7 @@ StartupReorderBuffer(void)
while ((logical_de = ReadDir(logical_dir, "pg_replslot")) != NULL)
{
struct stat statbuf;
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2 + 12];
if (strcmp(logical_de->d_name, ".") == 0 ||
strcmp(logical_de->d_name, "..") == 0)
diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c
index 227960452d..358ec28932 100644
--- a/src/backend/replication/logical/snapbuild.c
+++ b/src/backend/replication/logical/snapbuild.c
@@ -1868,7 +1868,7 @@ CheckPointSnapBuild(void)
XLogRecPtr redo;
DIR *snap_dir;
struct dirent *snap_de;
- char path[MAXPGPATH];
+ char path[MAXPGPATH + 21];
/*
* We start off with a minimum of the last redo pointer. No new replication
@@ -1895,7 +1895,7 @@ CheckPointSnapBuild(void)
strcmp(snap_de->d_name, "..") == 0)
continue;
- snprintf(path, MAXPGPATH, "pg_logical/snapshots/%s", snap_de->d_name);
+ snprintf(path, sizeof(path), "pg_logical/snapshots/%s", snap_de->d_name);
if (lstat(path, &statbuf) == 0 && !S_ISREG(statbuf.st_mode))
{
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 6ac0ce69c6..e8ad0f7b39 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1023,13 +1023,13 @@ StartupReplicationSlots(void)
while ((replication_de = ReadDir(replication_dir, "pg_replslot")) != NULL)
{
struct stat statbuf;
- char path[MAXPGPATH];
+ char path[MAXPGPATH + 12];
if (strcmp(replication_de->d_name, ".") == 0 ||
strcmp(replication_de->d_name, "..") == 0)
continue;
- snprintf(path, MAXPGPATH, "pg_replslot/%s", replication_de->d_name);
+ snprintf(path, sizeof(path), "pg_replslot/%s", replication_de->d_name);
/* we're only creating directories here, skip if it's not our's */
if (lstat(path, &statbuf) == 0 && !S_ISDIR(statbuf.st_mode))
@@ -1259,7 +1259,7 @@ RestoreSlotFromDisk(const char *name)
{
ReplicationSlotOnDisk cp;
int i;
- char path[MAXPGPATH];
+ char path[MAXPGPATH + 22];
int fd;
bool restored = false;
int readBytes;
diff --git a/src/backend/storage/file/copydir.c b/src/backend/storage/file/copydir.c
index dffe28376b..1e2691685a 100644
--- a/src/backend/storage/file/copydir.c
+++ b/src/backend/storage/file/copydir.c
@@ -38,8 +38,8 @@ copydir(char *fromdir, char *todir, bool recurse)
{
DIR *xldir;
struct dirent *xlde;
- char fromfile[MAXPGPATH];
- char tofile[MAXPGPATH];
+ char fromfile[MAXPGPATH * 2];
+ char tofile[MAXPGPATH * 2];
if (mkdir(todir, S_IRWXU) != 0)
ereport(ERROR,
@@ -63,8 +63,8 @@ copydir(char *fromdir, char *todir, bool recurse)
strcmp(xlde->d_name, "..") == 0)
continue;
- snprintf(fromfile, MAXPGPATH, "%s/%s", fromdir, xlde->d_name);
- snprintf(tofile, MAXPGPATH, "%s/%s", todir, xlde->d_name);
+ snprintf(fromfile, sizeof(fromfile), "%s/%s", fromdir, xlde->d_name);
+ snprintf(tofile, sizeof(tofile), "%s/%s", todir, xlde->d_name);
if (lstat(fromfile, &fst) < 0)
ereport(ERROR,
@@ -103,7 +103,7 @@ copydir(char *fromdir, char *todir, bool recurse)
strcmp(xlde->d_name, "..") == 0)
continue;
- snprintf(tofile, MAXPGPATH, "%s/%s", todir, xlde->d_name);
+ snprintf(tofile, sizeof(tofile), "%s/%s", todir, xlde->d_name);
/*
* We don't need to sync subdirectories here since the recursive
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index b14979496c..81d96a4cc0 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -2705,7 +2705,7 @@ CleanupTempFiles(bool isProcExit)
void
RemovePgTempFiles(void)
{
- char temp_path[MAXPGPATH];
+ char temp_path[MAXPGPATH + 10 + sizeof(TABLESPACE_VERSION_DIRECTORY) + sizeof(PG_TEMP_FILES_DIR)];
DIR *spc_dir;
struct dirent *spc_de;
@@ -2753,7 +2753,7 @@ RemovePgTempFilesInDir(const char *tmpdirname)
{
DIR *temp_dir;
struct dirent *temp_de;
- char rm_path[MAXPGPATH];
+ char rm_path[MAXPGPATH * 2];
temp_dir = AllocateDir(tmpdirname);
if (temp_dir == NULL)
@@ -2794,7 +2794,7 @@ RemovePgTempRelationFiles(const char *tsdirname)
{
DIR *ts_dir;
struct dirent *de;
- char dbspace_path[MAXPGPATH];
+ char dbspace_path[MAXPGPATH * 2];
ts_dir = AllocateDir(tsdirname);
if (ts_dir == NULL)
@@ -2835,7 +2835,7 @@ RemovePgTempRelationFilesInDbspace(const char *dbspacedirname)
{
DIR *dbspace_dir;
struct dirent *de;
- char rm_path[MAXPGPATH];
+ char rm_path[MAXPGPATH * 2];
dbspace_dir = AllocateDir(dbspacedirname);
if (dbspace_dir == NULL)
@@ -3022,7 +3022,7 @@ walkdir(const char *path,
while ((de = ReadDirExtended(dir, path, elevel)) != NULL)
{
- char subpath[MAXPGPATH];
+ char subpath[MAXPGPATH * 2];
struct stat fst;
int sret;
@@ -3032,7 +3032,7 @@ walkdir(const char *path,
strcmp(de->d_name, "..") == 0)
continue;
- snprintf(subpath, MAXPGPATH, "%s/%s", path, de->d_name);
+ snprintf(subpath, sizeof(subpath), "%s/%s", path, de->d_name);
if (process_symlinks)
sret = stat(subpath, &fst);
diff --git a/src/backend/storage/file/reinit.c b/src/backend/storage/file/reinit.c
index b883dfc657..f331e7bc21 100644
--- a/src/backend/storage/file/reinit.c
+++ b/src/backend/storage/file/reinit.c
@@ -48,7 +48,7 @@ typedef struct
void
ResetUnloggedRelations(int op)
{
- char temp_path[MAXPGPATH];
+ char temp_path[MAXPGPATH + 10 + sizeof(TABLESPACE_VERSION_DIRECTORY)];
DIR *spc_dir;
struct dirent *spc_de;
MemoryContext tmpctx,
@@ -104,7 +104,7 @@ ResetUnloggedRelationsInTablespaceDir(const char *tsdirname, int op)
{
DIR *ts_dir;
struct dirent *de;
- char dbspace_path[MAXPGPATH];
+ char dbspace_path[MAXPGPATH * 2];
ts_dir = AllocateDir(tsdirname);
if (ts_dir == NULL)
@@ -145,7 +145,7 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op)
{
DIR *dbspace_dir;
struct dirent *de;
- char rm_path[MAXPGPATH];
+ char rm_path[MAXPGPATH * 2];
/* Caller must specify at least one operation. */
Assert((op & (UNLOGGED_RELATION_CLEANUP | UNLOGGED_RELATION_INIT)) != 0);
@@ -308,7 +308,7 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op)
ForkNumber forkNum;
int oidchars;
char oidbuf[OIDCHARS + 1];
- char srcpath[MAXPGPATH];
+ char srcpath[MAXPGPATH * 2];
char dstpath[MAXPGPATH];
/* Skip anything that doesn't look like a relation data file. */
diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c
index b65b63b721..387849e22c 100644
--- a/src/backend/storage/ipc/dsm.c
+++ b/src/backend/storage/ipc/dsm.c
@@ -307,9 +307,9 @@ dsm_cleanup_for_mmap(void)
if (strncmp(dent->d_name, PG_DYNSHMEM_MMAP_FILE_PREFIX,
strlen(PG_DYNSHMEM_MMAP_FILE_PREFIX)) == 0)
{
- char buf[MAXPGPATH];
+ char buf[MAXPGPATH + sizeof(PG_DYNSHMEM_DIR)];
- snprintf(buf, MAXPGPATH, PG_DYNSHMEM_DIR "/%s", dent->d_name);
+ snprintf(buf, sizeof(buf), PG_DYNSHMEM_DIR "/%s", dent->d_name);
elog(DEBUG2, "removing file \"%s\"", buf);
diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c
index 6d56638208..b0418b18dc 100644
--- a/src/backend/utils/adt/dbsize.c
+++ b/src/backend/utils/adt/dbsize.c
@@ -41,7 +41,7 @@ db_dir_size(const char *path)
int64 dirsize = 0;
struct dirent *direntry;
DIR *dirdesc;
- char filename[MAXPGPATH];
+ char filename[MAXPGPATH * 2];
dirdesc = AllocateDir(path);
@@ -58,7 +58,7 @@ db_dir_size(const char *path)
strcmp(direntry->d_name, "..") == 0)
continue;
- snprintf(filename, MAXPGPATH, "%s/%s", path, direntry->d_name);
+ snprintf(filename, sizeof(filename), "%s/%s", path, direntry->d_name);
if (stat(filename, &fst) < 0)
{
@@ -86,7 +86,7 @@ calculate_database_size(Oid dbOid)
DIR *dirdesc;
struct dirent *direntry;
char dirpath[MAXPGPATH];
- char pathname[MAXPGPATH];
+ char pathname[MAXPGPATH + 12 + sizeof(TABLESPACE_VERSION_DIRECTORY)];
AclResult aclresult;
/*
@@ -104,7 +104,7 @@ calculate_database_size(Oid dbOid)
/* Shared storage in pg_global is not counted */
/* Include pg_default storage */
- snprintf(pathname, MAXPGPATH, "base/%u", dbOid);
+ snprintf(pathname, sizeof(pathname), "base/%u", dbOid);
totalsize = db_dir_size(pathname);
/* Scan the non-default tablespaces */
@@ -124,7 +124,7 @@ calculate_database_size(Oid dbOid)
strcmp(direntry->d_name, "..") == 0)
continue;
- snprintf(pathname, MAXPGPATH, "pg_tblspc/%s/%s/%u",
+ snprintf(pathname, sizeof(pathname), "pg_tblspc/%s/%s/%u",
direntry->d_name, TABLESPACE_VERSION_DIRECTORY, dbOid);
totalsize += db_dir_size(pathname);
}
@@ -172,7 +172,7 @@ static int64
calculate_tablespace_size(Oid tblspcOid)
{
char tblspcPath[MAXPGPATH];
- char pathname[MAXPGPATH];
+ char pathname[MAXPGPATH * 2];
int64 totalsize = 0;
DIR *dirdesc;
struct dirent *direntry;
@@ -215,7 +215,7 @@ calculate_tablespace_size(Oid tblspcOid)
strcmp(direntry->d_name, "..") == 0)
continue;
- snprintf(pathname, MAXPGPATH, "%s/%s", tblspcPath, direntry->d_name);
+ snprintf(pathname, sizeof(pathname), "%s/%s", tblspcPath, direntry->d_name);
if (stat(pathname, &fst) < 0)
{
diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c
index 8d0a236e6d..32d6a66688 100644
--- a/src/backend/utils/adt/genfile.c
+++ b/src/backend/utils/adt/genfile.c
@@ -522,7 +522,7 @@ pg_ls_dir_files(FunctionCallInfo fcinfo, char *dir)
{
Datum values[3];
bool nulls[3];
- char path[MAXPGPATH];
+ char path[MAXPGPATH * 2];
struct stat attrib;
HeapTuple tuple;
@@ -531,7 +531,7 @@ pg_ls_dir_files(FunctionCallInfo fcinfo, char *dir)
continue;
/* Get the file info */
- snprintf(path, MAXPGPATH, "%s/%s", fctx->location, de->d_name);
+ snprintf(path, sizeof(path), "%s/%s", fctx->location, de->d_name);
if (stat(path, &attrib) < 0)
ereport(ERROR,
(errcode_for_file_access(),
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index ddb948528b..5bf02d4c0e 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -6074,7 +6074,7 @@ RelationCacheInitFileRemove(void)
const char *tblspcdir = "pg_tblspc";
DIR *dir;
struct dirent *de;
- char path[MAXPGPATH];
+ char path[MAXPGPATH + 10 + sizeof(TABLESPACE_VERSION_DIRECTORY)];
/*
* We zap the shared cache file too. In theory it can't get out of sync
@@ -6116,7 +6116,7 @@ RelationCacheInitFileRemoveInDir(const char *tblspcpath)
{
DIR *dir;
struct dirent *de;
- char initfilename[MAXPGPATH];
+ char initfilename[MAXPGPATH * 2];
/* Scan the tablespace directory to find per-database directories */
dir = AllocateDir(tblspcpath);
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 6e83cbedab..5169714817 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -2228,7 +2228,7 @@ static void
setup_formatted_log_time(void)
{
pg_time_t stamp_time;
- char msbuf[8];
+ char msbuf[10];
if (!saved_timeval_set)
{
diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c
index 3d92494e0b..3a3a25a0c3 100644
--- a/src/backend/utils/time/snapmgr.c
+++ b/src/backend/utils/time/snapmgr.c
@@ -1578,7 +1578,7 @@ XactHasExportedSnapshots(void)
void
DeleteAllExportedSnapshotFiles(void)
{
- char buf[MAXPGPATH];
+ char buf[MAXPGPATH + sizeof(SNAPSHOT_EXPORT_DIR)];
DIR *s_dir;
struct dirent *s_de;
@@ -1599,7 +1599,7 @@ DeleteAllExportedSnapshotFiles(void)
strcmp(s_de->d_name, "..") == 0)
continue;
- snprintf(buf, MAXPGPATH, SNAPSHOT_EXPORT_DIR "/%s", s_de->d_name);
+ snprintf(buf, sizeof(buf), SNAPSHOT_EXPORT_DIR "/%s", s_de->d_name);
/* Again, unlink failure is not worthy of FATAL */
if (unlink(buf))
elog(LOG, "could not unlink file \"%s\": %m", buf);
diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c
index f1651d4273..1760955586 100644
--- a/src/bin/pg_archivecleanup/pg_archivecleanup.c
+++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c
@@ -32,7 +32,7 @@ char *additional_ext = NULL; /* Extension to remove from filenames */
char *archiveLocation; /* where to find the archive? */
char *restartWALFileName; /* the file from which we can restart restore */
-char WALFilePath[MAXPGPATH]; /* the file path including archive */
+char WALFilePath[MAXPGPATH * 2]; /* the file path including archive */
char exclusiveCleanupFileName[MAXFNAMELEN]; /* the oldest file we
* want to remain in
* archive */
@@ -133,7 +133,7 @@ CleanupPriorWALFiles(void)
* extension that might have been chopped off before testing
* the sequence.
*/
- snprintf(WALFilePath, MAXPGPATH, "%s/%s",
+ snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s",
archiveLocation, xlde->d_name);
if (dryrun)
diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c
index 15348ada58..1a9fe81be1 100644
--- a/src/bin/pg_basebackup/pg_receivewal.c
+++ b/src/bin/pg_basebackup/pg_receivewal.c
@@ -244,7 +244,7 @@ FindStreamingStart(uint32 *tli)
if (!ispartial && !iscompress)
{
struct stat statbuf;
- char fullpath[MAXPGPATH];
+ char fullpath[MAXPGPATH * 2];
snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
if (stat(fullpath, &statbuf) != 0)
@@ -267,7 +267,7 @@ FindStreamingStart(uint32 *tli)
int fd;
char buf[4];
int bytes_out;
- char fullpath[MAXPGPATH];
+ char fullpath[MAXPGPATH * 2];
snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c
index bcb9ed938f..73bd9fe6ec 100644
--- a/src/bin/pg_resetwal/pg_resetwal.c
+++ b/src/bin/pg_resetwal/pg_resetwal.c
@@ -958,7 +958,7 @@ KillExistingXLOG(void)
{
DIR *xldir;
struct dirent *xlde;
- char path[MAXPGPATH];
+ char path[MAXPGPATH + sizeof(XLOGDIR)];
xldir = opendir(XLOGDIR);
if (xldir == NULL)
@@ -973,7 +973,7 @@ KillExistingXLOG(void)
if (IsXLogFileName(xlde->d_name) ||
IsPartialXLogFileName(xlde->d_name))
{
- snprintf(path, MAXPGPATH, "%s/%s", XLOGDIR, xlde->d_name);
+ snprintf(path, sizeof(path), "%s/%s", XLOGDIR, xlde->d_name);
if (unlink(path) < 0)
{
fprintf(stderr, _("%s: could not delete file \"%s\": %s\n"),
@@ -1005,11 +1005,11 @@ KillExistingXLOG(void)
static void
KillExistingArchiveStatus(void)
{
+#define ARCHSTATDIR XLOGDIR "/archive_status"
+
DIR *xldir;
struct dirent *xlde;
- char path[MAXPGPATH];
-
-#define ARCHSTATDIR XLOGDIR "/archive_status"
+ char path[MAXPGPATH + sizeof(ARCHSTATDIR)];
xldir = opendir(ARCHSTATDIR);
if (xldir == NULL)
@@ -1027,7 +1027,7 @@ KillExistingArchiveStatus(void)
strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.ready") == 0 ||
strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.done") == 0))
{
- snprintf(path, MAXPGPATH, "%s/%s", ARCHSTATDIR, xlde->d_name);
+ snprintf(path, sizeof(path), "%s/%s", ARCHSTATDIR, xlde->d_name);
if (unlink(path) < 0)
{
fprintf(stderr, _("%s: could not delete file \"%s\": %s\n"),
diff --git a/src/bin/pg_rewind/copy_fetch.c b/src/bin/pg_rewind/copy_fetch.c
index f8d3dfecfa..347d4e4d4c 100644
--- a/src/bin/pg_rewind/copy_fetch.c
+++ b/src/bin/pg_rewind/copy_fetch.c
@@ -65,14 +65,14 @@ recurse_dir(const char *datadir, const char *parentpath,
while (errno = 0, (xlde = readdir(xldir)) != NULL)
{
struct stat fst;
- char fullpath[MAXPGPATH];
- char path[MAXPGPATH];
+ char fullpath[MAXPGPATH * 2];
+ char path[MAXPGPATH * 2];
if (strcmp(xlde->d_name, ".") == 0 ||
strcmp(xlde->d_name, "..") == 0)
continue;
- snprintf(fullpath, MAXPGPATH, "%s/%s", fullparentpath, xlde->d_name);
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", fullparentpath, xlde->d_name);
if (lstat(fullpath, &fst) < 0)
{
@@ -93,9 +93,9 @@ recurse_dir(const char *datadir, const char *parentpath,
}
if (parentpath)
- snprintf(path, MAXPGPATH, "%s/%s", parentpath, xlde->d_name);
+ snprintf(path, sizeof(path), "%s/%s", parentpath, xlde->d_name);
else
- snprintf(path, MAXPGPATH, "%s", xlde->d_name);
+ snprintf(path, sizeof(path), "%s", xlde->d_name);
if (S_ISREG(fst.st_mode))
callback(path, FILE_TYPE_REGULAR, fst.st_size, NULL);
diff --git a/src/common/file_utils.c b/src/common/file_utils.c
index 72b0565c71..218b83f391 100644
--- a/src/common/file_utils.c
+++ b/src/common/file_utils.c
@@ -166,7 +166,7 @@ walkdir(const char *path,
while (errno = 0, (de = readdir(dir)) != NULL)
{
- char subpath[MAXPGPATH];
+ char subpath[MAXPGPATH * 2];
struct stat fst;
int sret;
@@ -174,7 +174,7 @@ walkdir(const char *path,
strcmp(de->d_name, "..") == 0)
continue;
- snprintf(subpath, MAXPGPATH, "%s/%s", path, de->d_name);
+ snprintf(subpath, sizeof(subpath), "%s/%s", path, de->d_name);
if (process_symlinks)
sret = stat(subpath, &fst);
diff --git a/src/timezone/pgtz.c b/src/timezone/pgtz.c
index 826857d943..b7cfc5f5ac 100644
--- a/src/timezone/pgtz.c
+++ b/src/timezone/pgtz.c
@@ -412,7 +412,7 @@ pg_tzenumerate_next(pg_tzenum *dir)
while (dir->depth >= 0)
{
struct dirent *direntry;
- char fullname[MAXPGPATH];
+ char fullname[MAXPGPATH * 2];
struct stat statbuf;
direntry = ReadDir(dir->dirdesc[dir->depth], dir->dirname[dir->depth]);
@@ -429,7 +429,7 @@ pg_tzenumerate_next(pg_tzenum *dir)
if (direntry->d_name[0] == '.')
continue;
- snprintf(fullname, MAXPGPATH, "%s/%s",
+ snprintf(fullname, sizeof(fullname), "%s/%s",
dir->dirname[dir->depth], direntry->d_name);
if (stat(fullname, &statbuf) != 0)
ereport(ERROR,
--
2.12.2
Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:
Attached is a more refined patch that I propose for PG10 now. Compared
to the previous rushed version, this one uses some more precise
arithmetic to size some of the buffers.
Generally +1 for switching the snprintf calls to use sizeof() rather
than repeating the declared sizes of the arrays.
The change in setup_formatted_log_time seems a bit weird:
- char msbuf[8];
+ char msbuf[10];
The associated call is
sprintf(msbuf, ".%03d", (int) (saved_timeval.tv_usec / 1000));
Now a human can see that saved_timeval.tv_usec must be 0..999999, so
that the %d format item must always emit exactly 3 characters, which
means that really 5 bytes would be enough. I wouldn't expect a
compiler to know that, but if it's making a generic assumption about
the worst-case width of %d, shouldn't it conclude that we might need
as many as 13 bytes for the buffer? Why does msbuf[10] satisfy it
if msbuf[8] doesn't?
IOW, if we're going to touch this at all, I'd be inclined to go with
msbuf[16] or so, as being more likely to satisfy compilers that have
decided to try to warn about this. And maybe we should use snprintf,
just for luck.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 4/12/17 00:12, Tom Lane wrote:
The change in setup_formatted_log_time seems a bit weird:
- char msbuf[8]; + char msbuf[10];The associated call is
sprintf(msbuf, ".%03d", (int) (saved_timeval.tv_usec / 1000));
Now a human can see that saved_timeval.tv_usec must be 0..999999, so
that the %d format item must always emit exactly 3 characters, which
means that really 5 bytes would be enough. I wouldn't expect a
compiler to know that, but if it's making a generic assumption about
the worst-case width of %d, shouldn't it conclude that we might need
as many as 13 bytes for the buffer? Why does msbuf[10] satisfy it
if msbuf[8] doesn't?
Because the /1000 takes off three digits?
The full message from an isolated test case is
test.c: In function 'f':
test.c:11:15: warning: '%03d' directive writing between 3 and 8 bytes
into a region of size 7 [-Wformat-overflow=]
sprintf(buf, ".%03d", (int) (tv.tv_usec / 1000));
^
test.c:11:15: note: directive argument in the range [-2147483, 2147483]
test.c:11:2: note: '__builtin___sprintf_chk' output between 5 and 10
bytes into a destination of size 8
sprintf(buf, ".%03d", (int) (tv.tv_usec / 1000));
^
(This is with -O2. With -O0 it only asks for 5 bytes.)
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:
On 4/12/17 00:12, Tom Lane wrote:
Now a human can see that saved_timeval.tv_usec must be 0..999999, so
that the %d format item must always emit exactly 3 characters, which
means that really 5 bytes would be enough. I wouldn't expect a
compiler to know that, but if it's making a generic assumption about
the worst-case width of %d, shouldn't it conclude that we might need
as many as 13 bytes for the buffer? Why does msbuf[10] satisfy it
if msbuf[8] doesn't?
Because the /1000 takes off three digits?
Huh ... I would not really have expected it to figure that out, but
this makes it pretty clear that it did:
test.c:11:15: note: directive argument in the range [-2147483, 2147483]
(This is with -O2. With -O0 it only asks for 5 bytes.)
But that reinforces my suspicion that the intelligence brought to bear
here will be variable. I'd still go for msbuf[16]; it's not like
anybody's going to notice the extra stack consumption.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 4/10/17 11:03, Peter Eisentraut wrote:
The release of GCC 7 is approaching [0], and the number of warnings in
PostgreSQL has gone up since we last looked [1]. Output attached. (My
version is 7.0.1 20170408.)
GCC 7 has been released.
Should we backpatch these warning fixes? The commit in question is
6275f5d28a1577563f53f2171689d4f890a46881. (I haven't actually checked
whether backpatches well.)
PG 9.2 and newer compile warning-free with GCC 6, so there would be some
value in preserving this with GCC 7.
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:
On 4/10/17 11:03, Peter Eisentraut wrote:
The release of GCC 7 is approaching [0], and the number of warnings in
PostgreSQL has gone up since we last looked [1]. Output attached. (My
version is 7.0.1 20170408.)
GCC 7 has been released.
Should we backpatch these warning fixes? The commit in question is
6275f5d28a1577563f53f2171689d4f890a46881. (I haven't actually checked
whether backpatches well.)
Seems like that patch represents generally better coding practice,
and applying it would reduce cross-branch differences that would be
hazards for future patches, so I'm mostly +1 for this.
But I'd suggest waiting till after next week's releases. If there
are any problems induced by this, we'd be more likely to find them
with another three months' time before it hits the wild.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 5/4/17 00:21, Tom Lane wrote:
But I'd suggest waiting till after next week's releases. If there
are any problems induced by this, we'd be more likely to find them
with another three months' time before it hits the wild.
done
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers