lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAO3qy=EnXgiYPFDPkksSzGAaYms2KpNgAb55S_=GryJCRyhg5A@mail.gmail.com>
Date:   Fri, 20 Jan 2017 19:53:42 +0300
From:   Artem Blagodarenko <artem.blagodarenko@...gate.com>
To:     linux-ext4@...r.kernel.org
Subject: [PATCH] debugfs: increase inode reference count after link

Inode reference count is not increased after debugfs link command.
This leads to inconsistent file system state. fsck can find such
inodes and can fix. There is right code in add_link() that:
1) create link
2) expand directory if needed
3) increase inode referance
This patch uses add_link() function for debug link command.
Automatic directory expanding is useful when many files
are created in the same directory.

Signed-off-by: Artem Blagodarenko <artem.blagodarenko@...gate.com>
---
 debugfs/debugfs.c     |    7 +------
 misc/create_inode.c   |    2 +-
 misc/create_inode.h   |    2 ++
 tests/f_dup4/expect.1 |    6 ------
 4 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
index 165f924..b40d9e2 100644
--- a/debugfs/debugfs.c
+++ b/debugfs/debugfs.c
@@ -1440,7 +1440,6 @@ void do_print_working_directory(int argc, char *argv[])
 static void make_link(char *sourcename, char *destname)
 {
     ext2_ino_t    ino;
-    struct ext2_inode inode;
     int        retval;
     ext2_ino_t    dir;
     char        *dest, *cp, *base_name;
@@ -1480,11 +1479,7 @@ static void make_link(char *sourcename, char *destname)
         }
     }

-    if (debugfs_read_inode(ino, &inode, sourcename))
-        return;
-
-    retval = ext2fs_link(current_fs, dir, dest, ino,
-                 ext2_file_type(inode.i_mode));
+    retval = add_link(current_fs, dir, ino, dest);
     if (retval)
         com_err("make_link", retval, 0);
     return;
diff --git a/misc/create_inode.c b/misc/create_inode.c
index ae22ff6..e2d80b4 100644
--- a/misc/create_inode.c
+++ b/misc/create_inode.c
@@ -59,7 +59,7 @@ static int ext2_file_type(unsigned int mode)
 }

 /* Link an inode number to a directory */
-static errcode_t add_link(ext2_filsys fs, ext2_ino_t parent_ino,
+errcode_t add_link(ext2_filsys fs, ext2_ino_t parent_ino,
               ext2_ino_t ino, const char *name)
 {
     struct ext2_inode    inode;
diff --git a/misc/create_inode.h b/misc/create_inode.h
index cf49df2..9c787ab 100644
--- a/misc/create_inode.h
+++ b/misc/create_inode.h
@@ -37,5 +37,7 @@ extern errcode_t do_mkdir_internal(ext2_filsys fs,
ext2_ino_t cwd,
 extern errcode_t do_write_internal(ext2_filsys fs, ext2_ino_t cwd,
                    const char *src, const char *dest,
                    ext2_ino_t root);
+extern errcode_t add_link(ext2_filsys fs, ext2_ino_t parent_ino,
+              ext2_ino_t ino, const char *name);

 #endif /* _CREATE_INODE_H */
diff --git a/tests/f_dup4/expect.1 b/tests/f_dup4/expect.1
index 7d51bb1..9fec126 100644
--- a/tests/f_dup4/expect.1
+++ b/tests/f_dup4/expect.1
@@ -99,12 +99,6 @@ Inode 14 ref count is 4, should be 3.  Fix? yes

 Inode 15 ref count is 0, should be 3.  Fix? yes

-Inode 16 ref count is 1, should be 3.  Fix? yes
-
-Inode 17 ref count is 1, should be 2.  Fix? yes
-
-Inode 19 ref count is 1, should be 3.  Fix? yes
-
 Pass 5: Checking group summary information

 test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
--
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ