]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
File_Rotate: Optimize FileRotateByRenumber performance
authorJohn Wolfe <jwolfe@vmware.com>
Fri, 22 Jan 2021 20:25:41 +0000 (12:25 -0800)
committerJohn Wolfe <jwolfe@vmware.com>
Fri, 22 Jan 2021 20:25:41 +0000 (12:25 -0800)
open-vm-tools/lib/file/file.c

index a0707b8ddb7194ee41389883c1512a9436a1e747..bc6670245e76e1c116d2ce2b2d389761c456f9d4 100644 (file)
@@ -2441,6 +2441,8 @@ FileRotateByRenumber(const char *filePath,       // IN: full path to file
    char *tmp;
    int result;
    int nrFiles;
+   size_t extLen;
+   size_t baseNameLen;
    uint32 maxNr = 0;
    uint32 nFound = 0;
    char *baseDir = NULL;
@@ -2473,6 +2475,8 @@ FileRotateByRenumber(const char *filePath,       // IN: full path to file
       goto cleanup;
    }
 
+   baseNameLen = strlen(baseName);
+
    nrFiles = File_ListDirectory(baseDir, &fileList);
    if (nrFiles == -1) {
       Log(LGPFX" %s: failed to read the directory '%s'.\n", __FUNCTION__,
@@ -2487,39 +2491,32 @@ FileRotateByRenumber(const char *filePath,       // IN: full path to file
     * including in the list to be considered.
     */
 
-   for (i = 0; i < nrFiles; i++) {
-      if (StrUtil_StartsWith(fileList[i], baseName) &&
-          StrUtil_EndsWith(fileList[i], ext) &&
-          fileList[i][strlen(baseName)] == '-') {
-         uint32 curNr;
-         char *endNr = NULL;
-         size_t nrLen = strlen(fileList[i]) - strlen(baseName) - strlen(ext) - 1;
-         const char *nr = fileList[i] + strlen(baseName) + 1;
-
-         if (nrLen < 1) {  // Something must be present after the "-"
-            goto skip;
-         }
-
-         if (!isdigit(nr[0])) {  // "-' must immediately be followed by a digit
-            goto skip;
-         }
+   extLen = strlen(ext);
 
-         if (nr[0] == '0') {  // zero is invalid, as are leading zeros
-            goto skip;
-         }
-
-         errno = 0;
-         curNr = strtoul(nr, &endNr, 10);
-
-         if ((Err_Errno() != 0) ||     // out of range; vmware-1C.log
-             (endNr - nr != nrLen)) {
-            goto skip;
+   for (i = 0; i < nrFiles; i++) {
+      size_t fileNameLen = strlen(fileList[i]);
+
+      if ((fileNameLen >= (baseNameLen + 1 /* dash */ + 1 /* digit */ + extLen)) &&
+          (memcmp(fileList[i], baseName, baseNameLen) == 0) &&
+          (fileList[i][baseNameLen] == '-') &&
+          (memcmp(fileList[i] + fileNameLen - extLen, ext, extLen) == 0)) {
+         const char *nr = fileList[i] + baseNameLen + 1;
+
+         /* No leading zeros; zero is invalid; must be a valid ASCII digit */
+         if ((nr[0] >= '1') || (nr[0] <= '9')) {
+            uint32 curNr;
+            char *endNr = NULL;
+
+            errno = 0;
+            curNr = strtoul(nr, &endNr, 10);
+            if ((errno == 0) &&
+                (endNr == fileList[i] + fileNameLen - extLen) &&
+                (curNr <= MAX_UINT32)) {
+               fileNumbers[nFound++] = curNr;
+            }
          }
-
-         fileNumbers[nFound++] = curNr;
       }
 
-skip:
       Posix_Free(fileList[i]);
    }