)]}'
{
  "log": [
    {
      "commit": "4be929be34f9bdeffa40d815d32d7d60d2c7f03b",
      "tree": "4d2c6e2b8ef766e565e2e050ee151de2e02081d3",
      "parents": [
        "940370fc86b920b51a34217a1facc3e9e97c2456"
      ],
      "author": {
        "name": "Alexey Dobriyan",
        "email": "adobriyan@gmail.com",
        "time": "Mon May 24 14:33:03 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue May 25 08:07:02 2010 -0700"
      },
      "message": "kernel-wide: replace USHORT_MAX, SHORT_MAX and SHORT_MIN with USHRT_MAX, SHRT_MAX and SHRT_MIN\n\n- C99 knows about USHRT_MAX/SHRT_MAX/SHRT_MIN, not\n  USHORT_MAX/SHORT_MAX/SHORT_MIN.\n\n- Make SHRT_MIN of type s16, not int, for consistency.\n\n[akpm@linux-foundation.org: fix drivers/dma/timb_dma.c]\n[akpm@linux-foundation.org: fix security/keys/keyring.c]\nSigned-off-by: Alexey Dobriyan \u003cadobriyan@gmail.com\u003e\nAcked-by: WANG Cong \u003cxiyou.wangcong@gmail.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "f70e2e06196ad4c1c762037da2f75354f6c16b81",
      "tree": "9632a1e655efb684c87f8c7be6d091fbb1a430e7",
      "parents": [
        "043b4d40f53131c5f72eca2a46555fe35328a930"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Apr 30 14:32:39 2010 +0100"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Thu May 06 22:25:02 2010 +1000"
      },
      "message": "KEYS: Do preallocation for __key_link()\n\nDo preallocation for __key_link() so that the various callers in request_key.c\ncan deal with any errors from this source before attempting to construct a key.\nThis allows them to assume that the actual linkage step is guaranteed to be\nsuccessful.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "043b4d40f53131c5f72eca2a46555fe35328a930",
      "tree": "02a40eeb688f7ed9730e26a22f39ad7e04378de2",
      "parents": [
        "292823814261e085cdcef06b6b691e6c2563fbd4",
        "722154e4cacf015161efe60009ae9be23d492296"
      ],
      "author": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Thu May 06 22:21:04 2010 +1000"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Thu May 06 22:21:04 2010 +1000"
      },
      "message": "Merge branch \u0027master\u0027 into next\n\nConflicts:\n\tsecurity/keys/keyring.c\n\nResolved conflict with whitespace fix in find_keyring_by_name()\n\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "553d603c8fce8cf727eb26e4bf6b9549cd4623f1",
      "tree": "137d9976ac663371d5f4f9ccf59ef4fb1ea9bc88",
      "parents": [
        "0ffbe2699cda6afbe08501098dff8a8c2fe6ae09"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Apr 30 14:32:28 2010 +0100"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Thu May 06 10:56:52 2010 +1000"
      },
      "message": "KEYS: keyring_serialise_link_sem is only needed for keyring-\u003ekeyring links\n\nkeyring_serialise_link_sem is only needed for keyring-\u003ekeyring links as it\u0027s\nused to prevent cycle detection from being avoided by parallel keyring\nadditions.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "0ffbe2699cda6afbe08501098dff8a8c2fe6ae09",
      "tree": "81b1a2305d16c873371b65c5a863c0268036cefe",
      "parents": [
        "4e5d6f7ec3833c0da9cf34fa5c53c6058c5908b6",
        "7ebd467551ed6ae200d7835a84bbda0dcadaa511"
      ],
      "author": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Thu May 06 10:56:07 2010 +1000"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Thu May 06 10:56:07 2010 +1000"
      },
      "message": "Merge branch \u0027master\u0027 into next\n"
    },
    {
      "commit": "f0641cba7729e5e14f82d2eedc398103f5fa31b1",
      "tree": "578cc4ea4686528eb587f3df7fbd908e1819fe66",
      "parents": [
        "cea7daa3589d6b550546a8c8963599f7c1a3ae5c"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Apr 30 14:32:18 2010 +0100"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Wed May 05 23:50:12 2010 +1000"
      },
      "message": "KEYS: Use RCU dereference wrappers in keyring key type code\n\nThe keyring key type code should use RCU dereference wrappers, even when it\nholds the keyring\u0027s key semaphore.\n\nReported-by: Vegard Nossum \u003cvegard.nossum@gmail.com\u003e\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nAcked-by: Serge Hallyn \u003cserue@us.ibm.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "cea7daa3589d6b550546a8c8963599f7c1a3ae5c",
      "tree": "6d3a0bd38756f03b85f50273c64c26f0b6027143",
      "parents": [
        "7ebd467551ed6ae200d7835a84bbda0dcadaa511"
      ],
      "author": {
        "name": "Toshiyuki Okajima",
        "email": "toshi.okajima@jp.fujitsu.com",
        "time": "Fri Apr 30 14:32:13 2010 +0100"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Wed May 05 23:49:10 2010 +1000"
      },
      "message": "KEYS: find_keyring_by_name() can gain access to a freed keyring\n\nfind_keyring_by_name() can gain access to a keyring that has had its reference\ncount reduced to zero, and is thus ready to be freed.  This then allows the\ndead keyring to be brought back into use whilst it is being destroyed.\n\nThe following timeline illustrates the process:\n\n|(cleaner)                           (user)\n|\n| free_user(user)                    sys_keyctl()\n|  |                                  |\n|  key_put(user-\u003esession_keyring)     keyctl_get_keyring_ID()\n|  ||\t//\u003d\u003e keyring-\u003eusage \u003d 0        |\n|  |schedule_work(\u0026key_cleanup_task)   lookup_user_key()\n|  ||                                   |\n|  kmem_cache_free(,user)               |\n|  .                                    |[KEY_SPEC_USER_KEYRING]\n|  .                                    install_user_keyrings()\n|  .                                    ||\n| key_cleanup() [\u003c\u003d worker_thread()]    ||\n|  |                                    ||\n|  [spin_lock(\u0026key_serial_lock)]        |[mutex_lock(\u0026key_user_keyr..mutex)]\n|  |                                    ||\n|  atomic_read() \u003d\u003d 0                   ||\n|  |{ rb_ease(\u0026key-\u003eserial_node,) }     ||\n|  |                                    ||\n|  [spin_unlock(\u0026key_serial_lock)]      |find_keyring_by_name()\n|  |                                    |||\n|  keyring_destroy(keyring)             ||[read_lock(\u0026keyring_name_lock)]\n|  ||                                   |||\n|  |[write_lock(\u0026keyring_name_lock)]    ||atomic_inc(\u0026keyring-\u003eusage)\n|  |.                                   ||| *** GET freeing keyring ***\n|  |.                                   ||[read_unlock(\u0026keyring_name_lock)]\n|  ||                                   ||\n|  |list_del()                          |[mutex_unlock(\u0026key_user_k..mutex)]\n|  ||                                   |\n|  |[write_unlock(\u0026keyring_name_lock)]  ** INVALID keyring is returned **\n|  |                                    .\n|  kmem_cache_free(,keyring)            .\n|                                       .\n|                                       atomic_dec(\u0026keyring-\u003eusage)\nv                                         *** DESTROYED ***\nTIME\n\nIf CONFIG_SLUB_DEBUG\u003dy then we may see the following message generated:\n\n\t\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\tBUG key_jar: Poison overwritten\n\t-----------------------------------------------------------------------------\n\n\tINFO: 0xffff880197a7e200-0xffff880197a7e200. First byte 0x6a instead of 0x6b\n\tINFO: Allocated in key_alloc+0x10b/0x35f age\u003d25 cpu\u003d1 pid\u003d5086\n\tINFO: Freed in key_cleanup+0xd0/0xd5 age\u003d12 cpu\u003d1 pid\u003d10\n\tINFO: Slab 0xffffea000592cb90 objects\u003d16 used\u003d2 fp\u003d0xffff880197a7e200 flags\u003d0x200000000000c3\n\tINFO: Object 0xffff880197a7e200 @offset\u003d512 fp\u003d0xffff880197a7e300\n\n\tBytes b4 0xffff880197a7e1f0:  5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZZZZZZZZZ\n\t  Object 0xffff880197a7e200:  6a 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b jkkkkkkkkkkkkkkk\n\nAlternatively, we may see a system panic happen, such as:\n\n\tBUG: unable to handle kernel NULL pointer dereference at 0000000000000001\n\tIP: [\u003cffffffff810e61a3\u003e] kmem_cache_alloc+0x5b/0xe9\n\tPGD 6b2b4067 PUD 6a80d067 PMD 0\n\tOops: 0000 [#1] SMP\n\tlast sysfs file: /sys/kernel/kexec_crash_loaded\n\tCPU 1\n\t...\n\tPid: 31245, comm: su Not tainted 2.6.34-rc5-nofixed-nodebug #2 D2089/PRIMERGY\n\tRIP: 0010:[\u003cffffffff810e61a3\u003e]  [\u003cffffffff810e61a3\u003e] kmem_cache_alloc+0x5b/0xe9\n\tRSP: 0018:ffff88006af3bd98  EFLAGS: 00010002\n\tRAX: 0000000000000000 RBX: 0000000000000001 RCX: ffff88007d19900b\n\tRDX: 0000000100000000 RSI: 00000000000080d0 RDI: ffffffff81828430\n\tRBP: ffffffff81828430 R08: ffff88000a293750 R09: 0000000000000000\n\tR10: 0000000000000001 R11: 0000000000100000 R12: 00000000000080d0\n\tR13: 00000000000080d0 R14: 0000000000000296 R15: ffffffff810f20ce\n\tFS:  00007f97116bc700(0000) GS:ffff88000a280000(0000) knlGS:0000000000000000\n\tCS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033\n\tCR2: 0000000000000001 CR3: 000000006a91c000 CR4: 00000000000006e0\n\tDR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000\n\tDR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400\n\tProcess su (pid: 31245, threadinfo ffff88006af3a000, task ffff8800374414c0)\n\tStack:\n\t 0000000512e0958e 0000000000008000 ffff880037f8d180 0000000000000001\n\t 0000000000000000 0000000000008001 ffff88007d199000 ffffffff810f20ce\n\t 0000000000008000 ffff88006af3be48 0000000000000024 ffffffff810face3\n\tCall Trace:\n\t [\u003cffffffff810f20ce\u003e] ? get_empty_filp+0x70/0x12f\n\t [\u003cffffffff810face3\u003e] ? do_filp_open+0x145/0x590\n\t [\u003cffffffff810ce208\u003e] ? tlb_finish_mmu+0x2a/0x33\n\t [\u003cffffffff810ce43c\u003e] ? unmap_region+0xd3/0xe2\n\t [\u003cffffffff810e4393\u003e] ? virt_to_head_page+0x9/0x2d\n\t [\u003cffffffff81103916\u003e] ? alloc_fd+0x69/0x10e\n\t [\u003cffffffff810ef4ed\u003e] ? do_sys_open+0x56/0xfc\n\t [\u003cffffffff81008a02\u003e] ? system_call_fastpath+0x16/0x1b\n\tCode: 0f 1f 44 00 00 49 89 c6 fa 66 0f 1f 44 00 00 65 4c 8b 04 25 60 e8 00 00 48 8b 45 00 49 01 c0 49 8b 18 48 85 db 74 0d 48 63 45 18 \u003c48\u003e 8b 04 03 49 89 00 eb 14 4c 89 f9 83 ca ff 44 89 e6 48 89 ef\n\tRIP  [\u003cffffffff810e61a3\u003e] kmem_cache_alloc+0x5b/0xe9\n\nThis problem is that find_keyring_by_name does not confirm that the keyring is\nvalid before accepting it.\n\nSkipping keyrings that have been reduced to a zero count seems the way to go.\nTo this end, use atomic_inc_not_zero() to increment the usage count and skip\nthe candidate keyring if that returns false.\n\nThe following script _may_ cause the bug to happen, but there\u0027s no guarantee\nas the window of opportunity is small:\n\n\t#!/bin/sh\n\tLOOP\u003d100000\n\tUSER\u003ddummy_user\n\t/bin/su -c \"exit;\" $USER || { /usr/sbin/adduser -m $USER; add\u003d1; }\n\tfor ((i\u003d0; i\u003cLOOP; i++))\n\tdo\n\t\t/bin/su -c \"echo \u0027$i\u0027 \u003e /dev/null\" $USER\n\tdone\n\t(( add \u003d\u003d 1 )) \u0026\u0026 /usr/sbin/userdel -r $USER\n\texit\n\nNote that the nominated user must not be in use.\n\nAn alternative way of testing this may be:\n\n\tfor ((i\u003d0; i\u003c100000; i++))\n\tdo\n\t\tkeyctl session foo /bin/true || break\n\tdone \u003e\u0026/dev/null\n\nas that uses a keyring named \"foo\" rather than relying on the user and\nuser-session named keyrings.\n\nReported-by: Toshiyuki Okajima \u003ctoshi.okajima@jp.fujitsu.com\u003e\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nTested-by: Toshiyuki Okajima \u003ctoshi.okajima@jp.fujitsu.com\u003e\nAcked-by: Serge Hallyn \u003cserue@us.ibm.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "b59ec78cdcc57e02bc3dddfa7134a2f0fd15c34d",
      "tree": "60ba3c907d4d83873bce5eb645ae8bd9415399b8",
      "parents": [
        "b91ce4d14a21fc04d165be30319541e0f9204f15"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Tue Apr 27 14:05:11 2010 -0700"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Wed Apr 28 08:37:15 2010 +1000"
      },
      "message": "keys: don\u0027t need to use RCU in keyring_read() as semaphore is held\n\nkeyring_read() doesn\u0027t need to use rcu_dereference() to access the keyring\npayload as the caller holds the key semaphore to prevent modifications\nfrom happening whilst the data is read out.\n\nThis should solve the following warning:\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n[ INFO: suspicious rcu_dereference_check() usage. ]\n---------------------------------------------------\nsecurity/keys/keyring.c:204 invoked rcu_dereference_check() without protection!\n\nother info that might help us debug this:\n\nrcu_scheduler_active \u003d 1, debug_locks \u003d 0\n1 lock held by keyctl/2144:\n #0:  (\u0026key-\u003esem){+++++.}, at: [\u003cffffffff81177f7c\u003e] keyctl_read_key+0x9c/0xcf\n\nstack backtrace:\nPid: 2144, comm: keyctl Not tainted 2.6.34-rc2-cachefs #113\nCall Trace:\n [\u003cffffffff8105121f\u003e] lockdep_rcu_dereference+0xaa/0xb2\n [\u003cffffffff811762d5\u003e] keyring_read+0x4d/0xe7\n [\u003cffffffff81177f8c\u003e] keyctl_read_key+0xac/0xcf\n [\u003cffffffff811788d4\u003e] sys_keyctl+0x75/0xb9\n [\u003cffffffff81001eeb\u003e] system_call_fastpath+0x16/0x1b\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nCc: Herbert Xu \u003cherbert@gondor.apana.org.au\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "c5b60b5e67af8be4c58d3ffcc36894f69c4fbdc1",
      "tree": "5ca471fad635ee8d91a24c7b5448dbcad3de74ef",
      "parents": [
        "822cceec7248013821d655545ea45d1c6a9d15b3"
      ],
      "author": {
        "name": "Justin P. Mattock",
        "email": "justinmattock@gmail.com",
        "time": "Wed Apr 21 00:02:11 2010 -0700"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Fri Apr 23 10:10:23 2010 +1000"
      },
      "message": "security: whitespace coding style fixes\n\nWhitespace coding style fixes.\n\nSigned-off-by: Justin P. Mattock \u003cjustinmattock@gmail.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "512ea3bc30c0e052a961e1abce8e783f3e28c92a",
      "tree": "2e50e5bd7d257ec010d9c9d1af87bd61fccead6c",
      "parents": [
        "c43a7523470dc2d9947fa114a0b54317975d4c04"
      ],
      "author": {
        "name": "Chihau Chau",
        "email": "chihau@gmail.com",
        "time": "Mon Mar 08 20:11:34 2010 -0300"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Wed Mar 10 08:46:15 2010 +1100"
      },
      "message": "Security: key: keyring: fix some code style issues\n\nThis fixes to include \u003clinux/uaccess.h\u003e instead \u003casm/uaccess.h\u003e and some\ncode style issues like to put a else sentence below close brace \u0027}\u0027 and\nto replace a tab instead of some space characters.\n\nSigned-off-by: Chihau Chau \u003cchihau@gmail.com\u003e\nAcked-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "c8563473c1259f5686ceb918c548c80132089f79",
      "tree": "45bd8a0cf2fcdbe388acdd2526897bbc59007436",
      "parents": [
        "06b9b72df43800b9ae4e77202c8bf5848c9d6998"
      ],
      "author": {
        "name": "wzt.wzt@gmail.com",
        "email": "wzt.wzt@gmail.com",
        "time": "Thu Mar 04 21:26:23 2010 +0800"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Fri Mar 05 09:49:02 2010 +1100"
      },
      "message": "Security: Fix some coding styles in security/keys/keyring.c\n\nFix some coding styles in security/keys/keyring.c\n\nSigned-off-by: Zhitong Wang \u003czhitong.wangzt@alibaba-inc.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "e7b0a61b7929632d36cf052d9e2820ef0a9c1bfe",
      "tree": "69dbe6f03abc5a9ef0dea3a2c28921cebcc59a08",
      "parents": [
        "96be753af91fc9d582450a84722f6a6721d218ad"
      ],
      "author": {
        "name": "Paul E. McKenney",
        "email": "paulmck@linux.vnet.ibm.com",
        "time": "Mon Feb 22 17:04:56 2010 -0800"
      },
      "committer": {
        "name": "Ingo Molnar",
        "email": "mingo@elte.hu",
        "time": "Thu Feb 25 10:34:52 2010 +0100"
      },
      "message": "security: Apply lockdep-based checking to rcu_dereference() uses\n\nApply lockdep-ified RCU primitives to key_gc_keyring() and\nkeyring_destroy().\n\nCc: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Paul E. McKenney \u003cpaulmck@linux.vnet.ibm.com\u003e\nCc: laijs@cn.fujitsu.com\nCc: dipankar@in.ibm.com\nCc: mathieu.desnoyers@polymtl.ca\nCc: josh@joshtriplett.org\nCc: dvhltc@us.ibm.com\nCc: niv@us.ibm.com\nCc: peterz@infradead.org\nCc: rostedt@goodmis.org\nCc: Valdis.Kletnieks@vt.edu\nCc: dhowells@redhat.com\nLKML-Reference: \u003c1266887105-1528-12-git-send-email-paulmck@linux.vnet.ibm.com\u003e\nSigned-off-by: Ingo Molnar \u003cmingo@elte.hu\u003e\n"
    },
    {
      "commit": "c08ef808ef24df32e25fbd949fe5310172f3c408",
      "tree": "12bae6fd48e1cdcc1b792c221376c727d9472cc6",
      "parents": [
        "5c84342a3e147a23752276650340801c237d0e56"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Mon Sep 14 17:26:13 2009 +0100"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Tue Sep 15 09:11:02 2009 +1000"
      },
      "message": "KEYS: Fix garbage collector\n\nFix a number of problems with the new key garbage collector:\n\n (1) A rogue semicolon in keyring_gc() was causing the initial count of dead\n     keys to be miscalculated.\n\n (2) A missing return in keyring_gc() meant that under certain circumstances,\n     the keyring semaphore would be unlocked twice.\n\n (3) The key serial tree iterator (key_garbage_collector()) part of the garbage\n     collector has been modified to:\n\n     (a) Complete each scan of the keyrings before setting the new timer.\n\n     (b) Only set the new timer for keys that have yet to expire.  This means\n         that the new timer is now calculated correctly, and the gc doesn\u0027t\n         get into a loop continually scanning for keys that have expired, and\n         preventing other things from happening, like RCU cleaning up the old\n         keyring contents.\n\n     (c) Perform an extra scan if any keys were garbage collected in this one\n     \t as a key might become garbage during a scan, and (b) could mean we\n     \t don\u0027t set the timer again.\n\n (4) Made key_schedule_gc() take the time at which to do a collection run,\n     rather than the time at which the key expires.  This means the collection\n     of dead keys (key type unregistered) can happen immediately.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "5d135440faf7db8d566de0c6fab36b16cf9cfc3b",
      "tree": "d9c022e73ed51dfe5729fde9a97150cb64b68196",
      "parents": [
        "f041ae2f99d49adc914153a34a2d0e14e4389d90"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Wed Sep 02 09:14:00 2009 +0100"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Wed Sep 02 21:29:11 2009 +1000"
      },
      "message": "KEYS: Add garbage collection for dead, revoked and expired keys. [try #6]\n\nAdd garbage collection for dead, revoked and expired keys.  This involved\nerasing all links to such keys from keyrings that point to them.  At that\npoint, the key will be deleted in the normal manner.\n\nKeyrings from which garbage collection occurs are shrunk and their quota\nconsumption reduced as appropriate.\n\nDead keys (for which the key type has been removed) will be garbage collected\nimmediately.\n\nRevoked and expired keys will hang around for a number of seconds, as set in\n/proc/sys/kernel/keys/gc_delay before being automatically removed.  The default\nis 5 minutes.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "2ea190d0a006ce5218baa6e798512652446a605a",
      "tree": "1d8612678355c77d8ea9f316ef6ce7d80ee6d613",
      "parents": [
        "8ff3bc3138a400294ee9e126ac75fc9a9fae4e0b"
      ],
      "author": {
        "name": "Serge E. Hallyn",
        "email": "serue@us.ibm.com",
        "time": "Thu Feb 26 18:27:55 2009 -0600"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Fri Feb 27 12:35:12 2009 +1100"
      },
      "message": "keys: skip keys from another user namespace\n\nWhen listing keys, do not return keys belonging to the\nsame uid in another user namespace.  Otherwise uid 500\nin another user namespace will return keyrings called\nuid.500 for another user namespace.\n\nSigned-off-by: Serge E. Hallyn \u003cserue@us.ibm.com\u003e\nAcked-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "d84f4f992cbd76e8f39c488cf0c5d123843923b1",
      "tree": "fc4a0349c42995715b93d0f7a3c78e9ea9b3f36e",
      "parents": [
        "745ca2475a6ac596e3d8d37c2759c0fbe2586227"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Nov 14 10:39:23 2008 +1100"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Fri Nov 14 10:39:23 2008 +1100"
      },
      "message": "CRED: Inaugurate COW credentials\n\nInaugurate copy-on-write credentials management.  This uses RCU to manage the\ncredentials pointer in the task_struct with respect to accesses by other tasks.\nA process may only modify its own credentials, and so does not need locking to\naccess or modify its own credentials.\n\nA mutex (cred_replace_mutex) is added to the task_struct to control the effect\nof PTRACE_ATTACHED on credential calculations, particularly with respect to\nexecve().\n\nWith this patch, the contents of an active credentials struct may not be\nchanged directly; rather a new set of credentials must be prepared, modified\nand committed using something like the following sequence of events:\n\n\tstruct cred *new \u003d prepare_creds();\n\tint ret \u003d blah(new);\n\tif (ret \u003c 0) {\n\t\tabort_creds(new);\n\t\treturn ret;\n\t}\n\treturn commit_creds(new);\n\nThere are some exceptions to this rule: the keyrings pointed to by the active\ncredentials may be instantiated - keyrings violate the COW rule as managing\nCOW keyrings is tricky, given that it is possible for a task to directly alter\nthe keys in a keyring in use by another task.\n\nTo help enforce this, various pointers to sets of credentials, such as those in\nthe task_struct, are declared const.  The purpose of this is compile-time\ndiscouragement of altering credentials through those pointers.  Once a set of\ncredentials has been made public through one of these pointers, it may not be\nmodified, except under special circumstances:\n\n  (1) Its reference count may incremented and decremented.\n\n  (2) The keyrings to which it points may be modified, but not replaced.\n\nThe only safe way to modify anything else is to create a replacement and commit\nusing the functions described in Documentation/credentials.txt (which will be\nadded by a later patch).\n\nThis patch and the preceding patches have been tested with the LTP SELinux\ntestsuite.\n\nThis patch makes several logical sets of alteration:\n\n (1) execve().\n\n     This now prepares and commits credentials in various places in the\n     security code rather than altering the current creds directly.\n\n (2) Temporary credential overrides.\n\n     do_coredump() and sys_faccessat() now prepare their own credentials and\n     temporarily override the ones currently on the acting thread, whilst\n     preventing interference from other threads by holding cred_replace_mutex\n     on the thread being dumped.\n\n     This will be replaced in a future patch by something that hands down the\n     credentials directly to the functions being called, rather than altering\n     the task\u0027s objective credentials.\n\n (3) LSM interface.\n\n     A number of functions have been changed, added or removed:\n\n     (*) security_capset_check(), -\u003ecapset_check()\n     (*) security_capset_set(), -\u003ecapset_set()\n\n     \t Removed in favour of security_capset().\n\n     (*) security_capset(), -\u003ecapset()\n\n     \t New.  This is passed a pointer to the new creds, a pointer to the old\n     \t creds and the proposed capability sets.  It should fill in the new\n     \t creds or return an error.  All pointers, barring the pointer to the\n     \t new creds, are now const.\n\n     (*) security_bprm_apply_creds(), -\u003ebprm_apply_creds()\n\n     \t Changed; now returns a value, which will cause the process to be\n     \t killed if it\u0027s an error.\n\n     (*) security_task_alloc(), -\u003etask_alloc_security()\n\n     \t Removed in favour of security_prepare_creds().\n\n     (*) security_cred_free(), -\u003ecred_free()\n\n     \t New.  Free security data attached to cred-\u003esecurity.\n\n     (*) security_prepare_creds(), -\u003ecred_prepare()\n\n     \t New. Duplicate any security data attached to cred-\u003esecurity.\n\n     (*) security_commit_creds(), -\u003ecred_commit()\n\n     \t New. Apply any security effects for the upcoming installation of new\n     \t security by commit_creds().\n\n     (*) security_task_post_setuid(), -\u003etask_post_setuid()\n\n     \t Removed in favour of security_task_fix_setuid().\n\n     (*) security_task_fix_setuid(), -\u003etask_fix_setuid()\n\n     \t Fix up the proposed new credentials for setuid().  This is used by\n     \t cap_set_fix_setuid() to implicitly adjust capabilities in line with\n     \t setuid() changes.  Changes are made to the new credentials, rather\n     \t than the task itself as in security_task_post_setuid().\n\n     (*) security_task_reparent_to_init(), -\u003etask_reparent_to_init()\n\n     \t Removed.  Instead the task being reparented to init is referred\n     \t directly to init\u0027s credentials.\n\n\t NOTE!  This results in the loss of some state: SELinux\u0027s osid no\n\t longer records the sid of the thread that forked it.\n\n     (*) security_key_alloc(), -\u003ekey_alloc()\n     (*) security_key_permission(), -\u003ekey_permission()\n\n     \t Changed.  These now take cred pointers rather than task pointers to\n     \t refer to the security context.\n\n (4) sys_capset().\n\n     This has been simplified and uses less locking.  The LSM functions it\n     calls have been merged.\n\n (5) reparent_to_kthreadd().\n\n     This gives the current thread the same credentials as init by simply using\n     commit_thread() to point that way.\n\n (6) __sigqueue_alloc() and switch_uid()\n\n     __sigqueue_alloc() can\u0027t stop the target task from changing its creds\n     beneath it, so this function gets a reference to the currently applicable\n     user_struct which it then passes into the sigqueue struct it returns if\n     successful.\n\n     switch_uid() is now called from commit_creds(), and possibly should be\n     folded into that.  commit_creds() should take care of protecting\n     __sigqueue_alloc().\n\n (7) [sg]et[ug]id() and co and [sg]et_current_groups.\n\n     The set functions now all use prepare_creds(), commit_creds() and\n     abort_creds() to build and check a new set of credentials before applying\n     it.\n\n     security_task_set[ug]id() is called inside the prepared section.  This\n     guarantees that nothing else will affect the creds until we\u0027ve finished.\n\n     The calling of set_dumpable() has been moved into commit_creds().\n\n     Much of the functionality of set_user() has been moved into\n     commit_creds().\n\n     The get functions all simply access the data directly.\n\n (8) security_task_prctl() and cap_task_prctl().\n\n     security_task_prctl() has been modified to return -ENOSYS if it doesn\u0027t\n     want to handle a function, or otherwise return the return value directly\n     rather than through an argument.\n\n     Additionally, cap_task_prctl() now prepares a new set of credentials, even\n     if it doesn\u0027t end up using it.\n\n (9) Keyrings.\n\n     A number of changes have been made to the keyrings code:\n\n     (a) switch_uid_keyring(), copy_keys(), exit_keys() and suid_keys() have\n     \t all been dropped and built in to the credentials functions directly.\n     \t They may want separating out again later.\n\n     (b) key_alloc() and search_process_keyrings() now take a cred pointer\n     \t rather than a task pointer to specify the security context.\n\n     (c) copy_creds() gives a new thread within the same thread group a new\n     \t thread keyring if its parent had one, otherwise it discards the thread\n     \t keyring.\n\n     (d) The authorisation key now points directly to the credentials to extend\n     \t the search into rather pointing to the task that carries them.\n\n     (e) Installing thread, process or session keyrings causes a new set of\n     \t credentials to be created, even though it\u0027s not strictly necessary for\n     \t process or session keyrings (they\u0027re shared).\n\n(10) Usermode helper.\n\n     The usermode helper code now carries a cred struct pointer in its\n     subprocess_info struct instead of a new session keyring pointer.  This set\n     of credentials is derived from init_cred and installed on the new process\n     after it has been cloned.\n\n     call_usermodehelper_setup() allocates the new credentials and\n     call_usermodehelper_freeinfo() discards them if they haven\u0027t been used.  A\n     special cred function (prepare_usermodeinfo_creds()) is provided\n     specifically for call_usermodehelper_setup() to call.\n\n     call_usermodehelper_setkeys() adjusts the credentials to sport the\n     supplied keyring as the new session keyring.\n\n(11) SELinux.\n\n     SELinux has a number of changes, in addition to those to support the LSM\n     interface changes mentioned above:\n\n     (a) selinux_setprocattr() no longer does its check for whether the\n     \t current ptracer can access processes with the new SID inside the lock\n     \t that covers getting the ptracer\u0027s SID.  Whilst this lock ensures that\n     \t the check is done with the ptracer pinned, the result is only valid\n     \t until the lock is released, so there\u0027s no point doing it inside the\n     \t lock.\n\n(12) is_single_threaded().\n\n     This function has been extracted from selinux_setprocattr() and put into\n     a file of its own in the lib/ directory as join_session_keyring() now\n     wants to use it too.\n\n     The code in SELinux just checked to see whether a task shared mm_structs\n     with other tasks (CLONE_VM), but that isn\u0027t good enough.  We really want\n     to know if they\u0027re part of the same thread group (CLONE_THREAD).\n\n(13) nfsd.\n\n     The NFS server daemon now has to use the COW credentials to set the\n     credentials it is going to use.  It really needs to pass the credentials\n     down to the functions it calls, but it can\u0027t do that until other patches\n     in this series have been applied.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nAcked-by: James Morris \u003cjmorris@namei.org\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "e9e349b051d98799b743ebf248cc2d986fedf090",
      "tree": "d59a46ae39d81d27bcf605663ce0e24d1c6db375",
      "parents": [
        "76aac0e9a17742e60d408be1a706e9aaad370891"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Nov 14 10:39:13 2008 +1100"
      },
      "committer": {
        "name": "James Morris",
        "email": "jmorris@namei.org",
        "time": "Fri Nov 14 10:39:13 2008 +1100"
      },
      "message": "KEYS: Disperse linux/key_ui.h\n\nDisperse the bits of linux/key_ui.h as the reason they were put here (keyfs)\ndidn\u0027t get in.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nReviewed-by: James Morris \u003cjmorris@namei.org\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\n"
    },
    {
      "commit": "69664cf16af4f31cd54d77948a4baf9c7e0ca7b9",
      "tree": "3ff4ecae21c140a2beed25cfa9e55b788f9814ac",
      "parents": [
        "6b79ccb5144f9ffb4d4596c23e7570238dd12abc"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Tue Apr 29 01:01:31 2008 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Apr 29 08:06:17 2008 -0700"
      },
      "message": "keys: don\u0027t generate user and user session keyrings unless they\u0027re accessed\n\nDon\u0027t generate the per-UID user and user session keyrings unless they\u0027re\nexplicitly accessed.  This solves a problem during a login process whereby\nset*uid() is called before the SELinux PAM module, resulting in the per-UID\nkeyrings having the wrong security labels.\n\nThis also cures the problem of multiple per-UID keyrings sometimes appearing\ndue to PAM modules (including pam_keyinit) setuiding and causing user_structs\nto come into and go out of existence whilst the session keyring pins the user\nkeyring.  This is achieved by first searching for extant per-UID keyrings\nbefore inventing new ones.\n\nThe serial bound argument is also dropped from find_keyring_by_name() as it\u0027s\nnot currently made use of (setting it to 0 disables the feature).\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nCc: \u003ckwc@citi.umich.edu\u003e\nCc: \u003carunsr@cse.iitk.ac.in\u003e\nCc: \u003cdwalsh@redhat.com\u003e\nCc: Stephen Smalley \u003csds@tycho.nsa.gov\u003e\nCc: James Morris \u003cjmorris@namei.org\u003e\nCc: Chris Wright \u003cchrisw@sous-sol.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "dceba9944181b1fd5993417b5c8fa0e3dda38f8d",
      "tree": "697e247a7a99c81af7ba4d7ad5d9cdf9941b3741",
      "parents": [
        "38bbca6b6f164e08a4a9cdfd719fff679af98375"
      ],
      "author": {
        "name": "Kevin Coffman",
        "email": "kwc@citi.umich.edu",
        "time": "Tue Apr 29 01:01:22 2008 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Apr 29 08:06:16 2008 -0700"
      },
      "message": "keys: check starting keyring as part of search\n\nCheck the starting keyring as part of the search to (a) see if that is what\nwe\u0027re searching for, and (b) to check it is still valid for searching.\n\nThe scenario: User in process A does things that cause things to be created in\nits process session keyring.  The user then does an su to another user and\nstarts a new process, B.  The two processes now share the same process session\nkeyring.\n\nProcess B does an NFS access which results in an upcall to gssd.  When gssd\nattempts to instantiate the context key (to be linked into the process session\nkeyring), it is denied access even though it has an authorization key.\n\nThe order of calls is:\n\n   keyctl_instantiate_key()\n      lookup_user_key()\t\t\t\t    (the default: case)\n         search_process_keyrings(current)\n\t    search_process_keyrings(rka-\u003econtext)   (recursive call)\n\t       keyring_search_aux()\n\nkeyring_search_aux() verifies the keys and keyrings underneath the top-level\nkeyring it is given, but that top-level keyring is neither fully validated nor\nchecked to see if it is the thing being searched for.\n\nThis patch changes keyring_search_aux() to:\n1) do more validation on the top keyring it is given and\n2) check whether that top-level keyring is the thing being searched for\n\nSigned-off-by: Kevin Coffman \u003ckwc@citi.umich.edu\u003e\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nCc: Paul Moore \u003cpaul.moore@hp.com\u003e\nCc: Chris Wright \u003cchrisw@sous-sol.org\u003e\nCc: Stephen Smalley \u003csds@tycho.nsa.gov\u003e\nCc: James Morris \u003cjmorris@namei.org\u003e\nCc: Kevin Coffman \u003ckwc@citi.umich.edu\u003e\nCc: Trond Myklebust \u003ctrond.myklebust@fys.uio.no\u003e\nCc: \"J. Bruce Fields\" \u003cbfields@fieldses.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "7318226ea2931a627f3572e5f4804c91ca19ecbc",
      "tree": "d2492bb7e87a9c1740432c4dcde13e75ee46ad8d",
      "parents": [
        "071b638689464c6b39407025eedd810d5b5e6f5d"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Apr 26 15:46:23 2007 -0700"
      },
      "committer": {
        "name": "David S. Miller",
        "email": "davem@davemloft.net",
        "time": "Thu Apr 26 15:46:23 2007 -0700"
      },
      "message": "[AF_RXRPC]: Key facility changes for AF_RXRPC\n\nExport the keyring key type definition and document its availability.\n\nAdd alternative types into the key\u0027s type_data union to make it more useful.\nNot all users necessarily want to use it as a list_head (AF_RXRPC doesn\u0027t, for\nexample), so make it clear that it can be used in other ways.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: David S. Miller \u003cdavem@davemloft.net\u003e\n"
    },
    {
      "commit": "48ad504ee7d598431cb2d0b2f01c6d1aff1d2a07",
      "tree": "52862e12cdca605b04959fc0fa28164dc015013b",
      "parents": [
        "7cf9c2c76c1a17b32f2da85b50cd4fe468ed44b5"
      ],
      "author": {
        "name": "Eric Sesterhenn",
        "email": "snakebyte@gmx.de",
        "time": "Wed Dec 06 20:33:47 2006 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@woody.osdl.org",
        "time": "Thu Dec 07 08:39:25 2006 -0800"
      },
      "message": "[PATCH] security/keys/*: user kmemdup()\n\nSigned-off-by: Eric Sesterhenn \u003csnakebyte@gmx.de\u003e\nSigned-off-by: Alexey Dobriyan \u003cadobriyan@gmail.com\u003e\nAcked-By: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "31204ed925b067d2bb65adb89501656f8274a32a",
      "tree": "a5c3e5101e9f79bf39672f02c0eea573e7a47cb8",
      "parents": [
        "7e047ef5fe2d52e83020e856b1bf2556a6a2ce98"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Mon Jun 26 00:24:51 2006 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Mon Jun 26 09:58:18 2006 -0700"
      },
      "message": "[PATCH] keys: discard the contents of a key on revocation\n\nCause the keys linked to a keyring to be unlinked from it when revoked and it\ncauses the data attached to a user-defined key to be discarded when revoked.\n\nThis frees up most of the quota a key occupied at that point, rather than\nwaiting for the key to actually be destroyed.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "7e047ef5fe2d52e83020e856b1bf2556a6a2ce98",
      "tree": "97656e2c56a27be9d1da451dde627b693b8643f2",
      "parents": [
        "f116629d03655adaf7832b93b03c99391d09d4a7"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Mon Jun 26 00:24:50 2006 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Mon Jun 26 09:58:18 2006 -0700"
      },
      "message": "[PATCH] keys: sort out key quota system\n\nAdd the ability for key creation to overrun the user\u0027s quota in some\ncircumstances - notably when a session keyring is created and assigned to a\nprocess that didn\u0027t previously have one.\n\nThis means it\u0027s still possible to log in, should PAM require the creation of a\nnew session keyring, and fix an overburdened key quota.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "d720024e94de4e8b7f10ee83c532926f3ad5d708",
      "tree": "8f21613c29a26bfbeb334cb0104b8b998b09fbdc",
      "parents": [
        "f893afbe1262e27e91234506f72e17716190dd2f"
      ],
      "author": {
        "name": "Michael LeMay",
        "email": "mdlemay@epoch.ncsc.mil",
        "time": "Thu Jun 22 14:47:17 2006 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Thu Jun 22 15:05:55 2006 -0700"
      },
      "message": "[PATCH] selinux: add hooks for key subsystem\n\nIntroduce SELinux hooks to support the access key retention subsystem\nwithin the kernel.  Incorporate new flask headers from a modified version\nof the SELinux reference policy, with support for the new security class\nrepresenting retained keys.  Extend the \"key_alloc\" security hook with a\ntask parameter representing the intended ownership context for the key\nbeing allocated.  Attach security information to root\u0027s default keyrings\nwithin the SELinux initialization routine.\n\nHas passed David\u0027s testsuite.\n\nSigned-off-by: Michael LeMay \u003cmdlemay@epoch.ncsc.mil\u003e\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: James Morris \u003cjmorris@namei.org\u003e\nAcked-by: Chris Wright \u003cchrisw@sous-sol.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "c3a9d6541f84ac3ff566982d08389b87c1c36b4e",
      "tree": "161e507b276105b35dadf0c2637be9f018b0f664",
      "parents": [
        "460fbf82c0842cad3f3c744c4dcb81978b7829f3"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Mon Apr 10 15:15:21 2006 +0100"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Mon Apr 10 09:33:46 2006 -0700"
      },
      "message": "[Security] Keys: Fix oops when adding key to non-keyring\n\nThis fixes the problem of an oops occuring when a user attempts to add a\nkey to a non-keyring key [CVE-2006-1522].\n\nThe problem is that __keyring_search_one() doesn\u0027t check that the\nkeyring it\u0027s been given is actually a keyring.\n\nI\u0027ve fixed this problem by:\n\n (1) declaring that caller of __keyring_search_one() must guarantee that\n     the keyring is a keyring; and\n\n (2) making key_create_or_update() check that the keyring is a keyring,\n     and return -ENOTDIR if it isn\u0027t.\n\nThis can be tested by:\n\n\tkeyctl add user b b `keyctl add user a a @s`\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "b5f545c880a2a47947ba2118b2509644ab7a2969",
      "tree": "8720e02262b0ff6309ae79603f6c63965296d378",
      "parents": [
        "cab8eb594e84b434d20412fc5a3985b0bee3ab9f"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Sun Jan 08 01:02:47 2006 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Sun Jan 08 20:13:53 2006 -0800"
      },
      "message": "[PATCH] keys: Permit running process to instantiate keys\n\nMake it possible for a running process (such as gssapid) to be able to\ninstantiate a key, as was requested by Trond Myklebust for NFS4.\n\nThe patch makes the following changes:\n\n (1) A new, optional key type method has been added. This permits a key type\n     to intercept requests at the point /sbin/request-key is about to be\n     spawned and do something else with them - passing them over the\n     rpc_pipefs files or netlink sockets for instance.\n\n     The uninstantiated key, the authorisation key and the intended operation\n     name are passed to the method.\n\n (2) The callout_info is no longer passed as an argument to /sbin/request-key\n     to prevent unauthorised viewing of this data using ps or by looking in\n     /proc/pid/cmdline.\n\n     This means that the old /sbin/request-key program will not work with the\n     patched kernel as it will expect to see an extra argument that is no\n     longer there.\n\n     A revised keyutils package will be made available tomorrow.\n\n (3) The callout_info is now attached to the authorisation key. Reading this\n     key will retrieve the information.\n\n (4) A new field has been added to the task_struct. This holds the\n     authorisation key currently active for a thread. Searches now look here\n     for the caller\u0027s set of keys rather than looking for an auth key in the\n     lowest level of the session keyring.\n\n     This permits a thread to be servicing multiple requests at once and to\n     switch between them. Note that this is per-thread, not per-process, and\n     so is usable in multithreaded programs.\n\n     The setting of this field is inherited across fork and exec.\n\n (5) A new keyctl function (KEYCTL_ASSUME_AUTHORITY) has been added that\n     permits a thread to assume the authority to deal with an uninstantiated\n     key. Assumption is only permitted if the authorisation key associated\n     with the uninstantiated key is somewhere in the thread\u0027s keyrings.\n\n     This function can also clear the assumption.\n\n (6) A new magic key specifier has been added to refer to the currently\n     assumed authorisation key (KEY_SPEC_REQKEY_AUTH_KEY).\n\n (7) Instantiation will only proceed if the appropriate authorisation key is\n     assumed first. The assumed authorisation key is discarded if\n     instantiation is successful.\n\n (8) key_validate() is moved from the file of request_key functions to the\n     file of permissions functions.\n\n (9) The documentation is updated.\n\nFrom: \u003cValdis.Kletnieks@vt.edu\u003e\n\n    Build fix.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nCc: Trond Myklebust \u003ctrond.myklebust@fys.uio.no\u003e\nCc: Alexander Zangerl \u003caz@bond.edu.au\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "cab8eb594e84b434d20412fc5a3985b0bee3ab9f",
      "tree": "307dc5bf813effdcabe439a74ad2ae866516adb0",
      "parents": [
        "017679c4d45783158dba1dd6f79e712c22bb3d9a"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Sun Jan 08 01:02:45 2006 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Sun Jan 08 20:13:53 2006 -0800"
      },
      "message": "[PATCH] keys: Discard duplicate keys from a keyring on link\n\nCause any links within a keyring to keys that match a key to be linked into\nthat keyring to be discarded as a link to the new key is added.  The match is\ncontingent on the type and description strings being the same.\n\nThis permits requests, adds and searches to displace negative, expired,\nrevoked and dead keys easily.  After some discussion it was concluded that\nduplicate valid keys should probably be discarded also as they would otherwise\nhide the new key.\n\nSince request_key() is intended to be the primary method by which keys are\nadded to a keyring, duplicate valid keys wouldn\u0027t be an issue there as that\nfunction would return an existing match in preference to creating a new key.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nCc: Trond Myklebust \u003ctrond.myklebust@fys.uio.no\u003e\nCc: Alexander Zangerl \u003caz@bond.edu.au\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "1ae8f40767a3afc6244719a2c8fbcf546767d5b0",
      "tree": "f41d957bbc60ad940132fd28ea13a8fced63a398",
      "parents": [
        "8d9067bda99c68e1a17d93e78cf3a5a3f67e0c35"
      ],
      "author": {
        "name": "Adrian Bunk",
        "email": "bunk@stusta.de",
        "time": "Fri Jan 06 00:11:25 2006 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Fri Jan 06 08:33:30 2006 -0800"
      },
      "message": "[PATCH] security/: possible cleanups\n\nmake needlessly global code static\n\nSigned-off-by: Adrian Bunk \u003cbunk@stusta.de\u003e\nCc: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "8d9067bda99c68e1a17d93e78cf3a5a3f67e0c35",
      "tree": "6f3c7fe665012c456b57840c290eafd4deabbeb2",
      "parents": [
        "32725ad8430b58e42c5d54757ce7871e680d05cb"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Jan 06 00:11:24 2006 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Fri Jan 06 08:33:29 2006 -0800"
      },
      "message": "[PATCH] Keys: Remove key duplication\n\nRemove the key duplication stuff since there\u0027s nothing that uses it, no way\nto get at it and it\u0027s awkward to deal with for LSM purposes.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "db1d1d57e97700b4131fe80556dc6ef976d534c4",
      "tree": "abdc78339b1c1bd4e37cb496c68424d9d7d98592",
      "parents": [
        "5c72c343719a8c5dba675cd1b27b63c06bfe23d1"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Dec 01 00:51:18 2005 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Thu Dec 01 15:48:56 2005 -0800"
      },
      "message": "[PATCH] Keys: Fix permissions check for update vs add\n\nPermit add_key() to once again update a matching key rather than adding a\nnew one if a matching key already exists in the target keyring.\n\nThis bug causes add_key() to always add a new key, displacing the old from\nthe target keyring.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "0f6ed7c2641fe4cea83cd09c21928ca30c0983ec",
      "tree": "15662837acd37f24dddeb11eb12980429c8c4ef4",
      "parents": [
        "28ef35845f2c8da8e1bed068277d2fab1e8c8979"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Mon Nov 07 00:59:30 2005 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Mon Nov 07 07:53:37 2005 -0800"
      },
      "message": "[PATCH] Keys: Remove incorrect and obsolete \u0027!\u0027 operators\n\nThe attached patch removes a couple of incorrect and obsolete \u0027!\u0027 operators\nleft over from the conversion of the key permission functions from\ntrue/false returns to zero/error returns.\n\nSigned-Off-By: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "29db9190634067c5a328ee5fcc2890251b836b4b",
      "tree": "07ec242789230824f1fa8bcbbe681fd5bf166fa8",
      "parents": [
        "2aa349f6e37ce030060c994d3aebbff4ab703565"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Sun Oct 30 15:02:44 2005 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Sun Oct 30 17:37:23 2005 -0800"
      },
      "message": "[PATCH] Keys: Add LSM hooks for key management [try #3]\n\nThe attached patch adds LSM hooks for key management facilities. The notable\nchanges are:\n\n (1) The key struct now supports a security pointer for the use of security\n     modules. This will permit key labelling and restrictions on which\n     programs may access a key.\n\n (2) Security modules get a chance to note (or abort) the allocation of a key.\n\n (3) The key permission checking can now be enhanced by the security modules;\n     the permissions check consults LSM if all other checks bear out.\n\n (4) The key permissions checking functions now return an error code rather\n     than a boolean value.\n\n (5) An extra permission has been added to govern the modification of\n     attributes (UID, GID, permissions).\n\nNote that there isn\u0027t an LSM hook specifically for each keyctl() operation,\nbut rather the permissions hook allows control of individual operations based\non the permission request bits.\n\nKey management access control through LSM is enabled by automatically if both\nCONFIG_KEYS and CONFIG_SECURITY are enabled.\n\nThis should be applied on top of the patch ensubjected:\n\n\t[PATCH] Keys: Possessor permissions should be additive\n\nSigned-Off-By: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Chris Wright \u003cchrisw@osdl.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "664cceb0093b755739e56572b836a99104ee8a75",
      "tree": "dbaa3ab802803879f29532db4d8a91a54294cf88",
      "parents": [
        "5134fc15b643dc36eb9aa77e4318b886844a9ac5"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Wed Sep 28 17:03:15 2005 +0100"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Wed Sep 28 09:10:47 2005 -0700"
      },
      "message": "[PATCH] Keys: Add possessor permissions to keys [try #3]\n\nThe attached patch adds extra permission grants to keys for the possessor of a\nkey in addition to the owner, group and other permissions bits. This makes\nSUID binaries easier to support without going as far as labelling keys and key\ntargets using the LSM facilities.\n\nThis patch adds a second \"pointer type\" to key structures (struct key_ref *)\nthat can have the bottom bit of the address set to indicate the possession of\na key. This is propagated through searches from the keyring to the discovered\nkey. It has been made a separate type so that the compiler can spot attempts\nto dereference a potentially incorrect pointer.\n\nThe \"possession\" attribute can\u0027t be attached to a key structure directly as\nit\u0027s not an intrinsic property of a key.\n\nPointers to keys have been replaced with struct key_ref *\u0027s wherever\npossession information needs to be passed through.\n\nThis does assume that the bottom bit of the pointer will always be zero on\nreturn from kmem_cache_alloc().\n\nThe key reference type has been made into a typedef so that at least it can be\nlocated in the sources, even though it\u0027s basically a pointer to an undefined\ntype. I\u0027ve also renamed the accessor functions to be more useful, and all\nreference variables should now end in \"_ref\".\n\nSigned-Off-By: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "94efe72f762e2c147d8146d637d5ece5614c8d94",
      "tree": "002e4719541ad838342e01a5f8ff63ae0a618b29",
      "parents": [
        "bcf945d36fa0598f41ac4ad46a9dc43135460263"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Aug 04 13:07:07 2005 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Thu Aug 04 13:11:14 2005 -0700"
      },
      "message": "[PATCH] Destruction of failed keyring oopses\n\nThe attached patch makes sure that a keyring that failed to instantiate\nproperly is destroyed without oopsing [CAN-2005-2099].\n\nThe problem occurs in three stages:\n\n (1) The key allocator initialises the type-specific data to all zeroes. In\n     the case of a keyring, this will become a link in the keyring name list\n     when the keyring is instantiated.\n\n (2) If a user (any user) attempts to add a keyring with anything other than\n     an empty payload, the keyring instantiation function will fail with an\n     error and won\u0027t add the keyring to the name list.\n\n (3) The keyring\u0027s destructor then sees that the keyring has a description\n     (name) and tries to remove the keyring from the name list, which oopses\n     because the link pointers are both zero.\n\nThis bug permits any user to take down a box trivially.\n\nSigned-Off-By: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "a4014d8f61a6a136d22422cf8aa978e6495dbad9",
      "tree": "bb5d995c2511b99e131ca92020ffc10cafee4447",
      "parents": [
        "682d4fc93105ebf0bdfbb04a4b85047999b17844"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Jul 07 17:57:03 2005 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@g5.osdl.org",
        "time": "Thu Jul 07 18:23:46 2005 -0700"
      },
      "message": "[PATCH] Keys: Base keyring size on key pointer not key struct\n\nThe attached patch makes the keyring functions calculate the new size of a\nkeyring\u0027s payload based on the size of pointer to the key struct, not the size\nof the key struct itself.\n\nSigned-Off-By: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "3e30148c3d524a9c1c63ca28261bc24c457eb07a",
      "tree": "a2fcc46cc11fe871ad976c07476d934a07313576",
      "parents": [
        "8589b4e00e352f983259140f25a262d973be6bc5"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Jun 23 22:00:56 2005 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@ppc970.osdl.org",
        "time": "Fri Jun 24 00:05:19 2005 -0700"
      },
      "message": "[PATCH] Keys: Make request-key create an authorisation key\n\nThe attached patch makes the following changes:\n\n (1) There\u0027s a new special key type called \".request_key_auth\".\n\n     This is an authorisation key for when one process requests a key and\n     another process is started to construct it. This type of key cannot be\n     created by the user; nor can it be requested by kernel services.\n\n     Authorisation keys hold two references:\n\n     (a) Each refers to a key being constructed. When the key being\n     \t constructed is instantiated the authorisation key is revoked,\n     \t rendering it of no further use.\n\n     (b) The \"authorising process\". This is either:\n\n     \t (i) the process that called request_key(), or:\n\n     \t (ii) if the process that called request_key() itself had an\n     \t      authorisation key in its session keyring, then the authorising\n     \t      process referred to by that authorisation key will also be\n     \t      referred to by the new authorisation key.\n\n\t This means that the process that initiated a chain of key requests\n\t will authorise the lot of them, and will, by default, wind up with\n\t the keys obtained from them in its keyrings.\n\n (2) request_key() creates an authorisation key which is then passed to\n     /sbin/request-key in as part of a new session keyring.\n\n (3) When request_key() is searching for a key to hand back to the caller, if\n     it comes across an authorisation key in the session keyring of the\n     calling process, it will also search the keyrings of the process\n     specified therein and it will use the specified process\u0027s credentials\n     (fsuid, fsgid, groups) to do that rather than the calling process\u0027s\n     credentials.\n\n     This allows a process started by /sbin/request-key to find keys belonging\n     to the authorising process.\n\n (4) A key can be read, even if the process executing KEYCTL_READ doesn\u0027t have\n     direct read or search permission if that key is contained within the\n     keyrings of a process specified by an authorisation key found within the\n     calling process\u0027s session keyring, and is searchable using the\n     credentials of the authorising process.\n\n     This allows a process started by /sbin/request-key to read keys belonging\n     to the authorising process.\n\n (5) The magic KEY_SPEC_*_KEYRING key IDs when passed to KEYCTL_INSTANTIATE or\n     KEYCTL_NEGATE will specify a keyring of the authorising process, rather\n     than the process doing the instantiation.\n\n (6) One of the process keyrings can be nominated as the default to which\n     request_key() should attach new keys if not otherwise specified. This is\n     done with KEYCTL_SET_REQKEY_KEYRING and one of the KEY_REQKEY_DEFL_*\n     constants. The current setting can also be read using this call.\n\n (7) request_key() is partially interruptible. If it is waiting for another\n     process to finish constructing a key, it can be interrupted. This permits\n     a request-key cycle to be broken without recourse to rebooting.\n\nSigned-Off-By: David Howells \u003cdhowells@redhat.com\u003e\nSigned-Off-By: Benoit Boissinot \u003cbenoit.boissinot@ens-lyon.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "76d8aeabfeb1c42641a81c44280177b9a08670d8",
      "tree": "0a584439bb44e440717aa77a1398ba9eea24a137",
      "parents": [
        "7286aa9b9ab35f20b1ff16d867f4535701df99b5"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Jun 23 22:00:49 2005 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@ppc970.osdl.org",
        "time": "Fri Jun 24 00:05:18 2005 -0700"
      },
      "message": "[PATCH] keys: Discard key spinlock and use RCU for key payload\n\nThe attached patch changes the key implementation in a number of ways:\n\n (1) It removes the spinlock from the key structure.\n\n (2) The key flags are now accessed using atomic bitops instead of\n     write-locking the key spinlock and using C bitwise operators.\n\n     The three instantiation flags are dealt with with the construction\n     semaphore held during the request_key/instantiate/negate sequence, thus\n     rendering the spinlock superfluous.\n\n     The key flags are also now bit numbers not bit masks.\n\n (3) The key payload is now accessed using RCU. This permits the recursive\n     keyring search algorithm to be simplified greatly since no locks need be\n     taken other than the usual RCU preemption disablement. Searching now does\n     not require any locks or semaphores to be held; merely that the starting\n     keyring be pinned.\n\n (4) The keyring payload now includes an RCU head so that it can be disposed\n     of by call_rcu(). This requires that the payload be copied on unlink to\n     prevent introducing races in copy-down vs search-up.\n\n (5) The user key payload is now a structure with the data following it. It\n     includes an RCU head like the keyring payload and for the same reason. It\n     also contains a data length because the data length in the key may be\n     changed on another CPU whilst an RCU protected read is in progress on the\n     payload. This would then see the supposed RCU payload and the on-key data\n     length getting out of sync.\n\n     I\u0027m tempted to drop the key\u0027s datalen entirely, except that it\u0027s used in\n     conjunction with quota management and so is a little tricky to get rid\n     of.\n\n (6) Update the keys documentation.\n\nSigned-Off-By: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    },
    {
      "commit": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
      "tree": "0bba044c4ce775e45a88a51686b5d9f90697ea9d",
      "parents": [],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@ppc970.osdl.org",
        "time": "Sat Apr 16 15:20:36 2005 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@ppc970.osdl.org",
        "time": "Sat Apr 16 15:20:36 2005 -0700"
      },
      "message": "Linux-2.6.12-rc2\n\nInitial git repository build. I\u0027m not bothering with the full history,\neven though we have it. We can create a separate \"historical\" git\narchive of that later if we want to, and in the meantime it\u0027s about\n3.2GB when imported into git - space that would just make the early\ngit days unnecessarily complicated, when we don\u0027t have a lot of good\ninfrastructure for it.\n\nLet it rip!\n"
    }
  ]
}
