Description of problem: I just installed kernel-2.6.40.3-0.fc15.x86_64.rpm and I found that readlink on an empty path now sets errno to EINVAL. This is not POSIX compliant, man 3 readlink says that ENOENT should be put in errno if path is an empty string. Version-Release number of selected component (if applicable): How reproducible: #include <stdio.h> #include <unistd.h> #include <errno.h> int main() { char buffer[256]; ssize_t n; n=readlink("",buffer,256); perror("errno from readlink:"); if( errno != ENOENT) printf("n=%d errno=%d\n",n,errno); return 0; } Steps to Reproduce: 1. Compile 2. Run 3. Actual results: Invalid argument Expected results: No such file or directory Additional info: Until 2.6.38.8-35 readlink gave the correct errno. This is running readlink03 from ltp-full-20110606.
You should report this upstream.
Looks like this was caused by these two changes: http://git.kernel.org/linus/f52e0c11305aa09ed56cad97ffc8f0cdc3d78b5d http://git.kernel.org/linus/65cfc6722361570bfe255698d9cd4dccaf47570d Before the second change, if path was empty we immediately returned -ENOENT. Now we fall further into the filesystem code trying to look up the empty path and something there is returning -EINVAL.
The fix for this is now in the -mm tree: Subject: [stable] + readlinkat-ensure-we-return-enoent-for-the-empty-pathname-for-normal-lookups.patch added to -mm tree
The patch Chuck highlighted was included in the 3.1.1 release (2.6.41.1 in F15)