devkitPro / libfat

FAT library for GBA, DS, Gamecube & Wii
http://devkitpro.org/viewforum.php?f=24
54 stars 36 forks source link

ENOTDIR vs ENOENT for invalid path prefix #6

Open FrankHB opened 8 years ago

FrankHB commented 8 years ago

Some POSIX functions (e.g. open, unlink, opendir, mkdir) requires setting errno to ENOTDIR rather than ENOENT when "a component of the path prefix names an existing file that is neither a directory nor a symbolic link to a directory". They are implemented by function _FAT_directory_entryFromPath in libfat, which does not provide right information to distinguish the accurate errors:

                if (found && !(entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) && (nextPathPosition != NULL)) {
                    // Make sure that we aren't trying to follow a file instead of a directory in the path
                    found = false;
                }

Note that the implementation like _FAT_open_r is not sufficient, because it only tests the last component (not prefix) of the path:

                if (!_FAT_directory_entryFromPath (partition, &dirEntry, path, pathEnd) ||
                    !_FAT_directory_isDirectory(&dirEntry)) {
                    _FAT_unlock(&partition->lock);
                    r->_errno = ENOTDIR;
                    return -1;
                }