]> granicus.if.org Git - postgresql/commitdiff
Be more wary of unwanted whitespace in pgstat_reset_remove_files().
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 19 Aug 2013 23:36:06 +0000 (19:36 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 19 Aug 2013 23:36:06 +0000 (19:36 -0400)
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

index f42f1839c229c4be14d69c5de6f1cf0c64a3f59d..57176ef5a98469c0f26425c27c3267b67143695a 100644 (file)
@@ -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,