summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2013-08-19 23:36:06 +0000
committerTom Lane2013-08-19 23:36:06 +0000
commit59bc4a43ec588d25fe976774bd1194f1b90251fa (patch)
tree7f15bcf012365ecf84b414d9e4aba1f30601c840
parentdb5b49cdd4f481828b227f03b373fbc9bde4301a (diff)
Be more wary of unwanted whitespace in pgstat_reset_remove_files().
sscanf isn't the easiest thing to use for exact pattern checks ... also, don't use strncmp where strcmp will do.
-rw-r--r--src/backend/postmaster/pgstat.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index f42f1839c22..57176ef5a98 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -565,31 +565,29 @@ pgstat_reset_remove_files(const char *directory)
dir = AllocateDir(directory);
while ((entry = ReadDir(dir, directory)) != NULL)
{
- int nitems;
- Oid tmp_oid;
- char tmp_type[8];
- char tmp_rest[2];
-
- if (strncmp(entry->d_name, ".", 2) == 0 ||
- strncmp(entry->d_name, "..", 3) == 0)
- continue;
+ int nchars;
+ Oid tmp_oid;
/*
* Skip directory entries that don't match the file names we write.
* See get_dbstat_filename for the database-specific pattern.
*/
- nitems = sscanf(entry->d_name, "db_%u.%5s%1s",
- &tmp_oid, tmp_type, tmp_rest);
- if (nitems != 2)
+ if (strncmp(entry->d_name, "global.", 7) == 0)
+ nchars = 7;
+ else
{
- nitems = sscanf(entry->d_name, "global.%5s%1s",
- tmp_type, tmp_rest);
- if (nitems != 1)
+ nchars = 0;
+ (void) sscanf(entry->d_name, "db_%u.%n",
+ &tmp_oid, &nchars);
+ if (nchars <= 0)
+ continue;
+ /* %u allows leading whitespace, so reject that */
+ if (strchr("0123456789", entry->d_name[3]) == NULL)
continue;
}
- if (strncmp(tmp_type, "tmp", 4) != 0 &&
- strncmp(tmp_type, "stat", 5) != 0)
+ if (strcmp(entry->d_name + nchars, "tmp") != 0 &&
+ strcmp(entry->d_name + nchars, "stat") != 0)
continue;
snprintf(fname, MAXPGPATH, "%s/%s", directory,