From 4dd566c291461f3c985d13dc04a0f4fba32bbd90 Mon Sep 17 00:00:00 2001 From: Andrew Hanushevsky Date: Fri, 21 Apr 2017 15:11:58 -0700 Subject: [PATCH] [Proxy Server] Avoid SEGV when close(), closedir() returns an error. --- src/XrdPss/XrdPss.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/XrdPss/XrdPss.cc b/src/XrdPss/XrdPss.cc index afdf2ccf2df..4f9e5c3e58b 100644 --- a/src/XrdPss/XrdPss.cc +++ b/src/XrdPss/XrdPss.cc @@ -608,12 +608,14 @@ int XrdPssDir::Readdir(char *buff, int blen) */ int XrdPssDir::Close(long long *retsz) { + DIR *theDir; -// Close the directory proper if it exists +// Close the directory proper if it exists. POSIX specified that directory +// stream is no longer available after closedir() regardless if return value. // - if (myDir) - {if (XrdPosixXrootd::Closedir(myDir)) return -errno; - myDir = 0; + if ((theDir = myDir)) + {myDir = 0; + if (XrdPosixXrootd::Closedir(theDir)) return -errno; return XrdOssOK; } @@ -697,12 +699,13 @@ int XrdPssFile::Open(const char *path, int Oflag, mode_t Mode, XrdOucEnv &Env) Output: Returns XrdOssOK upon success aud -errno upon failure. */ int XrdPssFile::Close(long long *retsz) -{ - if (fd < 0) return -XRDOSS_E8004; +{ int rc; + if (retsz) *retsz = 0; - if (XrdPosixXrootd::Close(fd)) return -errno; + if (fd < 0) return -XRDOSS_E8004; + rc = XrdPosixXrootd::Close(fd); fd = -1; - return XrdOssOK; + return (rc == 0 ? XrdOssOK : -errno); } /******************************************************************************/