Fix memory leak in VMS's readdir().
authorCraig A. Berry <craigberry@mac.com>
Sat, 1 Dec 2012 03:20:47 +0000 (21:20 -0600)
committerCraig A. Berry <craigberry@mac.com>
Sat, 1 Dec 2012 03:46:45 +0000 (21:46 -0600)
When we got to the end of a directory we were not freeing the
buffer we'd been using.  So refactor that section of code to have
only one return.  Bug introduced in 657054d4f860463a01c5.

vms/vms.c

index b847ab0..6ff851f 100644 (file)
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -10103,20 +10103,23 @@ Perl_readdir(pTHX_ DIR *dd)
 
     tmpsts = lib$find_file
        (&dd->pat, &res, &dd->context, NULL, NULL, &rsts, &flags);
-    if ( tmpsts == RMS$_NMF || dd->context == 0) return NULL;  /* None left. */
+    if (dd->context == 0)
+        tmpsts = RMS$_NMF;  /* None left. (should be set, but make sure) */
+
     if (!(tmpsts & 1)) {
-      set_vaxc_errno(tmpsts);
       switch (tmpsts) {
+        case RMS$_NMF:
+          break;  /* no more files considered success */
         case RMS$_PRV:
-          set_errno(EACCES); break;
+          SETERRNO(EACCES, tmpsts); break;
         case RMS$_DEV:
-          set_errno(ENODEV); break;
+          SETERRNO(ENODEV, tmpsts); break;
         case RMS$_DIR:
-          set_errno(ENOTDIR); break;
+          SETERRNO(ENOTDIR, tmpsts); break;
         case RMS$_FNF: case RMS$_DNF:
-          set_errno(ENOENT); break;
+          SETERRNO(ENOENT, tmpsts); break;
         default:
-          set_errno(EVMSERR);
+          SETERRNO(EVMSERR, tmpsts);
       }
       Safefree(buff);
       return NULL;