• Tycho Andersen's avatar
    sysctl: move sysctl calls to usernsd · f79f4546
    Tycho Andersen authored
    When in a userns, tasks can't write to certain sysctl files:
    
    (00.009653)      1: Error (sysctl.c:142): Can't open sysctl kernel/hostname: Permission denied
    
    See inline comments for details on affected namespaces.
    
    Mostly for my own education in what is required to port something to be
    userns restorable, I ported the sysctl stuff. A potential concern for this
    patch is that copying structures with pointers around is kind of gory. I
    did it ad-hoc here, but it may be worth inventing some mechanisms to make
    it easier, although I'm not sure what exactly that would look like
    (potentially re-using some of the protobuf bits; I'll investigate this more
    if it looks helpful when doing the cgroup user namespaces port?).
    
    Another issue is that there is not a great way to return non-fd stuff in
    memory right now from userns_call; one of the little hacks in this code
    would be "simplified" if we invented a way to do this.
    
    v2: coalesce the individual struct sysctl_req requests into one big
        sysctl_userns_req that is in a contiguous region of memory so that we
        can pass it via userns_call. Hopefully nobody finds my little ascii
        diagram too offensive :)
    v3: use the fork/setns trick to change the syctl values in the right ns for
        IPC/UTS nses; see inline comment for details
    v4: only use sysctl_userns_req when actually doing a userns_call.
    Signed-off-by: 's avatarTycho Andersen <tycho.andersen@canonical.com>
    Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
    f79f4546
ipc_ns.c 19.8 KB