diff options
author | Tom Lane | 2013-08-19 23:36:06 +0000 |
---|---|---|
committer | Tom Lane | 2013-08-19 23:36:06 +0000 |
commit | 59bc4a43ec588d25fe976774bd1194f1b90251fa (patch) | |
tree | 7f15bcf012365ecf84b414d9e4aba1f30601c840 | |
parent | db5b49cdd4f481828b227f03b373fbc9bde4301a (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.c | 30 |
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, |