summaryrefslogtreecommitdiff
path: root/vms/vms.c
diff options
context:
space:
mode:
authorCraig A. Berry <craigberry@mac.com>2012-11-30 21:20:47 -0600
committerCraig A. Berry <craigberry@mac.com>2012-11-30 21:46:45 -0600
commit66facaa366b2bb9328ac16455b0b17db621a069d (patch)
tree4e37ad93980a0919b3fe50880ea89929142938f3 /vms/vms.c
parent2abb04977db87a1e49b7f84f7caf49109ee47b22 (diff)
downloadperl-66facaa366b2bb9328ac16455b0b17db621a069d.tar.gz
Fix memory leak in VMS's readdir().
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.
Diffstat (limited to 'vms/vms.c')
-rw-r--r--vms/vms.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/vms/vms.c b/vms/vms.c
index b847ab08c5..6ff851f2d1 100644
--- 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;