Try to fix some obvious bugs in hfsplus mount failure handling (#673857)
This commit is contained in:
parent
270ebd2028
commit
285227b68c
24
hfsplus-01-dont-leak-buffer.patch
Normal file
24
hfsplus-01-dont-leak-buffer.patch
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
hfsplus: Don't leak buffer on error
|
||||||
|
|
||||||
|
Signed-Off-By: Chuck Ebbert <cebbert@redhat.com>
|
||||||
|
|
||||||
|
--- vanilla-2.6.38-rc2-git9.orig/fs/hfsplus/part_tbl.c
|
||||||
|
+++ vanilla-2.6.38-rc2-git9/fs/hfsplus/part_tbl.c
|
||||||
|
@@ -134,7 +134,7 @@ int hfs_part_find(struct super_block *sb
|
||||||
|
res = hfsplus_submit_bio(sb->s_bdev, *part_start + HFS_PMAP_BLK,
|
||||||
|
data, READ);
|
||||||
|
if (res)
|
||||||
|
- return res;
|
||||||
|
+ goto out;
|
||||||
|
|
||||||
|
switch (be16_to_cpu(*((__be16 *)data))) {
|
||||||
|
case HFS_OLD_PMAP_MAGIC:
|
||||||
|
@@ -147,7 +147,7 @@ int hfs_part_find(struct super_block *sb
|
||||||
|
res = -ENOENT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+out:
|
||||||
|
kfree(data);
|
||||||
|
return res;
|
||||||
|
}
|
38
hfsplus-02-fill-super-skip-cleanup.patch
Normal file
38
hfsplus-02-fill-super-skip-cleanup.patch
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
hfsplus: Skip cleanup on early failures
|
||||||
|
|
||||||
|
Signed-Off-By: Chuck Ebbert <cebbert@redhat.com>
|
||||||
|
|
||||||
|
--- vanilla-2.6.38-rc2-git9.orig/fs/hfsplus/super.c
|
||||||
|
+++ vanilla-2.6.38-rc2-git9/fs/hfsplus/super.c
|
||||||
|
@@ -344,14 +344,13 @@ static int hfsplus_fill_super(struct sup
|
||||||
|
if (!sbi)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
- sb->s_fs_info = sbi;
|
||||||
|
mutex_init(&sbi->alloc_mutex);
|
||||||
|
mutex_init(&sbi->vh_mutex);
|
||||||
|
hfsplus_fill_defaults(sbi);
|
||||||
|
if (!hfsplus_parse_options(data, sbi)) {
|
||||||
|
printk(KERN_ERR "hfs: unable to parse mount options\n");
|
||||||
|
- err = -EINVAL;
|
||||||
|
- goto cleanup;
|
||||||
|
+ kfree(sbi);
|
||||||
|
+ return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* temporarily use utf8 to correctly find the hidden dir below */
|
||||||
|
@@ -359,10 +358,12 @@ static int hfsplus_fill_super(struct sup
|
||||||
|
sbi->nls = load_nls("utf8");
|
||||||
|
if (!sbi->nls) {
|
||||||
|
printk(KERN_ERR "hfs: unable to load nls for utf8\n");
|
||||||
|
- err = -EINVAL;
|
||||||
|
- goto cleanup;
|
||||||
|
+ kfree(sbi);
|
||||||
|
+ return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ sb->s_fs_info = sbi;
|
||||||
|
+
|
||||||
|
/* Grab the volume header */
|
||||||
|
if (hfsplus_read_wrapper(sb)) {
|
||||||
|
if (!silent)
|
39
hfsplus-03-zero-vhdr-on-free.patch
Normal file
39
hfsplus-03-zero-vhdr-on-free.patch
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
hfsplus: Clear volume header pointers on failure
|
||||||
|
|
||||||
|
The next patch will use NULL volume header to determine whether
|
||||||
|
to flush the superblock. Also fix two failure cases so they
|
||||||
|
clear the headers before exiting.
|
||||||
|
|
||||||
|
Signed-Off-By: Chuck Ebbert <cebbert@redhat.com>
|
||||||
|
|
||||||
|
--- vanilla-2.6.38-rc2-git9.orig/fs/hfsplus/wrapper.c
|
||||||
|
+++ vanilla-2.6.38-rc2-git9/fs/hfsplus/wrapper.c
|
||||||
|
@@ -167,7 +167,7 @@ reread:
|
||||||
|
break;
|
||||||
|
case cpu_to_be16(HFSP_WRAP_MAGIC):
|
||||||
|
if (!hfsplus_read_mdb(sbi->s_vhdr, &wd))
|
||||||
|
- goto out;
|
||||||
|
+ goto out_free_backup_vhdr;
|
||||||
|
wd.ablk_size >>= HFSPLUS_SECTOR_SHIFT;
|
||||||
|
part_start += wd.ablk_start + wd.embed_start * wd.ablk_size;
|
||||||
|
part_size = wd.embed_count * wd.ablk_size;
|
||||||
|
@@ -179,7 +179,7 @@ reread:
|
||||||
|
* (should do this only for cdrom/loop though)
|
||||||
|
*/
|
||||||
|
if (hfs_part_find(sb, &part_start, &part_size))
|
||||||
|
- goto out;
|
||||||
|
+ goto out_free_backup_vhdr;
|
||||||
|
goto reread;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -230,8 +230,10 @@ reread:
|
||||||
|
|
||||||
|
out_free_backup_vhdr:
|
||||||
|
kfree(sbi->s_backup_vhdr);
|
||||||
|
+ sbi->s_backup_vhdr = NULL;
|
||||||
|
out_free_vhdr:
|
||||||
|
kfree(sbi->s_vhdr);
|
||||||
|
+ sbi->s_vhdr = NULL;
|
||||||
|
out:
|
||||||
|
return error;
|
||||||
|
}
|
28
hfsplus-04-check-for-vhdr.patch
Normal file
28
hfsplus-04-check-for-vhdr.patch
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
hfsplus: Check for NULL volume header
|
||||||
|
|
||||||
|
If volume header is null there is not much to do in put_super().
|
||||||
|
|
||||||
|
Signed-Off-By: Chuck Ebbert <cebbert@redhat.com>
|
||||||
|
|
||||||
|
--- vanilla-2.6.38-rc2-git9.orig/fs/hfsplus/super.c
|
||||||
|
+++ vanilla-2.6.38-rc2-git9/fs/hfsplus/super.c
|
||||||
|
@@ -237,7 +237,10 @@ static void hfsplus_put_super(struct sup
|
||||||
|
if (!sb->s_fs_info)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- if (!(sb->s_flags & MS_RDONLY) && sbi->s_vhdr) {
|
||||||
|
+ if (!sbi->s_vhdr)
|
||||||
|
+ goto out_unload_nls;
|
||||||
|
+
|
||||||
|
+ if (!(sb->s_flags & MS_RDONLY)) {
|
||||||
|
struct hfsplus_vh *vhdr = sbi->s_vhdr;
|
||||||
|
|
||||||
|
vhdr->modify_date = hfsp_now2mt();
|
||||||
|
@@ -253,6 +256,7 @@ static void hfsplus_put_super(struct sup
|
||||||
|
iput(sbi->hidden_dir);
|
||||||
|
kfree(sbi->s_vhdr);
|
||||||
|
kfree(sbi->s_backup_vhdr);
|
||||||
|
+out_unload_nls:
|
||||||
|
unload_nls(sbi->nls);
|
||||||
|
kfree(sb->s_fs_info);
|
||||||
|
sb->s_fs_info = NULL;
|
15
kernel.spec
15
kernel.spec
@ -735,6 +735,12 @@ Patch12430: can-softing-depend-on-iomem.patch
|
|||||||
|
|
||||||
Patch12431: nfs-2.6.38-bugfixes.patch
|
Patch12431: nfs-2.6.38-bugfixes.patch
|
||||||
|
|
||||||
|
# rhbz#673857
|
||||||
|
Patch12432: hfsplus-01-dont-leak-buffer.patch
|
||||||
|
Patch12433: hfsplus-02-fill-super-skip-cleanup.patch
|
||||||
|
Patch12434: hfsplus-03-zero-vhdr-on-free.patch
|
||||||
|
Patch12435: hfsplus-04-check-for-vhdr.patch
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
||||||
@ -1352,6 +1358,12 @@ ApplyPatch can-softing-depend-on-iomem.patch
|
|||||||
|
|
||||||
ApplyPatch nfs-2.6.38-bugfixes.patch
|
ApplyPatch nfs-2.6.38-bugfixes.patch
|
||||||
|
|
||||||
|
# rhbz#673857
|
||||||
|
ApplyPatch hfsplus-01-dont-leak-buffer.patch
|
||||||
|
ApplyPatch hfsplus-02-fill-super-skip-cleanup.patch
|
||||||
|
ApplyPatch hfsplus-03-zero-vhdr-on-free.patch
|
||||||
|
ApplyPatch hfsplus-04-check-for-vhdr.patch
|
||||||
|
|
||||||
# END OF PATCH APPLICATIONS
|
# END OF PATCH APPLICATIONS
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
@ -1964,6 +1976,9 @@ fi
|
|||||||
# ||----w |
|
# ||----w |
|
||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Feb 01 2011 Chuck Ebbert <cebbert@redhat.com>
|
||||||
|
- Try to fix some obvious bugs in hfsplus mount failure handling (#673857)
|
||||||
|
|
||||||
* Mon Jan 31 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc2.git9.1
|
* Mon Jan 31 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc2.git9.1
|
||||||
- Linux 2.6.38-rc2-git9
|
- Linux 2.6.38-rc2-git9
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user