23 Aug, 2011

6 commits

  • Make the key reaper non-reentrant by sticking it on the appropriate system work
    queue when we queue it. This will allow it to have global state and drop
    locks. It should probably be non-reentrant already as it may spend a long time
    holding the key serial spinlock, and so multiple entrants can spend long
    periods of time just sitting there spinning, waiting to get the lock.

    Signed-off-by: David Howells
    Signed-off-by: James Morris

    David Howells
     
  • Move the unreferenced key reaper function to the keys garbage collector file
    as that's a more appropriate place with the dead key link reaper.

    Signed-off-by: David Howells
    Signed-off-by: James Morris

    David Howells
     
  • Fix prepare_kernel_cred() to provide a new, separate thread_group_cred struct
    otherwise when using request_key() ____call_usermodehelper() calls
    umh_keys_init() with the new creds pointing to init_tgcred, which
    umh_keys_init() then blithely alters.

    The problem can be demonstrated by:

    # keyctl request2 user a debug:a @s
    249681132
    # grep req /proc/keys
    079906a5 I--Q-- 1 perm 1f3f0000 0 0 keyring _req.249681132: 1/4
    38ef1626 IR---- 1 expd 0b010000 0 0 .request_ key:ee1d4ec pid:4371 ci:1

    The keyring _req.XXXX should have gone away, but something (init_tgcred) is
    pinning it.

    That key actually requested can then be removed and a new one created:

    # keyctl unlink 249681132
    1 links removed
    [root@andromeda ~]# grep req /proc/keys
    116cecac IR---- 1 expd 0b010000 0 0 .request_ key:eeb4911 pid:4379 ci:1
    36d1cbf8 I--Q-- 1 perm 1f3f0000 0 0 keyring _req.250300689: 1/4

    which causes the old _req keyring to go away and a new one to take its place.

    This is a consequence of the changes in:

    commit 879669961b11e7f40b518784863a259f735a72bf
    Author: David Howells
    Date: Fri Jun 17 11:25:59 2011 +0100
    KEYS/DNS: Fix ____call_usermodehelper() to not lose the session keyring

    and:

    commit 17f60a7da150fdd0cfb9756f86a262daa72c835f
    Author: Eric Paris
    Date: Fri Apr 1 17:07:50 2011 -0400
    capabilites: allow the application of capability limits to usermode helpers

    After this patch is applied, the _req keyring and the .request_key key are
    cleaned up.

    Signed-off-by: David Howells
    cc: Eric Paris
    Signed-off-by: James Morris

    David Howells
     
  • __key_link() should use the RCU deref wrapper rcu_dereference_locked_keyring()
    for accessing keyring payloads rather than calling rcu_dereference_protected()
    directly.

    Signed-off-by: David Howells
    Signed-off-by: James Morris

    David Howells
     
  • The keyctl call:

    keyctl_get_keyring_ID(KEY_SPEC_SESSION_KEYRING, 1)

    should create a session keyring if the process doesn't have one of its own
    because the create flag argument is set - rather than subscribing to and
    returning the user-session keyring as:

    keyctl_get_keyring_ID(KEY_SPEC_SESSION_KEYRING, 0)

    will do.

    This can be tested by commenting out pam_keyinit in the /etc/pam.d files and
    running the following program a couple of times in a row:

    #include
    #include
    #include
    int main(int argc, char *argv[])
    {
    key_serial_t uk, usk, sk, nsk;
    uk = keyctl_get_keyring_ID(KEY_SPEC_USER_KEYRING, 0);
    usk = keyctl_get_keyring_ID(KEY_SPEC_USER_SESSION_KEYRING, 0);
    sk = keyctl_get_keyring_ID(KEY_SPEC_SESSION_KEYRING, 0);
    nsk = keyctl_get_keyring_ID(KEY_SPEC_SESSION_KEYRING, 1);
    printf("keys: %08x %08x %08x %08x\n", uk, usk, sk, nsk);
    return 0;
    }

    Without this patch, I see:

    keys: 3975ddc7 119c0c66 119c0c66 119c0c66
    keys: 3975ddc7 119c0c66 119c0c66 119c0c66

    With this patch, I see:

    keys: 2cb4997b 34112878 34112878 17db2ce3
    keys: 2cb4997b 34112878 34112878 39f3c73e

    As can be seen, the session keyring starts off the same as the user-session
    keyring each time, but with the patch a new session keyring is created when
    the create flag is set.

    Reported-by: Greg Wettstein
    Signed-off-by: David Howells
    Tested-by: Greg Wettstein
    Signed-off-by: James Morris

    David Howells
     
  • If install_session_keyring() is given a keyring, it should install it rather
    than just creating a new one anyway. This was accidentally broken in:

    commit d84f4f992cbd76e8f39c488cf0c5d123843923b1
    Author: David Howells
    Date: Fri Nov 14 10:39:23 2008 +1100
    Subject: CRED: Inaugurate COW credentials

    The impact of that commit is that pam_keyinit no longer works correctly if
    'force' isn't specified against a login process. This is because:

    keyctl_get_keyring_ID(KEY_SPEC_SESSION_KEYRING, 0)

    now always creates a new session keyring and thus the check whether the session
    keyring and the user-session keyring are the same is always false. This leads
    pam_keyinit to conclude that a session keyring is installed and it shouldn't be
    revoked by pam_keyinit here if 'revoke' is specified.

    Any system that specifies 'force' against pam_keyinit in the PAM configuration
    files for login methods (login, ssh, su -l, kdm, etc.) is not affected since
    that bypasses the broken check and forces the creation of a new session keyring
    anyway (for which the revoke flag is not cleared) - and any subsequent call to
    pam_keyinit really does have a session keyring already installed, and so the
    check works correctly there.

    Reverting to the previous behaviour will cause the kernel to subscribe the
    process to the user-session keyring as its session keyring if it doesn't have a
    session keyring of its own. pam_keyinit will detect this and install a new
    session keyring anyway (and won't clear the revert flag).

    This can be tested by commenting out pam_keyinit in the /etc/pam.d files and
    running the following program a couple of times in a row:

    #include
    #include
    #include
    int main(int argc, char *argv[])
    {
    key_serial_t uk, usk, sk;
    uk = keyctl_get_keyring_ID(KEY_SPEC_USER_KEYRING, 0);
    usk = keyctl_get_keyring_ID(KEY_SPEC_USER_SESSION_KEYRING, 0);
    sk = keyctl_get_keyring_ID(KEY_SPEC_SESSION_KEYRING, 0);
    printf("keys: %08x %08x %08x\n", uk, usk, sk);
    return 0;
    }

    Without the patch, I see:

    keys: 3884e281 24c4dfcf 22825f8e
    keys: 3884e281 24c4dfcf 068772be

    With the patch, I see:

    keys: 26be9c83 0e755ce0 0e755ce0
    keys: 26be9c83 0e755ce0 0e755ce0

    As can be seen, with the patch, the session keyring is the same as the
    user-session keyring each time; without the patch a new session keyring is
    generated each time.

    Reported-by: Greg Wettstein
    Signed-off-by: David Howells
    Tested-by: Greg Wettstein
    Signed-off-by: James Morris

    David Howells
     

18 Aug, 2011

2 commits

  • Update the MAINTAINERS file with an entry for EVM.

    Reported-by: Randy Dunlap
    Signed-off-by: Mimi Zohar
    Signed-off-by: James Morris

    Mimi Zohar
     
  • Although the EVM encrypted-key should be encrypted/decrypted using a
    trusted-key, a user-defined key could be used instead. When using a user-
    defined key, a TCG_TPM dependency should not be required. Unfortunately,
    the encrypted-key code needs to be refactored a bit in order to remove
    this dependency.

    This patch adds the TCG_TPM dependency.

    Reported-by: Stephen Rothwell ,
    Randy Dunlap
    Signed-off-by: Mimi Zohar
    Signed-off-by: James Morris

    Mimi Zohar
     

17 Aug, 2011

1 commit

  • daemonize() is only needed when a user-space task does kernel_thread().

    tomoyo_gc_thread() is kthread_create()'ed and thus it doesn't need
    the soon-to-be-deprecated daemonize().

    Signed-off-by: Oleg Nesterov
    Acked-by: Tejun Heo
    Acked-by: Matt Fleming
    Signed-off-by: James Morris

    Oleg Nesterov
     

16 Aug, 2011

2 commits

  • - Make the previously missing security_old_inode_init_security() stub
    function definition static inline.

    - The stub security_inode_init_security() function previously returned
    -EOPNOTSUPP and relied on the callers to change it to 0. The stub
    security/security_old_inode_init_security() functions now return 0.

    Reported-by: Stephen Rothwell
    Signed-off-by: Mimi Zohar
    Signed-off-by: James Morris

    Mimi Zohar
     
  • Initialize has_cap in cap_bprm_set_creds()

    Reported-by: Andrew G. Morgan
    Signed-off-by: Serge Hallyn
    Signed-off-by: James Morris

    Serge Hallyn
     

12 Aug, 2011

2 commits

  • A task (when !SECURE_NOROOT) which executes a setuid-root binary will
    obtain root privileges while executing that binary. If the binary also
    has effective capabilities set, then only those capabilities will be
    granted. The rationale is that the same binary can carry both setuid-root
    and the minimal file capability set, so that on a filesystem not
    supporting file caps the binary can still be executed with privilege,
    while on a filesystem supporting file caps it will run with minimal
    privilege.

    This special case currently does NOT happen if there are file capabilities
    but no effective capabilities. Since capability-aware programs can very
    well start with empty pE but populated pP and move those caps to pE when
    needed. In other words, if the file has file capabilities but NOT
    effective capabilities, then we should do the same thing as if there
    were file capabilities, and not grant full root privileges.

    This patchset does that.

    (Changelog by Serge Hallyn).

    Signed-off-by: Zhi Li
    Acked-by: Serge Hallyn
    Signed-off-by: James Morris

    Zhi Li
     
  • Local XATTR_TRUSTED_PREFIX_LEN and XATTR_SECURITY_PREFIX_LEN definitions
    redefined ones in 'linux/xattr.h'. This was caused by commit 9d8f13ba3f48
    ("security: new security_inode_init_security API adds function callback")
    including 'linux/xattr.h' in 'linux/security.h'.

    In file included from include/linux/security.h:39,
    from include/net/sock.h:54,
    from fs/cifs/cifspdu.h:25,
    from fs/cifs/xattr.c:26:

    This patch removes the local definitions.

    Reported-by: Stephen Rothwell
    Signed-off-by: Mimi Zohar
    Signed-off-by: James Morris

    Mimi Zohar
     

11 Aug, 2011

2 commits

  • evm_inode_init_security() should return 0, when EVM is not enabled.
    (Returning an error is a remnant of evm_inode_post_init_security.)

    Signed-off-by: Mimi Zohar
    Signed-off-by: James Morris

    Mimi Zohar
     
  • - Missing 'inline' on evm_inode_setattr() definition.
    Introduced by commit 817b54aa45db ("evm: add evm_inode_setattr to prevent
    updating an invalid security.evm").

    - Missing security_old_inode_init_security() stub function definition.
    Caused by commit 9d8f13ba3f48 ("security: new security_inode_init_security
    API adds function callback").

    Reported-by: Stephen Rothwell
    Signed-off-by: Mimi Zohar
    Signed-off-by: James Morris

    Mimi Zohar
     

09 Aug, 2011

2 commits


08 Aug, 2011

9 commits


07 Aug, 2011

14 commits

  • After commit 3567866bf261: "RCUify freeing acls, let check_acl() go ahead in
    RCU mode if acl is cached" posix_acl_permission is being called with an
    unsupported flag and the permission check fails. This patch fixes the issue.

    Signed-off-by: Ari Savolainen
    Signed-off-by: Al Viro

    Ari Savolainen
     
  • * 'for-linus' of git://git.open-osd.org/linux-open-osd:
    ore: Make ore its own module
    exofs: Rename raid engine from exofs/ios.c => ore
    exofs: ios: Move to a per inode components & device-table
    exofs: Move exofs specific osd operations out of ios.c
    exofs: Add offset/length to exofs_get_io_state
    exofs: Fix truncate for the raid-groups case
    exofs: Small cleanup of exofs_fill_super
    exofs: BUG: Avoid sbi realloc
    exofs: Remove pnfs-osd private definitions
    nfs_xdr: Move nfs4_string definition out of #ifdef CONFIG_NFS_V4

    Linus Torvalds
     
  • The inode structure layout is largely random, and some of the vfs paths
    really do care. The path lookup in particular is already quite D$
    intensive, and profiles show that accessing the 'inode->i_op->xyz'
    fields is quite costly.

    We already optimized the dcache to not unnecessarily load the d_op
    structure for members that are often NULL using the DCACHE_OP_xyz bits
    in dentry->d_flags, and this does something very similar for the inode
    ops that are used during pathname lookup.

    It also re-orders the fields so that the fields accessed by 'stat' are
    together at the beginning of the inode structure, and roughly in the
    order accessed.

    The effect of this seems to be in the 1-2% range for an empty kernel
    "make -j" run (which is fairly kernel-intensive, mostly in filename
    lookup), so it's visible. The numbers are fairly noisy, though, and
    likely depend a lot on exact microarchitecture. So there's more tuning
    to be done.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     
  • Gcc tends to generate better code with small integers, including the
    DCACHE_xyz flag tests - so move the common ones to be first in the list.
    Also just remove the unused DCACHE_INOTIFY_PARENT_WATCHED and
    DCACHE_AUTOFS_PENDING values, their users no longer exists in the source
    tree.

    And add a "unlikely()" to the DCACHE_OP_COMPARE test, since we want the
    common case to be a nice straight-line fall-through.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
    net: Compute protocol sequence numbers and fragment IDs using MD5.
    crypto: Move md5_transform to lib/md5.c

    Linus Torvalds
     
  • Export everything from ore need exporting. Change Kbuild and Kconfig
    to build ore.ko as an independent module. Import ore from exofs

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • ORE stands for "Objects Raid Engine"

    This patch is a mechanical rename of everything that was in ios.c
    and its API declaration to an ore.c and an osd_ore.h header. The ore
    engine will later be used by the pnfs objects layout driver.

    * File ios.c => ore.c

    * Declaration of types and API are moved from exofs.h to a new
    osd_ore.h

    * All used types are prefixed by ore_ from their exofs_ name.

    * Shift includes from exofs.h to osd_ore.h so osd_ore.h is
    independent, include it from exofs.h.

    Other than a pure rename there are no other changes. Next patch
    will move the ore into it's own module and will export the API
    to be used by exofs and later the layout driver

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Exofs raid engine was saving on memory space by having a single layout-info,
    single pid, and a single device-table, global to the filesystem. Then passing
    a credential and object_id info at the io_state level, private for each
    inode. It would also devise this contraption of rotating the device table
    view for each inode->ino to spread out the device usage.

    This is not compatible with the pnfs-objects standard, demanding that
    each inode can have it's own layout-info, device-table, and each object
    component it's own pid, oid and creds.

    So: Bring exofs raid engine to be usable for generic pnfs-objects use by:

    * Define an exofs_comp structure that holds obj_id and credential info.

    * Break up exofs_layout struct to an exofs_components structure that holds a
    possible array of exofs_comp and the array of devices + the size of the
    arrays.

    * Add a "comps" parameter to get_io_state() that specifies the ids creds
    and device array to use for each IO.

    This enables to keep the layout global, but the device-table view, creds
    and IDs at the inode level. It only adds two 64bit to each inode, since
    some of these members already existed in another form.

    * ios raid engine now access layout-info and comps-info through the passed
    pointers. Everything is pre-prepared by caller for generic access of
    these structures and arrays.

    At the exofs Level:

    * Super block holds an exofs_components struct that holds the device
    array, previously in layout. The devices there are in device-table
    order. The device-array is twice bigger and repeats the device-table
    twice so now each inode's device array can point to a random device
    and have a round-robin view of the table, making it compatible to
    previous exofs versions.

    * Each inode has an exofs_components struct that is initialized at
    load time, with it's own view of the device table IDs and creds.
    When doing IO this gets passed to the io_state together with the
    layout.

    While preforming this change. Bugs where found where credentials with the
    wrong IDs where used to access the different SB objects (super.c). As well
    as some dead code. It was never noticed because the target we use does not
    check the credentials.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • ios.c will be moving to an external library, for use by the
    objects-layout-driver. Remove from it some exofs specific functions.

    Also g_attr_logical_length is used both by inode.c and ios.c
    move definition to the later, to keep it independent

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • In future raid code we will need to know the IO offset/length
    and if it's a read or write to determine some of the array
    sizes we'll need.

    So add a new exofs_get_rw_state() API for use when
    writeing/reading. All other simple cases are left using the
    old way.

    The major change to this is that now we need to call
    exofs_get_io_state later at inode.c::read_exec and
    inode.c::write_exec when we actually know these things. So this
    patch is kept separate so I can test things apart from other
    changes.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Computers have become a lot faster since we compromised on the
    partial MD4 hash which we use currently for performance reasons.

    MD5 is a much safer choice, and is inline with both RFC1948 and
    other ISS generators (OpenBSD, Solaris, etc.)

    Furthermore, only having 24-bits of the sequence number be truly
    unpredictable is a very serious limitation. So the periodic
    regeneration and 8-bit counter have been removed. We compute and
    use a full 32-bit sequence number.

    For ipv6, DCCP was found to use a 32-bit truncated initial sequence
    number (it needs 43-bits) and that is fixed here as well.

    Reported-by: Dan Kaminsky
    Tested-by: Willy Tarreau
    Signed-off-by: David S. Miller

    David S. Miller
     
  • We are going to use this for TCP/IP sequence number and fragment ID
    generation.

    Signed-off-by: David S. Miller

    David S. Miller
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6:
    cifs: cope with negative dentries in cifs_get_root
    cifs: convert prefixpath delimiters in cifs_build_path_to_root
    CIFS: Fix missing a decrement of inFlight value
    cifs: demote DFS referral lookup errors to cFYI
    Revert "cifs: advertise the right receive buffer size to the server"

    Linus Torvalds
     
  • * 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6:
    PM / Runtime: Allow _put_sync() from interrupts-disabled context
    PM / Domains: Fix pm_genpd_poweron()

    Linus Torvalds