__dentry_path() fixes
* we need to save the starting point for restarts * reject pathologically short buffers outright Spotted-by: Denys Vlasenko <dvlasenk@redhat.com> Spotted-by: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
a8323da036
commit
f650080152
@ -3116,19 +3116,22 @@ char *simple_dname(struct dentry *dentry, char *buffer, int buflen)
|
|||||||
/*
|
/*
|
||||||
* Write full pathname from the root of the filesystem into the buffer.
|
* Write full pathname from the root of the filesystem into the buffer.
|
||||||
*/
|
*/
|
||||||
static char *__dentry_path(struct dentry *dentry, char *buf, int buflen)
|
static char *__dentry_path(struct dentry *d, char *buf, int buflen)
|
||||||
{
|
{
|
||||||
|
struct dentry *dentry;
|
||||||
char *end, *retval;
|
char *end, *retval;
|
||||||
int len, seq = 0;
|
int len, seq = 0;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
|
if (buflen < 2)
|
||||||
|
goto Elong;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
restart:
|
restart:
|
||||||
|
dentry = d;
|
||||||
end = buf + buflen;
|
end = buf + buflen;
|
||||||
len = buflen;
|
len = buflen;
|
||||||
prepend(&end, &len, "\0", 1);
|
prepend(&end, &len, "\0", 1);
|
||||||
if (buflen < 1)
|
|
||||||
goto Elong;
|
|
||||||
/* Get '/' right */
|
/* Get '/' right */
|
||||||
retval = end-1;
|
retval = end-1;
|
||||||
*retval = '/';
|
*retval = '/';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user