From 59bc4a43ec588d25fe976774bd1194f1b90251fa Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 19 Aug 2013 19:36:06 -0400 Subject: [PATCH] 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. --- src/backend/postmaster/pgstat.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index f42f1839c2..57176ef5a9 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, -- 2.40.0