URL: <http://savannah.gnu.org/bugs/?35671>
Summary: Wrong error from -[NSFileManager createDirectoryAtPath:...] Project: GNUstep Submitted by: snej Submitted on: Wed 29 Feb 2012 08:07:47 PM GMT Category: None Severity: 3 - Normal Item Group: None Status: None Privacy: Public Assigned to: None Open/Closed: Open Discussion Lock: Any _______________________________________________________ Details: Calling -[NSFileManager createDirectoryAtPath: withIntermediateDirectories: attributes: error:] with an already-existing directory whose path is (at least?) two levels deep, returns the wrong error code. The output NSError has code 2 (ENOENT), when it should be EEXIST. (It may be possible for other incorrect error codes to be returned too.) STEPS TO REPRODUCE $ mkdir /tmp/foobar NSError* error = nil; [[NSFIleManager defaultManager] createDirectoryAtPath: @"/tmp/foobar" withIntermediateDirectories: NO attributes: nil error: &error]; NSAssert(error.code == EEXIST, @"Wrong error %@", error); DIAGNOSIS The above method calls the older method -createDirectoryAtPath:attributes:, and if that fails it calls -[NSError _lastError] to generate the NSError to be returned. This assumes the relevant error code is contained in errno. However, in the case where the directory already exists, the older method returns NO after a successful stat() call, so errno never actually gets set to EEXIST. Instead the value from the previous error (whatever that was) is left behind. The best fix appears to be to manually set errno=EEXIST in this situation. (See patch below.) There may be other code paths in that method that have similar issues; I haven't checked. CONFIGURATION URL: http://svn.gna.org/svn/gnustep/libs/base/trunk/Source Repository Root: http://svn.gna.org/svn/gnustep Repository UUID: 72102866-910b-0410-8b05-ffd578937521 Revision: 34837 My OS is Ubuntu 11 (current according to software update). I'm compiling with Clang 3.1 (trunk 151546). PATCH Index: NSFileManager.m =================================================================== --- NSFileManager.m (revision 34837) +++ NSFileManager.m (working copy) @@ -854,6 +854,7 @@ { ASSIGN(_lastError, @"Could not create directory - already exists"); + errno = EEXIST; return NO; } } _______________________________________________________ Reply to this item at: <http://savannah.gnu.org/bugs/?35671> _______________________________________________ Message sent via/by Savannah http://savannah.gnu.org/ _______________________________________________ Bug-gnustep mailing list Bug-gnustep@gnu.org https://lists.gnu.org/mailman/listinfo/bug-gnustep