• Eric W. Biederman's avatar
    pid: Handle failure to allocate the first pid in a pid namespace · c0ee5549
    Eric W. Biederman authored
    With the replacement of the pid bitmap and hashtable with an idr in
    alloc_pid started occassionally failing when allocating the first pid
    in a pid namespace.  Things were not completely reset resulting in
    the first allocated pid getting the number 2 (not 1).  Which
    further resulted in ns->proc_mnt not getting set and eventually
    causing an oops in proc_flush_task.
    
    Oops: 0000 [#1] SMP
    CPU: 2 PID: 6743 Comm: trinity-c117 Not tainted 4.15.0-rc4-think+ #2
    RIP: 0010:proc_flush_task+0x8e/0x1b0
    RSP: 0018:ffffc9000bbffc40 EFLAGS: 00010286
    RAX: 0000000000000001 RBX: 0000000000000001 RCX: 00000000fffffffb
    RDX: 0000000000000000 RSI: ffffc9000bbffc50 RDI: 0000000000000000
    RBP: ffffc9000bbffc63 R08: 0000000000000000 R09: 0000000000000002
    R10: ffffc9000bbffb70 R11: ffffc9000bbffc64 R12: 0000000000000003
    R13: 0000000000000000 R14: 0000000000000003 R15: ffff8804c10d7840
    FS:  00007f7cb8965700(0000) GS:ffff88050a200000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000000000000 CR3: 00000003e21ae003 CR4: 00000000001606e0
    DR0: 00007fb1d6c22000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000600
    Call Trace:
     ? release_task+0xaf/0x680
     release_task+0xd2/0x680
     ? wait_consider_task+0xb82/0xce0
     wait_consider_task+0xbe9/0xce0
     ? do_wait+0xe1/0x330
     do_wait+0x151/0x330
     kernel_wait4+0x8d/0x150
     ? task_stopped_code+0x50/0x50
     SYSC_wait4+0x95/0xa0
     ? rcu_read_lock_sched_held+0x6c/0x80
     ? syscall_trace_enter+0x2d7/0x340
     ? do_syscall_64+0x60/0x210
     do_syscall_64+0x60/0x210
     entry_SYSCALL64_slow_path+0x25/0x25
    RIP: 0033:0x7f7cb82603aa
    RSP: 002b:00007ffd60770bc8 EFLAGS: 00000246
     ORIG_RAX: 000000000000003d
    RAX: ffffffffffffffda RBX: 00007f7cb6cd4000 RCX: 00007f7cb82603aa
    RDX: 000000000000000b RSI: 00007ffd60770bd0 RDI: 0000000000007cca
    RBP: 0000000000007cca R08: 00007f7cb8965700 R09: 00007ffd607c7080
    R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
    R13: 00007ffd60770bd0 R14: 00007f7cb6cd4058 R15: 00000000cccccccd
    Code: c1 e2 04 44 8b 60 30 48 8b 40 38 44 8b 34 11 48 c7 c2 60 3a f5 81 44 89 e1 4c 8b 68 58 e8 4b b4 77 00 89 44 24 14 48 8d 74 24 10 <49> 8b 7d 00 e8 b9 6a f9 ff 48 85 c0 74 1a 48 89 c7 48 89 44 24
    RIP: proc_flush_task+0x8e/0x1b0 RSP: ffffc9000bbffc40
    CR2: 0000000000000000
    ---[ end trace 53d67a6481059862 ]---
    
    Improve the quality of the implementation by resetting the place to
    start allocating pids on failure to allocate the first pid.
    
    As improving the quality of the implementation is the goal remove the now
    unnecesarry disable_pid_allocations call when we fail to mount proc.
    
    Fixes: 95846ecf ("pid: replace pid bitmap implementation with IDR API")
    Fixes: 8ef047aa ("pid namespaces: make alloc_pid(), free_pid() and put_pid() work with struct upid")
    Reported-by: default avatarDave Jones <davej@codemonkey.org.uk>
    Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    c0ee5549
pid.c 10.7 KB