--- linux/fs/dcache.c.orig Mon Feb 25 20:38:08 2002 +++ linux/fs/dcache.c Mon Apr 1 04:16:45 2002 @@ -976,14 +976,17 @@ parent = dentry->d_parent; namelen = dentry->d_name.len; buflen -= namelen + 1; - if (buflen < 0) - break; + if (buflen < 0){ + retval = ERR_PTR(-ENAMETOOLONG); + goto out; + } end -= namelen; memcpy(end, dentry->d_name.name, namelen); *--end = '/'; retval = end; dentry = parent; } +out: return retval; global_root: namelen = dentry->d_name.len; @@ -992,6 +995,8 @@ retval -= namelen-1; /* hit the slash */ memcpy(retval, dentry->d_name.name, namelen); } + else + retval = ERR_PTR(-ENAMETOOLONG); return retval; } @@ -1041,8 +1046,11 @@ spin_unlock(&dcache_lock); error = -ERANGE; + + if (cwd == ERR_PTR(-ENAMETOOLONG)) error = -ENAMETOOLONG; + len = PAGE_SIZE + page - cwd; - if (len <= size) { + if (len <= size && error != -ENAMETOOLONG) { error = len; if (copy_to_user(buf, cwd, len)) error = -EFAULT;