• C
    f2fs: avoid NULL pointer dereference in f2fs_xattr_advise_get · 84e97c27
    Chao Yu 提交于
    We will encounter oops by executing below command.
    getfattr -n system.advise /mnt/f2fs/file
    Killed
    
    message log:
    BUG: unable to handle kernel NULL pointer dereference at   (null)
    IP: [<f8b54d69>] f2fs_xattr_advise_get+0x29/0x40 [f2fs]
    *pdpt = 00000000319b7001 *pde = 0000000000000000
    Oops: 0002 [#1] SMP
    Modules linked in: f2fs(O) snd_intel8x0 snd_ac97_codec ac97_bus snd_pcm snd_seq_midi snd_seq_midi_event snd_rawmidi snd_seq joydev
    snd_seq_device snd_timer bnep snd rfcomm microcode bluetooth soundcore i2c_piix4 mac_hid serio_raw parport_pc ppdev lp parport
    binfmt_misc hid_generic psmouse usbhid hid e1000 [last unloaded: f2fs]
    CPU: 3 PID: 3134 Comm: getfattr Tainted: G           O    4.0.0-rc1 #6
    Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
    task: f3a71b60 ti: f19a6000 task.ti: f19a6000
    EIP: 0060:[<f8b54d69>] EFLAGS: 00010246 CPU: 3
    EIP is at f2fs_xattr_advise_get+0x29/0x40 [f2fs]
    EAX: 00000000 EBX: f19a7e71 ECX: 00000000 EDX: f8b5b467
    ESI: 00000000 EDI: f2008570 EBP: f19a7e14 ESP: f19a7e08
     DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
    CR0: 80050033 CR2: 00000000 CR3: 319b8000 CR4: 000007f0
    Stack:
     f8b5a634 c0cbb580 00000000 f19a7e34 c1193850 00000000 00000007 f19a7e71
     f19a7e64 c0cbb580 c1193810 f19a7e50 c1193c00 00000000 00000000 00000000
     c0cbb580 00000000 f19a7f70 c1194097 00000000 00000000 00000000 74737973
    Call Trace:
     [<c1193850>] generic_getxattr+0x40/0x50
     [<c1193810>] ? xattr_resolve_name+0x80/0x80
     [<c1193c00>] vfs_getxattr+0x70/0xa0
     [<c1194097>] getxattr+0x87/0x190
     [<c11801d7>] ? path_lookupat+0x57/0x5f0
     [<c11819d2>] ? putname+0x32/0x50
     [<c116653a>] ? kmem_cache_alloc+0x2a/0x130
     [<c11819d2>] ? putname+0x32/0x50
     [<c11819d2>] ? putname+0x32/0x50
     [<c11819d2>] ? putname+0x32/0x50
     [<c11827f9>] ? user_path_at_empty+0x49/0x70
     [<c118283f>] ? user_path_at+0x1f/0x30
     [<c11941e7>] path_getxattr+0x47/0x80
     [<c11948e7>] SyS_getxattr+0x27/0x30
     [<c163f748>] sysenter_do_call+0x12/0x12
    Code: 66 90 55 89 e5 57 56 53 66 66 66 66 90 8b 78 20 89 d3 ba 67 b4 b5 f8 89 d8 89 ce e8 42 7c 7b c8 85 c0 75 16 0f b6 87 44 01 00
    00 <88> 06 b8 01 00 00 00 5b 5e 5f 5d c3 8d 76 00 b8 ea ff ff ff eb
    EIP: [<f8b54d69>] f2fs_xattr_advise_get+0x29/0x40 [f2fs] SS:ESP 0068:f19a7e08
    CR2: 0000000000000000
    ---[ end trace 860260654f1f416a ]---
    
    The reason is that in getfattr there are two steps which is indicated by strace info:
    1) try to lookup and get size of specified xattr.
    2) get value of the extented attribute.
    
    strace info:
    getxattr("/mnt/f2fs/file", "system.advise", 0x0, 0) = 1
    getxattr("/mnt/f2fs/file", "system.advise", "\x00", 256) = 1
    
    For the first step, getfattr may pass a NULL pointer in @value and zero in @size
    as parameters for ->getxattr, but we access this @value pointer directly without
    checking whether the pointer is valid or not in f2fs_xattr_advise_get, so the
    oops occurs.
    
    This patch fixes this issue by verifying @value pointer before using.
    Signed-off-by: NChao Yu <chao2.yu@samsung.com>
    Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
    84e97c27
xattr.c 14.7 KB