Bug 732304

Summary: readlink on empty path is not POSIX compliant anymore
Product: [Fedora] Fedora Reporter: Vittorio <vitti570>
Component: kernelAssignee: Kernel Maintainer List <kernel-maint>
Status: CLOSED ERRATA QA Contact: Fedora Extras Quality Assurance <extras-qa>
Severity: low Docs Contact:
Priority: unspecified    
Version: 15CC: 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:
Embargoed:

Description Vittorio 2011-08-21 19:49:41 UTC
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.

Comment 1 Josh Boyer 2011-08-21 21:01:07 UTC
You should report this upstream.

Comment 2 Chuck Ebbert 2011-08-22 16:33:52 UTC
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.

Comment 3 Chuck Ebbert 2011-08-25 01:12:56 UTC
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

Comment 4 Josh Boyer 2011-11-29 20:28:44 UTC
The patch Chuck highlighted was included in the 3.1.1 release (2.6.41.1 in F15)