| Summary: | readlink on empty path is not POSIX compliant anymore | ||
|---|---|---|---|
| Product: | [Fedora] Fedora | Reporter: | Vittorio <vitti570> |
| Component: | kernel | Assignee: | Kernel Maintainer List <kernel-maint> |
| Status: | CLOSED ERRATA | QA Contact: | Fedora Extras Quality Assurance <extras-qa> |
| Severity: | low | Docs Contact: | |
| Priority: | unspecified | ||
| Version: | 15 | CC: | gansalmon, itamar, jonathan, kernel-maint, madhu.chinakonda, vitti570 |
| Target Milestone: | --- | ||
| Target Release: | --- | ||
| Hardware: | x86_64 | ||
| OS: | Linux | ||
| Whiteboard: | |||
| Fixed In Version: | Doc Type: | Bug Fix | |
| Doc Text: | Story Points: | --- | |
| Clone Of: | Environment: | ||
| Last Closed: | 2011-11-29 20:28:44 UTC | Type: | --- |
| Regression: | --- | Mount Type: | --- |
| Documentation: | --- | CRM: | |
| Verified Versions: | Category: | --- | |
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
| Cloudforms Team: | --- | Target Upstream Version: | |
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) |
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.