From: Felix Fietkau Date: Sun, 4 Jul 2010 15:28:41 +0000 (+0000) Subject: mini_fo: add error pointer checks after dentry lookups to fix various crash bugs... X-Git-Tag: reboot~19478 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=3512ba10c03e976ddfa236f9dd35cc6dc089514e;p=oweals%2Fopenwrt.git mini_fo: add error pointer checks after dentry lookups to fix various crash bugs (fixes #7277, #7207, #7259) SVN-Revision: 22057 --- diff --git a/target/linux/generic/patches-2.6.32/217-mini_fo_dentry_check.patch b/target/linux/generic/patches-2.6.32/217-mini_fo_dentry_check.patch new file mode 100644 index 0000000000..cf53e4826f --- /dev/null +++ b/target/linux/generic/patches-2.6.32/217-mini_fo_dentry_check.patch @@ -0,0 +1,48 @@ +--- a/fs/mini_fo/meta.c ++++ b/fs/mini_fo/meta.c +@@ -48,6 +48,9 @@ int meta_build_lists(dentry_t *dentry) + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ goto out_ok; ++ + if(!meta_dentry->d_inode) { + dput(meta_dentry); + goto out_ok; +@@ -433,6 +436,8 @@ int meta_write_d_entry(dentry_t *dentry, + meta_dentry = lookup_one_len(META_FILENAME, + dtohd2(dentry), strlen (META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + /* We need to create a META-file */ + if(!meta_dentry->d_inode) { +@@ -538,6 +543,8 @@ int meta_write_r_entry(dentry_t *dentry, + dtohd2(dentry), + strlen (META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ +@@ -656,6 +663,8 @@ int meta_sync_d_list(dentry_t *dentry, i + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ +@@ -803,6 +812,8 @@ int meta_sync_r_list(dentry_t *dentry, i + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ diff --git a/target/linux/generic/patches-2.6.33/217-mini_fo_dentry_check.patch b/target/linux/generic/patches-2.6.33/217-mini_fo_dentry_check.patch new file mode 100644 index 0000000000..cf53e4826f --- /dev/null +++ b/target/linux/generic/patches-2.6.33/217-mini_fo_dentry_check.patch @@ -0,0 +1,48 @@ +--- a/fs/mini_fo/meta.c ++++ b/fs/mini_fo/meta.c +@@ -48,6 +48,9 @@ int meta_build_lists(dentry_t *dentry) + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ goto out_ok; ++ + if(!meta_dentry->d_inode) { + dput(meta_dentry); + goto out_ok; +@@ -433,6 +436,8 @@ int meta_write_d_entry(dentry_t *dentry, + meta_dentry = lookup_one_len(META_FILENAME, + dtohd2(dentry), strlen (META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + /* We need to create a META-file */ + if(!meta_dentry->d_inode) { +@@ -538,6 +543,8 @@ int meta_write_r_entry(dentry_t *dentry, + dtohd2(dentry), + strlen (META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ +@@ -656,6 +663,8 @@ int meta_sync_d_list(dentry_t *dentry, i + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ +@@ -803,6 +812,8 @@ int meta_sync_r_list(dentry_t *dentry, i + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ diff --git a/target/linux/generic/patches-2.6.34/217-mini_fo_dentry_check.patch b/target/linux/generic/patches-2.6.34/217-mini_fo_dentry_check.patch new file mode 100644 index 0000000000..cf53e4826f --- /dev/null +++ b/target/linux/generic/patches-2.6.34/217-mini_fo_dentry_check.patch @@ -0,0 +1,48 @@ +--- a/fs/mini_fo/meta.c ++++ b/fs/mini_fo/meta.c +@@ -48,6 +48,9 @@ int meta_build_lists(dentry_t *dentry) + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ goto out_ok; ++ + if(!meta_dentry->d_inode) { + dput(meta_dentry); + goto out_ok; +@@ -433,6 +436,8 @@ int meta_write_d_entry(dentry_t *dentry, + meta_dentry = lookup_one_len(META_FILENAME, + dtohd2(dentry), strlen (META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + /* We need to create a META-file */ + if(!meta_dentry->d_inode) { +@@ -538,6 +543,8 @@ int meta_write_r_entry(dentry_t *dentry, + dtohd2(dentry), + strlen (META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ +@@ -656,6 +663,8 @@ int meta_sync_d_list(dentry_t *dentry, i + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ +@@ -803,6 +812,8 @@ int meta_sync_r_list(dentry_t *dentry, i + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ diff --git a/target/linux/generic/patches-2.6.35/218-mini_fo_dentry_check.patch b/target/linux/generic/patches-2.6.35/218-mini_fo_dentry_check.patch new file mode 100644 index 0000000000..cf53e4826f --- /dev/null +++ b/target/linux/generic/patches-2.6.35/218-mini_fo_dentry_check.patch @@ -0,0 +1,48 @@ +--- a/fs/mini_fo/meta.c ++++ b/fs/mini_fo/meta.c +@@ -48,6 +48,9 @@ int meta_build_lists(dentry_t *dentry) + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ goto out_ok; ++ + if(!meta_dentry->d_inode) { + dput(meta_dentry); + goto out_ok; +@@ -433,6 +436,8 @@ int meta_write_d_entry(dentry_t *dentry, + meta_dentry = lookup_one_len(META_FILENAME, + dtohd2(dentry), strlen (META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + /* We need to create a META-file */ + if(!meta_dentry->d_inode) { +@@ -538,6 +543,8 @@ int meta_write_r_entry(dentry_t *dentry, + dtohd2(dentry), + strlen (META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ +@@ -656,6 +663,8 @@ int meta_sync_d_list(dentry_t *dentry, i + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */ +@@ -803,6 +812,8 @@ int meta_sync_r_list(dentry_t *dentry, i + dtohd2(dentry), + strlen(META_FILENAME)); + mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex); ++ if (IS_ERR(meta_dentry)) ++ return PTR_ERR(meta_dentry); + + if(!meta_dentry->d_inode) { + /* We need to create a META-file */