forked from rpms/kernel
		
	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 | ||||
| 
 | ||||
| # 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 | ||||
| 
 | ||||
| BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root | ||||
| @ -1352,6 +1358,12 @@ ApplyPatch can-softing-depend-on-iomem.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 | ||||
| 
 | ||||
| %endif | ||||
| @ -1964,6 +1976,9 @@ fi | ||||
| #                 ||----w | | ||||
| #                 ||     || | ||||
| %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 | ||||
| - Linux 2.6.38-rc2-git9 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user