From: <jfa...@us...> - 2010-01-03 16:14:59
|
Revision: 5470 http://oorexx.svn.sourceforge.net/oorexx/?rev=5470&view=rev Author: jfaucher Date: 2010-01-03 16:14:47 +0000 (Sun, 03 Jan 2010) Log Message: ----------- AutoClose was not used correctly when closing files explicitely (double close) Modified Paths: -------------- main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp Modified: main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp =================================================================== --- main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp 2009-12-31 19:47:53 UTC (rev 5469) +++ main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp 2010-01-03 16:14:47 UTC (rev 5470) @@ -5086,16 +5086,38 @@ class AutoClose { public: - AutoClose() : value(0) {}; + AutoClose() : value(-1) {}; AutoClose(int fd) : value(fd) {} - ~AutoClose() { if (value > 0) close(value); value=0; } - AutoClose& operator=(int fd) { if (value > 0) close(value); value=fd; return *this; } + ~AutoClose() { close(false); } + AutoClose& operator=(int fd) { close(false); value=fd; return *this; } operator int() const { return value; } int operator==(int fd) { return value == fd; } + int close(bool returnError=true); private: - int value; // -1 if error, 0 if closed, other if still opened + int value; // >= 0 if opened }; +// Returns 0 if no error, -1 otherwise (in this case, errno contains the error code) +int AutoClose::close(bool returnError) +{ + int closeStatus = 0; + if (returnError) + { + if (value >= 0) closeStatus = ::close(value); + } + else + { + if (value >= 0) + { + int backup = errno; + ::close(value); + errno = backup; + } + } + value = -1; + return closeStatus; +} + class AutoFree { public: @@ -5178,10 +5200,8 @@ if (write(toHandle, buffer, count) == -1) return errno; } - fromHandle = close(fromHandle); - if (fromHandle == -1) return errno; - toHandle = close(toHandle); - if (toHandle == -1) return errno; + if (fromHandle.close() == -1) return errno; + if (toHandle.close() == -1) return errno; if (preserveTimestamps) { @@ -5257,9 +5277,9 @@ else { if (toFileNewname != NULL && rename(toFile, toFileNewname) == -1) return errno; - if (CopyFile_DereferenceSymbolicLinks(fromFile, toFile, preserveTimestamps, preserveMode, timestampsPreserved, modePreserved) != 0) + int errInfo = CopyFile_DereferenceSymbolicLinks(fromFile, toFile, preserveTimestamps, preserveMode, timestampsPreserved, modePreserved); + if (errInfo != 0) { - int errInfo = errno; // Undo the renaming if (toFileNewname != NULL) rename(toFileNewname, toFile); return errInfo; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |