]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
f2fs: early check broken symlink length in the encrypted case
authorJaegeuk Kim <jaegeuk@kernel.org>
Fri, 25 Dec 2015 00:13:09 +0000 (16:13 -0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 30 Dec 2015 18:14:19 +0000 (10:14 -0800)
If link is broken, its len is zero, and we don't need to move forward.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/namei.c

index fb41c8082696411d82432cff9c9f79f097f927f6..6c4a94310b541c89081f227faa7d9706251499c7 100644 (file)
@@ -931,7 +931,7 @@ static const char *f2fs_encrypted_follow_link(struct dentry *dentry, void **cook
 {
        struct page *cpage = NULL;
        char *caddr, *paddr = NULL;
-       struct f2fs_str cstr;
+       struct f2fs_str cstr = FSTR_INIT(NULL, 0);
        struct f2fs_str pstr = FSTR_INIT(NULL, 0);
        struct inode *inode = d_inode(dentry);
        struct f2fs_encrypted_symlink_data *sd;
@@ -952,6 +952,12 @@ static const char *f2fs_encrypted_follow_link(struct dentry *dentry, void **cook
        /* Symlink is encrypted */
        sd = (struct f2fs_encrypted_symlink_data *)caddr;
        cstr.len = le16_to_cpu(sd->len);
+
+       /* this is broken symlink case */
+       if (unlikely(cstr.len == 0)) {
+               res = -ENOENT;
+               goto errout;
+       }
        cstr.name = kmalloc(cstr.len, GFP_NOFS);
        if (!cstr.name) {
                res = -ENOMEM;
@@ -960,7 +966,7 @@ static const char *f2fs_encrypted_follow_link(struct dentry *dentry, void **cook
        memcpy(cstr.name, sd->encrypted_path, cstr.len);
 
        /* this is broken symlink case */
-       if (cstr.name[0] == 0 && cstr.len == 0) {
+       if (unlikely(cstr.name[0] == 0)) {
                res = -ENOENT;
                goto errout;
        }