Re: Fw: [PATCH] Fixing to avoid invalid kfree() in cifs_get_tcp_session() of fs/cifs/connect.c

Jeff Layton <[email protected]>
Newsgroups gmane.linux.file-systems.cifs
Message-ID <[email protected]>
On Tue, 06 Oct 2009 15:09:47 +0900 (JST)
Hitoshi Mitake <[email protected]> wrote:

> From: Hitoshi Mitake <[email protected]>
> To: [email protected]
> Subject: [linux-cifs-client] Fw: [PATCH] Fixing to avoid invalid kfree() in cifs_get_tcp_session() of fs/cifs/connect.c
> Date: Tue, 06 Oct 2009 15:09:47 +0900 (JST)
> Sender: [email protected]
> X-Mailer: Mew version 5.2 on Emacs 22.2 / Mule 5.0 (SAKAKI)
> 
> 
> Hi,
> 
> Yesterday I posted this bug fix to LKML.
> For confirmation, I forward this to linux-cifs-client too.
> 
> 
> From: Hitoshi Mitake <[email protected]>
> To: [email protected], [email protected]
> Subject: [PATCH] Fixing to avoid invalid kfree() in cifs_get_tcp_session() of fs/cifs/connect.c
> Date: Mon, 05 Oct 2009 18:28:56 +0900 (JST)
> X-Mailer: Mew version 5.2 on Emacs 22.2 / Mule 5.0 (SAKAKI)
> 
> 
> Hi,
> 
> I found a trivial bug in fs/cifs/connect.c .
> The bug is caused by fail of extract_hostname()
> when mounting cifs file system.
> 
> This is the situation when I noticed this bug.
> 
> % sudo mount -t cifs //192.168.10.208 mountpoint -o options...
> 
> Then my kernel says,
> 
> [ 1461.807776] ------------[ cut here ]------------
> [ 1461.807781] kernel BUG at mm/slab.c:521!
> [ 1461.807784] invalid opcode: 0000 [#2] PREEMPT SMP
> [ 1461.807790] last sysfs file: /sys/devices/pci0000:00/0000:00:1e.0/0000:09:02.0/resource
> [ 1461.807793] CPU 0
> [ 1461.807796] Modules linked in: nls_iso8859_1 usbhid sbp2 uhci_hcd ehci_hcd i2c_i801 ohci1394 ieee1394 psmouse serio_raw pcspkr sky2 usbcore evdev
> [ 1461.807816] Pid: 3446, comm: mount Tainted: G      D    2.6.32-rc2-vanilla #1 System Product Name
> [ 1461.807820] RIP: 0010:[<ffffffff810b888e>]  [<ffffffff810b888e>] kfree+0x63/0x156
> [ 1461.807829] RSP: 0018:ffff8800b4f7fbb8  EFLAGS: 00010046
> [ 1461.807832] RAX: ffffea00033fff98 RBX: ffff8800afbae7e2 RCX: 0000000000000000
> [ 1461.807836] RDX: ffffea0000000000 RSI: 000000000000005c RDI: ffffffffffffffea
> [ 1461.807839] RBP: ffff8800b4f7fbf8 R08: 0000000000000001 R09: 0000000000000000
> [ 1461.807842] R10: 0000000000000000 R11: ffff8800b4f7fbf8 R12: 00000000ffffffea
> [ 1461.807845] R13: ffff8800afb23000 R14: ffff8800b4f87bc0 R15: ffffffffffffffea
> [ 1461.807849] FS:  00007f52b6f187c0(0000) GS:ffff880007600000(0000) knlGS:0000000000000000
> [ 1461.807852] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
> [ 1461.807855] CR2: 0000000000613000 CR3: 00000000af8f9000 CR4: 00000000000006f0
> [ 1461.807858] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [ 1461.807861] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> [ 1461.807865] Process mount (pid: 3446, threadinfo ffff8800b4f7e000, task ffff8800950e4380)
> [ 1461.807867] Stack:
> [ 1461.807869]  0000000000000202 0000000000000282 ffff8800b4f7fbf8 ffff8800afbae7e2
> [ 1461.807876] <0> 00000000ffffffea ffff8800afb23000 ffff8800b4f87bc0 ffff8800b4f7fc28
> [ 1461.807884] <0> ffff8800b4f7fcd8 ffffffff81159f6d ffffffff81147bc2 ffffffff816bfb48
> [ 1461.807892] Call Trace:
> [ 1461.807899]  [<ffffffff81159f6d>] cifs_get_tcp_session+0x440/0x44b
> [ 1461.807904]  [<ffffffff81147bc2>] ? find_nls+0x1c/0xe9
> [ 1461.807909]  [<ffffffff8115b889>] cifs_mount+0x16bc/0x2167
> [ 1461.807917]  [<ffffffff814455bd>] ? _spin_unlock+0x30/0x4b
> [ 1461.807923]  [<ffffffff81150da9>] cifs_get_sb+0xa5/0x1a8
> [ 1461.807928]  [<ffffffff810c1b94>] vfs_kern_mount+0x56/0xc9
> [ 1461.807933]  [<ffffffff810c1c64>] do_kern_mount+0x47/0xe7
> [ 1461.807938]  [<ffffffff810d8632>] do_mount+0x712/0x775
> [ 1461.807943]  [<ffffffff810d671f>] ? copy_mount_options+0xcf/0x132
> [ 1461.807948]  [<ffffffff810d8714>] sys_mount+0x7f/0xbf
> [ 1461.807953]  [<ffffffff8144509a>] ? lockdep_sys_exit_thunk+0x35/0x67
> [ 1461.807960]  [<ffffffff81011cc2>] system_call_fastpath+0x16/0x1b
> [ 1461.807963] Code: 00 00 00 00 ea ff ff 48 c1 e8 0c 48 6b c0 68 48 01 d0 66 83 38 00 79 04 48 8b 40 10 66 83 38 00 79 04 48 8b 40 10 80 38 00 78 04 <0f> 0b eb fe 4c 8b 70 58 4c 89 ff 41 8b 76 4c e8 b8 49 fb ff e8
> [ 1461.808022] RIP  [<ffffffff810b888e>] kfree+0x63/0x156
> [ 1461.808027]  RSP <ffff8800b4f7fbb8>
> [ 1461.808031] ---[ end trace ffe26fcdc72c0ce4 ]---
> 
> The reason of this bug is that the error handling code of cifs_get_tcp_session()
> calls kfree() when corresponding kmalloc() failed.
> (The kmalloc() is called by extract_hostname().)
> 
> So I fixed a little. This is the patch. Please use.
> 
> Signed-off-by: Hitoshi Mitake <[email protected]>
> 
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index 43003e0..b090980 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -1577,7 +1577,8 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
>  
>  out_err:
>  	if (tcp_ses) {
> -		kfree(tcp_ses->hostname);
> +		if (!IS_ERR(tcp_ses->hostname))
> +			kfree(tcp_ses->hostname);
>  		if (tcp_ses->ssocket)
>  			sock_release(tcp_ses->ssocket);
>  		kfree(tcp_ses);
> 
> 

Acked-by: Jeff Layton <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.