diff options
author | Craig A. Berry <craigberry@mac.com> | 2012-11-30 21:20:47 -0600 |
---|---|---|
committer | Craig A. Berry <craigberry@mac.com> | 2012-11-30 21:46:45 -0600 |
commit | 66facaa366b2bb9328ac16455b0b17db621a069d (patch) | |
tree | 4e37ad93980a0919b3fe50880ea89929142938f3 /vms/vms.c | |
parent | 2abb04977db87a1e49b7f84f7caf49109ee47b22 (diff) | |
download | perl-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.c | 17 |
1 files changed, 10 insertions, 7 deletions
@@ -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; |