)]}'
{
  "log": [
    {
      "commit": "16d9ba808b64a2af8a10b5710bea7c4b63e989db",
      "tree": "2b4a0a99224c3bcadb1baaf8c5e66181513a4b00",
      "parents": [
        "291e895b37767b71f4e41e455abc7fc7e471bec4"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Jun 30 13:20:28 2017 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Jun 30 13:21:25 2017 -0700"
      },
      "message": "Add version info for C++ versions of basename, strchrnul.\n\nThese still won\u0027t get guards added by the preprocessor, because it\ncompiles with C-only.\n\nBug: https://github.com/android-ndk/ndk/issues/440\nTest: treehugger\nChange-Id: I893b345e528ed1b761e0db00700037411bbb8b78\n"
    },
    {
      "commit": "31e5a35f3d403ffa4ffe0215f9664d08fb749ada",
      "tree": "3304b1cfa2e6c55c556f908d522be14ddfd76990",
      "parents": [
        "7b37fa9384cb9ca9a95928af45b03b2bc9fe815c"
      ],
      "author": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Tue Apr 18 18:28:19 2017 -0700"
      },
      "committer": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Wed Apr 19 18:46:44 2017 +0000"
      },
      "message": "libc: fix typo in __RENAME macro\n\nApparently __strncpy_real redirects to strcpy instead of strncpy for GCC\nbuilds. This is bad, and it confused a project compiled by GCC that uses\nstrcpy.\n\nI audited all of the FORTIFY-related __RENAMEs both manually and with a\nscript I hacked together; they all look correct aside from this one.\n\nFWIW, with the cleaned up clang FORTIFY, lots of the `void foo()\n__RENAME(foo)` will just become `void foo()` if this last thing I\u0027m\nworking on gets through review.\n\nBug: 35329524\nTest: Previously broken project now seems to work. Bullhead and Ryu\nboth build + boot.\n\nChange-Id: Ib18ee3535ae31eb7e8ae846dc012f9b64cac80bf\n"
    },
    {
      "commit": "278d31d36e7a1682eef1f80aef204e4ad953c2fc",
      "tree": "002f4245ecbba33301e0c25b0c7aa56d48726b85",
      "parents": [
        "1261f29631397df3c6a6e3a53399ada5ee1ef69f",
        "bd3d2088d99f45babb8a73192b53b6fd91930af3"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Wed Apr 05 23:57:12 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Apr 05 23:57:13 2017 +0000"
      },
      "message": "Merge \"libc: add const-correct string.h overloads\""
    },
    {
      "commit": "19710f761b4134d653936fde88f3c4477ab2128e",
      "tree": "2bd14bdc7f9462bab7c67e241a87e1ea90c52c33",
      "parents": [
        "07807a10a2dfa85a952ee8c06188d0bc9597c184"
      ],
      "author": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Wed Apr 05 13:24:05 2017 -0700"
      },
      "committer": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Wed Apr 05 13:30:52 2017 -0700"
      },
      "message": "libc: remove newlines in prototypes in string.h\n\nThis gives more useful diagnostics if clang needs to mention these\nfunctions (or a parameter of them).\n\nBug: 36984245\nTest: m on bullhead completes successfully.\nChange-Id: I17c2b624d08bc9dd3f08185b30029ed0c49ebb08\n"
    },
    {
      "commit": "bd3d2088d99f45babb8a73192b53b6fd91930af3",
      "tree": "0533adb1ea5e0af98272e39ff9dc8e7fd3bdbf83",
      "parents": [
        "07807a10a2dfa85a952ee8c06188d0bc9597c184"
      ],
      "author": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Tue Apr 04 17:34:02 2017 -0700"
      },
      "committer": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Wed Apr 05 13:17:07 2017 -0700"
      },
      "message": "libc: add const-correct string.h overloads\n\nlibcxx provides const-correct overloads for a few string.h functions.\nThese overloads use clang\u0027s enable_if attribute, so they\u0027re preferred\nover our FORTIFY\u0027ed equivalents.\n\nThis weakens _FORTIFY_SOURCE\u003d2 when used with some of these functions,\nsince clang needs to see __pass_object_size in order to pass an accurate\nresult for __builtin_object_size(s, 1) at a callsite. Since those\nfunctions don\u0027t have __pass_object_size on their params, clang can\u0027t do\nthat. This makes LLVM lower the __builtin_object_size calls, which means\nwe get the same result as __builtin_object_size(s, 0).\n\nWe have to provide all of the overloads in Bionic, since enable_if is\nonly used to disambiguate overloads with (otherwise) the same type. In\nother words:\n\n// overload 1\nchar *strchr(const char *, int s) __attribute__((enable_if(1, \"\")));\n// overload 2\nchar *strchr(char *, int s);\n\nvoid foo() {\n  char cs[1] \u003d {};\n  strchr(static_cast\u003cconst char *\u003e(cs), \u0027\\0\u0027); // calls overload #1.\n  strchr(cs, \u0027\\0\u0027); // calls overload #2.\n}\n\nBug: 34747525\nTest: m checkbuild on bullhead internal master + AOSP. vts -m\nBionicUnitTests passes on both. Surprisingly, the only code that this\nseems to break is contained in Bionic.\n\nChange-Id: Ie406f42fb3d1c5bf940dc857889876fc39b57c90\n"
    },
    {
      "commit": "bce9a7d51898f73d8e3cef2c4a437bf08698430f",
      "tree": "cb3eaf96756e7c41344e3f1b5465e95a80fb9aa2",
      "parents": [
        "4df5ca1e0254790d41f945352a93f5c783ea8de0"
      ],
      "author": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Mon Apr 03 18:03:36 2017 -0700"
      },
      "committer": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Tue Apr 04 11:12:18 2017 -0700"
      },
      "message": "libc: use __bos instead of __bos0 for strchr.\n\nI dunno why I used __bos0 in the first place; clang\u0027s strrchr (and\nGCC\u0027s strchr+strrchr) both use __bos.\n\nBug: 34747525\nTest: m. Device still boots. cts -m BionicUnitTests shows no new\nfailures.\nChange-Id: Ifec0e05a6a1144fa3e3ac70562af3ec57c09c194\n"
    },
    {
      "commit": "9c2094f3c527301068f2049eefd9e684a7995352",
      "tree": "e5c03a364d9abadd8c2d0cc63e865e81d4cfc4c2",
      "parents": [
        "8b154b1e8233e1d34a6a66b72369f05f8655b653"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Feb 14 19:28:18 2017 -0800"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Feb 14 22:22:13 2017 -0800"
      },
      "message": "Fixup API level guards for new fortify functions.\n\nTest: tools/update_headers.sh \u0026\u0026 make checkbuild\nBug: None\nChange-Id: I9d06ea8a5ee9dc27d957f59e6e84150651ed1c76\n"
    },
    {
      "commit": "8b154b1e8233e1d34a6a66b72369f05f8655b653",
      "tree": "dd79c943d9db486842c8e4402cbd529ea2066f1d",
      "parents": [
        "9fc52deab1c6bec6a37860242eafe1ae4c205e44"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Feb 14 16:33:06 2017 -0800"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Feb 14 19:29:31 2017 -0800"
      },
      "message": "Guard the GNU strerror_r with an API check.\n\nThe deprecated headers have always had only the POSIX definition\navailable (and it\u0027s always been available). With the unified headers\nas they are now, we actually make it unavailable for C++ users (C++\nimplies _GNU_SOURCE) targeting below M. Adding this guard means that\npre-M users will still at least get the POSIX one.\n\nIt\u0027s not great that moving to M as your target API will actually\nchange the signature of your strerror_r, but I don\u0027t see a better\noption here (not until we have the compatibility library, anyway).\n\nTest: make checkbuild\nBug: None\nChange-Id: I2d15702467533a826c4ec10fd973ee929d2b562a\n"
    },
    {
      "commit": "156d5a8ae93c6515919dd6706481991c7c0dc600",
      "tree": "babd491737f6965d7c6910869b435e5e47cf7cdc",
      "parents": [
        "e86a8d605b3df0c396e23ee02933c76d7040a73b"
      ],
      "author": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Fri Feb 10 13:56:22 2017 -0800"
      },
      "committer": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Fri Feb 10 18:14:43 2017 -0800"
      },
      "message": "Match __bos0 to __pass_object_size0 in FORTIFY\n\npass_object_size(N) forwards the result of __builtin_object_size(param,\nN) to a function. So, a function that looks like:\n\n  size_t foo(void *const p __pass_object_size) { return __bos0(p); }\n  int bar \u003d foo(baz);\n\nwould effectively be turned into\n\n  size_t foo(void *const p, size_t sz) { return sz; }\n  int bar \u003d foo(baz, __bos(baz)); // note that this is not __bos0\n\nThis is bad, since if we\u0027re using __bos0, we want more relaxed\nobjectsize checks.\n\n__bos0 should be more permissive than __bos in all cases, so this\nchange Should Be Fine™.\n\nThis change also makes GCC and clang share another function\u0027s\nimplementation (recv). I just realized we need to add special\ndiagnostic-related overloads bits for clang to it, but I can do that in\nanother patch.\n\nBug: None\nTest: Bullhead builds and boots; CtsBionicTestCases passes.\nChange-Id: I6818d0041328ab5fd0946a1e57321a977c1e1250\n"
    },
    {
      "commit": "7cc779f15c524e1622f7d5b1c7e82e6ffc6677fd",
      "tree": "0f995c0878649447ef160e727505ae81495dcdde",
      "parents": [
        "2bfb8c9180603bac97dca2d8e359f71bb11f7126"
      ],
      "author": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Thu Feb 09 00:00:31 2017 -0800"
      },
      "committer": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Thu Feb 09 15:49:32 2017 -0800"
      },
      "message": "libc: add clang FORTIFY support\n\nThis patch adds clang-style FORTIFY to Bionic. For more information on\nFORTIFY, please see https://goo.gl/8HS2dW . This implementation works\nfor versions of clang that don\u0027t support diagnose_if, so please see the\n\"without diagnose_if\" sections. We plan to swap to a diagnose_if-based\nFORTIFY later this year (since it doesn\u0027t really add any features; it\njust simplifies the implementation a lot, and it gives us much prettier\ndiagnostics)\n\nBug: 32073964\nTest: Builds on angler, bullhead, marlin, sailfish. Bionic CTS tests\npass on Angler and Bullhead.\n\nChange-Id: I607aecbeee81529709b1eee7bef5b0836151eb2b\n"
    },
    {
      "commit": "5bc78c8bcd0c1e634c04029309ede3ec05f2d424",
      "tree": "ba41f009cdf5fb27c766b4efe05c4cbb566d2a85",
      "parents": [
        "8945d5e43a25737f3f888a90742cc918b1124a05"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Nov 16 11:35:43 2016 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Nov 16 16:55:42 2016 -0800"
      },
      "message": "Add and use constants for the Android API levels.\n\nTest: bionic tests still pass\nChange-Id: If1b619cfc9db1d3f5d91f14f2ace71058dca0c4a\n"
    },
    {
      "commit": "a3ce418ca6ad440d19c98e15132a76a877eb0bdc",
      "tree": "58f66cc6dc1d48da0d67a0c409a3f534ed90f1e3",
      "parents": [
        "9b908c8e36a6e644d5c42a7ed549ae7d4ab57667"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon Oct 31 16:20:47 2016 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon Oct 31 16:47:22 2016 -0700"
      },
      "message": "Revert \"Add legacy inlines for locale aware APIs.\"\n\nWe can\u0027t really add these to the unified headers yet since we\u0027re\nstill using the old headers as well, and libandroid_support needs to\nwork with both. These functions are already defined in\nlibandroid_support, so when using unified headers we\u0027ll get duplicate\ndefinitions.\n\nThis was only going to be a temporary solution anyway. Instead we\u0027ll\njust rely on libandroid_support (and eventually its rewrite) to handle\nthese.\n\nThis reverts commit 6576a3749bd3805508294bfcac3d9658fc0f8d6e.\n\nTest: ./tools/update_headers.py \u0026\u0026 make ndk \u0026\u0026 make native\n      # Copied into working directory for unified headers NDK work.\n      ndk/checkbuild.py\n      ndk/run_tests.py --force-unified-headers\nBug: None\n\nChange-Id: I5762e815e2030c89d7f2540df08dd67b6c2d10a5\n"
    },
    {
      "commit": "95fa061678400315ee757758bf5f9146176d47a0",
      "tree": "0b3428e9d7d274e79809471c1d7ae3896a10ff03",
      "parents": [
        "1d20532f5c5f8c1638735eb04586be82a7d0379c"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Sep 28 12:29:52 2016 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Sep 28 12:36:38 2016 -0700"
      },
      "message": "Rename __pure, __pure2, and __purefunc.\n\nThese names were pretty misleading (aka \"backwards\"), so switch to the\nsame obvious names glibc uses.\n\nTest: build.\nChange-Id: Ia98c9dbbccd0820386116562347654e84669034a\n"
    },
    {
      "commit": "6cd9fb080caca2d0d8fcb8f400c1ec466e7b2466",
      "tree": "100dbbffe89a02329ac0effd96ea3c322a2b9a77",
      "parents": [
        "01733796100d63baf0b27f647fed98894e05a29a"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Sep 23 14:06:05 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Sep 23 14:34:03 2016 -0700"
      },
      "message": "Fix warnings (and errors) in static inline headers.\n\nBug: http://b/31676510\nChange-Id: Idcbc544e498f7e6bbe99c2bf7dc557a5681e96c4\nTest: preupload hook\n"
    },
    {
      "commit": "6576a3749bd3805508294bfcac3d9658fc0f8d6e",
      "tree": "d076b59a7c20d15f392428e9cf4c1e06e601b1b7",
      "parents": [
        "3103f6d39e4ae309a9374ee38f414400c889c558"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Sep 21 01:16:13 2016 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Sep 22 00:44:37 2016 -0700"
      },
      "message": "Add legacy inlines for locale aware APIs.\n\nTest: make checkbuild tests\nBug: http://b/31639993\nChange-Id: Ic43d690dff3c6960d7826bd0b064640a3ea0e883\n"
    },
    {
      "commit": "e5dd632e43dd81f293afdb93a6556d40d7007765",
      "tree": "f96f073e8c2661f23f67b3094d549056fca0befb",
      "parents": [
        "519a4f2c05a20a9ab60a518a6a46ba8ddcfc2c51"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Sep 07 16:43:59 2016 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Sep 08 13:08:47 2016 -0700"
      },
      "message": "Move strncpy fortify into android-21.\n\n__strncpy_chk2 wasn\u0027t added until android-21.\n\nTest: make checkbuild\nBug: None\nChange-Id: I527f88aca55ef5010e12ece18abbdce3d54ce252\n"
    },
    {
      "commit": "dfa6bbb54bd9ab2a71df4c066427ea804608e20b",
      "tree": "41b5baebfa354e4530ca190031789362c31de785",
      "parents": [
        "ed9e6a41c92c9552be84ecc126e29b4604eee246"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Aug 02 15:08:32 2016 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri Aug 05 16:33:32 2016 -0700"
      },
      "message": "Guard fortify inlines with __ANDROID_API__.\n\nTest: make checkbuild with libc ndk_library patches applied\nChange-Id: Ic5e248994c4f2702b0f4d6dfeda787187ea86017\n"
    },
    {
      "commit": "5470c183611737af5ec954984e4bdb5da8c99b73",
      "tree": "945f64e45be1c14ea0a6c75f6611555ef2b706ae",
      "parents": [
        "237366867a4fbd8c2fed74512ca26d2ce3b39b82"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Jul 22 11:36:17 2016 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Jul 22 13:12:53 2016 -0700"
      },
      "message": "Make it possible to build bionic with -I instead of -isystem.\n\nVarious things:\n\n* work around -Wnullability-completeness.\n* use C++ casts in C++ and C casts in C.\n* stop using attributes clang doesn\u0027t support (such as `warning`).\n* remove duplicate definitions of XATTR_CREATE and XATTR_REPLACE.\n\nChange-Id: I07649e46275b28a23ca477deea119fe843999533\n"
    },
    {
      "commit": "46b44160e9e4c466be0faf1bb8d6ec70ecc83273",
      "tree": "80036c736b6315189745423724f1d69cb3b74682",
      "parents": [
        "6e9c1f61d8ea04d35d18709e373da355ca32e523"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri May 27 11:14:16 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Jun 02 13:40:35 2016 -0700"
      },
      "message": "Update header versions for NDK platform fixes.\n\nBug: http://b/28178111\nChange-Id: Icd638673b409aa43a91490f77c6b4d79c9ea20d9\n"
    },
    {
      "commit": "baa2a973bd776a51bb05a8590ab05d86eea7b321",
      "tree": "ec24271fcc30be277ea654ef8425f4a109732f17",
      "parents": [
        "7ee8e299ba5dc7bb68c88931b04b10a69cf0f21f"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Aug 13 16:58:50 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu May 05 17:11:54 2016 -0700"
      },
      "message": "Use clang\u0027s nullability instead of nonnull.\n\nhttp://clang.llvm.org/docs/AttributeReference.html#nonnull\n\n_Nonnull is similar to the nonnull attribute in that it will instruct\ncompilers to warn the user if it can prove that a null argument is\nbeing passed. Unlike the nonnull attribute, this annotation indicated\nthat a value *should not* be null, not that it *cannot* be null, or\neven that the behavior is undefined. The important distinction is that\nthe optimizer will perform surprising optimizations like the\nfollowing:\n\n    void foo(void*) __attribute__(nonnull, 1);\n\n    int bar(int* p) {\n      foo(p);\n\n      // The following null check will be elided because nonnull\n      // attribute means that, since we call foo with p, p can be\n      // assumed to not be null. Thus this will crash if we are called\n      // with a null pointer.\n      if (src !\u003d NULL) {\n        return *p;\n      }\n      return 0;\n    }\n\n    int main() {\n      return bar(NULL);\n    }\n\nNote that by doing this we are no longer attaching any sort of\nattribute for GCC (GCC doesn\u0027t support attaching nonnull directly to a\nparameter, only to the function and naming the arguments\npositionally). This means we won\u0027t be getting a warning for this case\nfrom GCC any more. People that listen to warnings tend to use clang\nanyway, and we\u0027re quickly moving toward that as the default, so this\nseems to be an acceptable tradeoff.\n\nChange-Id: Ie05fe7cec2f19a082c1defb303f82bcf9241b88d\n"
    },
    {
      "commit": "14adff1cfa06a3d4d3281a9bf7848b556d84c20d",
      "tree": "ce1fb2867f69e49f57d0bbe8a9099b09beda0c19",
      "parents": [
        "5a3d5cac642f9e58b2c510eab23789fb4fc3a753"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Apr 29 12:00:55 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Apr 29 16:39:50 2016 -0700"
      },
      "message": "Add versioning information to symbols.\n\nBug: http://b/28178111\nChange-Id: I46bf95accd819f4521afb1173d8badcc5e9df31c\n"
    },
    {
      "commit": "c3cec27ad75544fdd1a5efc78260404a7de564bf",
      "tree": "cb8ea8ee6fe4a6ac2929ffa58261d0a5b57bc3d0",
      "parents": [
        "0d8e14190680b20e8a0fa75c63075ef73a922efd"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Apr 07 13:39:49 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Apr 07 18:01:59 2016 -0700"
      },
      "message": "Extract strcasecmp and friends to \u003cbits/strcasecmp.h\u003e.\n\nBug: http://b/28067717\nChange-Id: I76bab098d4c35d07a7a108055c43c820087f9253\n"
    },
    {
      "commit": "eb9b9250122080df4a11293b9b6679e0b63ae2dd",
      "tree": "5a01876fa83ca1e74bb7611f63c1af9ca19f06b5",
      "parents": [
        "e07558fb80da4e196e8b7e371041c1e75c56b29b"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Nov 03 18:46:02 2015 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Nov 04 14:19:55 2015 -0800"
      },
      "message": "Fix GNU/POSIX basename headers.\n\nIncluding glibc\u0027s \u003clibgen.h\u003e will result in the user getting the POSIX\nversion of basename always, regardless of when it is included relative\nto \u003cstring.h\u003e. Prior to this patch, our implementation would result in\nthe one that\u0027s included first winning.\n\nBug: http://b/25459151\nChange-Id: Id4aaf1670dad317d6bbc05763a84ee87596e8e59\n"
    },
    {
      "commit": "7ac3c128bb5df83cb001cb50b6a5ee4da9a0b0e0",
      "tree": "c942f25efe8d5147ce59cb841806b2ed858fe928",
      "parents": [
        "4d5c4f085bc880af838d50f6bbd60d86e800b6e1"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Aug 26 09:59:29 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Aug 26 09:59:29 2015 -0700"
      },
      "message": "Add strchrnul.\n\nBug: http://b/18374026\nChange-Id: Iea923309c090a51a2d41c5a83320ab3789f40f1c\n"
    },
    {
      "commit": "4ae773633aac9ceba5ec62bb8e1aa22c3c56ebde",
      "tree": "08855d690e35a16d9c1cbe68148da64f54f5ebd1",
      "parents": [
        "3875744f89600027c69ea68650fff1eeb4b29723"
      ],
      "author": {
        "name": "Daniel Micay",
        "email": "danielmicay@gmail.com",
        "time": "Fri Apr 17 18:16:57 2015 -0400"
      },
      "committer": {
        "name": "Daniel Micay",
        "email": "danielmicay@gmail.com",
        "time": "Fri Apr 17 21:17:12 2015 -0400"
      },
      "message": "add fortified memchr/memrchr implementations\n\nChange-Id: I38c473cc0c608b08f971409a95eb8b853cb2ba1c\n"
    },
    {
      "commit": "3cfb52aab2548df635e9672218cc433e14922fd3",
      "tree": "eebbf162a1e5e1ed8726a9129ea17a410ebaa3ed",
      "parents": [
        "3e1b5f46c07aef5983ecf2feb1c3369b2cd200c0"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Feb 18 21:29:13 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Feb 18 22:02:56 2015 -0800"
      },
      "message": "Add GNU extensions mempcpy and wmemcpy.\n\nUsed by elfutils. On the bright side, they stopped using __mempcpy.\n\nBug: 18374026\nChange-Id: Id29bbe6ef1c5ed5a171bb6c32182f129d8332abb\n"
    },
    {
      "commit": "5038b19cef207b526f9993951e4a04c8df91ce1d",
      "tree": "0b28230d8ca0b0cd311a0d2a590f04b6f17e4da2",
      "parents": [
        "cd1959b0c506cfa9e89ac7deb56bdb6461b28c3a"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jan 28 21:02:34 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jan 29 20:12:13 2015 -0800"
      },
      "message": "Break two incorrect transitive includes.\n\nChange-Id: I95519caa5258cf5c6b8053f1c7e08ade2a824e49\n"
    },
    {
      "commit": "76f8916b904db14facf811ae44e1265261349702",
      "tree": "cf49d5313eb0e5a05463dbe519de48d4fddf84a9",
      "parents": [
        "419ed122aa21cf04334f21baab135ac4f9f49840"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jan 26 13:34:58 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jan 26 14:28:41 2015 -0800"
      },
      "message": "Clean up \u003cstdlib.h\u003e slightly.\n\nInterestingly, this mostly involves cleaning up our implementation of\nvarious \u003cstring.h\u003e functions.\n\nChange-Id: Ifaef49b5cb997134f7bc0cc31bdac844bdb9e089\n"
    },
    {
      "commit": "b20c24456e43df430ec5626a68e5dc0dc6929344",
      "tree": "c9b85b4d913f8f2738bdc8772b9b9a21d6ab51dc",
      "parents": [
        "08a70184b42ef2963794a56233b0253e0b367253"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Nov 06 15:04:08 2014 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Nov 06 15:52:22 2014 -0800"
      },
      "message": "Implement all the POSIX _l functions.\n\nStrictly speaking, this only implements the _l variants of the functions\nwe actually have. We\u0027re still missing nl_langinfo_l, for example, but we\ndon\u0027t have nl_langinfo either.\n\nChange-Id: Ie711c7b04e7b9100932a13f5a5d5b28847eb4c12\n"
    },
    {
      "commit": "658727e111ed6dee7be5239494f0764f7b1b02f8",
      "tree": "253051956500d39d0a9e8d282aacebe78dc21def",
      "parents": [
        "eeb9aa02b7f307a1d9b80731dd69ef9dd2f47e47"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Oct 07 11:10:36 2014 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Oct 07 16:46:47 2014 -0700"
      },
      "message": "Inline helpers need to be exported unmangled.\n\n__open_2() is used by the fortify implementation of open(2) in\nfcntl.h, and as such needs an unmangled C name. For some reason\n(inlining?), this doesn\u0027t cause problems at the default optimization\nlevel, but does for -O0.\n\nThe rest of these didn\u0027t cause build failures, but they look suspect\nand probably will, we just haven\u0027t caught them yet.\n\nBug: 17784968\nChange-Id: I7391a7a8999ee204eaf6abd14a3d5373ea419d5b\n"
    },
    {
      "commit": "b84f667e9312611536a564700daea11c12b6fcfa",
      "tree": "f28e9b9edd7b0d27a233febe1e301523e6112cee",
      "parents": [
        "ae97a776ea900e5923d6d320d72dcc04b224796e"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sun Oct 05 06:52:24 2014 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sun Oct 05 06:52:24 2014 -0700"
      },
      "message": "further cleanup memcpy fortify implementation\n\nChange-Id: I0380f3c8ca8f9bb8a206accd839c32c9daf13c56\n"
    },
    {
      "commit": "48be71d02b6cc4e6493d38cdd6b7779032c38901",
      "tree": "5c562cf12fcb46b262782fc0893d26c13366dafa",
      "parents": [
        "4ef0e59f339ad138eabe3bc408beda6004f5ea83"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Oct 04 15:20:00 2014 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Oct 04 15:20:00 2014 -0700"
      },
      "message": "string.h: remove unused variable\n\nChange-Id: I08b7dab1b374ad427fcbee4183f2c7d93d0199a9\n"
    },
    {
      "commit": "416d7ddaff0946d480b6aa945a741b3eeaca5569",
      "tree": "d3fa6382f7d6d26ab7e3ecb95a715328e5f50b5e",
      "parents": [
        "f4e721dd519db89c504c8944763811a3df956b32"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Aug 18 17:28:32 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Aug 28 16:37:09 2014 -0700"
      },
      "message": "Add GNU-compatible strerror_r.\n\nWe already had the POSIX strerror_r, but some third-party code defines\n_GNU_SOURCE and expects to get the GNU strerror_r instead.\n\nThis exposed a bug in the libc internal logging functions where unlike\ntheir standard brethren they wouldn\u0027t return the number of bytes they\u0027d\nhave liked to have written.\n\nBug: 16243479\nChange-Id: I1745752ccbdc569646d34f5071f6df2be066d5f4\n"
    },
    {
      "commit": "09c39d6df0e952620f8c1751377b559a04e023aa",
      "tree": "1ca25e04d3ed7ebea1dde6f4d3baaeee9526c0e5",
      "parents": [
        "c5d6df6f2fe57fd5aadbd9ebb131023234c30a0c"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Aug 19 14:30:30 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Aug 19 14:30:30 2014 -0700"
      },
      "message": "Implement the GNU basename(3) in addition to the POSIX one.\n\nCode like perf(1) needs this.\n\nBug: 11860789\nChange-Id: I907eb448052a7b165e4012d74303330d32328cb2\n"
    },
    {
      "commit": "2cfb4e8e2e217ef0e4140dcbf9b3da809781158c",
      "tree": "19a83c3a73ba3c613de106fd1b6ae8e83f75d3d4",
      "parents": [
        "2b6cdb5e459661727c99e81660c7c3df5cdbe024"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Aug 18 14:45:42 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Aug 18 14:45:42 2014 -0700"
      },
      "message": "Improve \u003csys/cdefs.h\u003e.\n\nFix and use __RENAME (and lose ___RENAME --- two underscores should be\nenough for anybody). This was the point of this change, because I want\nto use __RENAME to support the two basename variants and the two\nstrerror_r variants.\n\nLose a bunch of macros that weren\u0027t being used.\n\nLose three dead files from the DNS code.\n\nChange-Id: I3ef645c566b16a52217bc2e68c7d54b37c7c9522\n"
    },
    {
      "commit": "28285f85a1c15c5b500b78ed63f12dd8eddb8ac9",
      "tree": "c0001d2d3ca85b5b8069ea568d6ea02a55188ffe",
      "parents": [
        "8b91980e4c139558f9cca4e9a0980dad07c06e68"
      ],
      "author": {
        "name": "Dehao Chen",
        "email": "dehao@google.com",
        "time": "Tue Aug 05 15:23:00 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Aug 06 11:43:38 2014 -0700"
      },
      "message": "Workaround b/16818336 which fails build under aggressive inlining.\n\n(cherry-pick of 7aa27e1c1a53afe28f6180fd1fc50d096cabea7b.)\n\nChange-Id: Ifcd596714c427a2ec39502b9c0af9082ded91884\n"
    },
    {
      "commit": "dfb5ce42bcc5a275af49211c0bbe64c5ec3d2668",
      "tree": "4ff3d2f96f0c5e00edac99cd86119f2ecc5cfa73",
      "parents": [
        "76df69d1f5cbbc8a2c1e899bc1ad5ada8b083e1e"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 09 22:51:34 2014 +0000"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri Jul 11 16:21:31 2014 +0000"
      },
      "message": "Revert \"Revert \"Add locale aware APIs.\"\"\n\nThis reverts commit 063e20c26943ec82ef1d53a544545e79054e93d3.\n\nChange-Id: Ib8c9004efefe75a5346b3af50dfe37952d91eb21\n"
    },
    {
      "commit": "063e20c26943ec82ef1d53a544545e79054e93d3",
      "tree": "486076b9e0dd6439cea5f0108ecf6154df6e4aab",
      "parents": [
        "e087eac404b0e30de427392065e2750acf92bd4a"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 09 22:50:43 2014 +0000"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 09 22:50:43 2014 +0000"
      },
      "message": "Revert \"Add locale aware APIs.\"\n\nAccidentally verified against a dirty tree. Needs the companion change to libc++ to land upstream before I can submit this.\n\nThis reverts commit e087eac404b0e30de427392065e2750acf92bd4a.\n\nChange-Id: I317ecd0923114f415eaad7603002f77feffb5e3f\n"
    },
    {
      "commit": "e087eac404b0e30de427392065e2750acf92bd4a",
      "tree": "c547e35ffc82ee9afd441d2e3739a87de73103fd",
      "parents": [
        "6cdd0cfd2f279dfb20b9f7cccc963eb9ee91c666"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 09 10:09:04 2014 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 09 15:41:53 2014 -0700"
      },
      "message": "Add locale aware APIs.\n\nSince we only support the C locale, we can just forward all of these to\ntheir non-locale equivalents for correct behavior.\n\nChange-Id: Ib7be71b7f636309c0cc3be1096a4c1f693f04fbb\n"
    },
    {
      "commit": "40fca0f08b1eb87e283d6f634d9759ed3161f517",
      "tree": "22a02418b0c225b4e994d8625970c3affe900eda",
      "parents": [
        "431aa4dc9282e23231ba9243f43fd3d49b5f88b3"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jun 04 08:53:33 2014 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jun 05 11:05:10 2014 -0700"
      },
      "message": "Removes index() from bionic.\n\nThis function has been removed from POSIX.\n\nUnfortunately, we can\u0027t leave #define index(a, b) strchr((a), (b)) in its place\nbecause defining a preprocessor macro for index() breaks a whole lot of code.\n\nBug: 13935372\nChange-Id: Ifda348acde06da61c12e7ee2f8fe6950a3174dd1\n"
    },
    {
      "commit": "950a58e24d1019eb9d814dbb16f111a6b61e3f23",
      "tree": "5a91099e0ce1b9d552e7210fb914ba8d4d5ddb10",
      "parents": [
        "5f149f1bdef31d198c0e84fd8c904204d263e825"
      ],
      "author": {
        "name": "Christopher Ferris",
        "email": "cferris@google.com",
        "time": "Fri Apr 04 14:38:18 2014 -0700"
      },
      "committer": {
        "name": "Christopher Ferris",
        "email": "cferris@google.com",
        "time": "Mon Apr 07 16:41:53 2014 -0700"
      },
      "message": "Add stpcpy/stpncpy.\n\nAdd tests for the above.\n\nAdd the fortify implementations of __stpcpy_chk and __stpncpy_chk.\n\nModify the strncpy test to cover more cases and use this template for\nstpncpy.\n\nAdd all of the fortify test cases.\n\nBug: 13746695\nChange-Id: I8c0f0d4991a878b8e8734fff12c8b73b07fdd344\n"
    },
    {
      "commit": "152b9de19ade833ada124390ef153e53d3d3e2ed",
      "tree": "96e0f98537c7420007bbb3452dcbe5d57bbf5fe3",
      "parents": [
        "638e7892c63c9d6968c0cf2e98ace89b9c5b2f26"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Mar 10 15:54:40 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Mar 10 15:54:40 2014 -0700"
      },
      "message": "Remove non-standard memswap.\n\nChange-Id: I06548dda339987b755ef7139c590ca3e1f9fe0a9\n"
    },
    {
      "commit": "53e43292aac91bf62995788cd5ca2ceb7caea283",
      "tree": "003679a1e2288bad947f714ee45bfa6febf479b6",
      "parents": [
        "ba40a560176e6ea753d09a6a71343b81ea4c8c1e"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Feb 24 18:00:43 2014 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Feb 24 18:02:05 2014 -0800"
      },
      "message": "More OpenBSD cleanup (primarily string).\n\nThis patch removes the string/ and wchar/ directories.\n\nChange-Id: Ia489904bc67047e4bc79acb1f3eec21aa3fe5f0d\n"
    },
    {
      "commit": "d13c2b1ba6681fdbee73a044d988c3f9e1172d30",
      "tree": "009f871a52478fef08570ac9365b5be3af08c397",
      "parents": [
        "8427b7450fe068db6484d161f7004661c4698858"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Sep 27 13:21:24 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Sep 27 13:21:24 2013 -0700"
      },
      "message": "Fix unnecessary call to __strncpy_chk2\n\nIf \"n\" is smaller than the size of \"src\", then we\u0027ll\nnever read off the end of src. It makes no sense to call\n__strncpy_chk2 in those circumstances.\n\nFor example, consider the following code:\n\nint main() {\n  char src[10];\n  char dst[5];\n  memcpy(src, \"0123456789\", sizeof(src));\n  strncpy(dst, src, sizeof(dst));\n  dst[4] \u003d \u0027\\0\u0027;\n  printf(\"%s\\n\", dst);\n  return 0;\n}\n\nIn this code, it\u0027s clear that the strncpy will never read off\nthe end of src.\n\nChange-Id: I9cf58857a0c5216b4576d21d3c1625e2913ccc03\n"
    },
    {
      "commit": "3c4b50fd8cce143d9ba8f03a93f0fccba4e54d14",
      "tree": "f1db656c0c18b55cdbb471f413c05701a4e055b8",
      "parents": [
        "99b859cf786f208300f7fc3a6fa5b570c3333433"
      ],
      "author": {
        "name": "Pavel Chupin",
        "email": "pavel.v.chupin@intel.com",
        "time": "Fri Jul 26 16:50:11 2013 +0400"
      },
      "committer": {
        "name": "Pavel Chupin",
        "email": "pavel.v.chupin@intel.com",
        "time": "Tue Sep 03 16:20:52 2013 +0400"
      },
      "message": "Fix strchr for basic non-sse case on x86\n\nFix source location. Move declaration of __strchr_chk out of\nifdef __BIONIC_FORTIFY which should be available for strchr.cpp\ncompilation when __BIONIC_FORTIFY is not defined.\n\nChange-Id: I552a6e16656e59b276b322886cfbf57bbfb2e6a7\nSigned-off-by: Pavel Chupin \u003cpavel.v.chupin@intel.com\u003e\n"
    },
    {
      "commit": "bd8e6749b78567af62ec126d7cc057386ebee25a",
      "tree": "949ca8147c4675afb9f0af51e404f535dbd38a93",
      "parents": [
        "eb8f36223e51db626a23b8032f03c095be80998b"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 28 13:22:52 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 28 14:27:14 2013 -0700"
      },
      "message": "cdefs.h: introduce __bos0\n\nIntroduce __bos0 as a #define for __builtin_object_size((s), 0).\nThis macro is intended to be used for places where the standard\n__bos macro isn\u0027t appropriate.\n\nmemcpy, memmove, and memset deliberately use __bos0. This is done\nfor two reasons:\n\n1) I haven\u0027t yet tested to see if __bos is safe to use.\n2) glibc uses __bos0 for these methods.\n\nChange-Id: Ifbe02efdb10a72fe3529dbcc47ff647bde6feeca\n"
    },
    {
      "commit": "93501d3ab81156bcef251bb817a49e9ca46a6ec1",
      "tree": "38deed513bd1e1ec2cc316a4bd5de6689ee991da",
      "parents": [
        "2557433d8ea4c489f061170822f34f038b930b96"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 28 10:47:43 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 28 12:39:06 2013 -0700"
      },
      "message": "FORTIFY_SOURCE: introduce __strncpy_chk2\n\nThis change detects programs reading beyond the end of \"src\" when\ncalling strncpy.\n\nChange-Id: Ie1b42de923385d62552b22c27b2d4713ab77ee03\n"
    },
    {
      "commit": "a6cde392765eb955cb4be5faa6ee62dcf77e8aa5",
      "tree": "c1553a2002af8470615afecb1a2fff9c29c2f916",
      "parents": [
        "227b47a461b27d746b373feb66001cdddc9ba1db"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Jun 29 08:15:25 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Jun 29 08:16:22 2013 -0700"
      },
      "message": "More FORTIFY_SOURCE functions under clang\n\n* bzero\n* umask\n* strlcat\n\nChange-Id: I65065208e0b8b37e10f6a266d5305de8fa9e59fc\n"
    },
    {
      "commit": "8bafa7452ec0892572b0b49f86022ce945c5e908",
      "tree": "92c021e3852b1f8b5cee464c5ff5500c84eb0f80",
      "parents": [
        "4eed65090b1f0d0d087f26bd7367da90a0cca92d"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 20 12:17:44 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 20 12:17:44 2013 -0700"
      },
      "message": "libc: enable FORTIFY_SOURCE clang strlcpy\n\nChange-Id: Idcfe08f5afc3dde592416df9eba83f64e130c7c2\n"
    },
    {
      "commit": "16d1af167f8e36a9aa4a07ae77034ad519b00463",
      "tree": "61abe872a5f2ebebc4fe15205a77158bc8372ec2",
      "parents": [
        "b24c0637d06fe0980b9e13a8d0c3e6f4dbda9cd5"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Jun 17 14:49:19 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 18 12:14:20 2013 -0700"
      },
      "message": "libc: add limited FORTIFY_SOURCE support for clang\n\nIn 829c089f83ddee37203b52bcb294867a9ae7bdbc, we disabled all\nFORTIFY_SOURCE support when compiling under clang. At the time,\nwe didn\u0027t have proper test cases, and couldn\u0027t easily create targeted\nclang tests.\n\nThis change re-enables FORTIFY_SOURCE support under clang for a\nlimited set of functions, where we have explicit unittests available.\nThe functions are:\n\n* memcpy\n* memmove\n* strcpy\n* strncpy\n* strcat\n* strncat\n* memset\n* strlen (with modifications)\n* strchr (with modifications)\n* strrchr (with modifications)\n\nIt may be possible, in the future, to enable other functions. However,\nI need to write unittests first.\n\nFor strlen, strchr, and strrchr, clang unconditionally calls the\nfortified version of the relevant function. If it doesn\u0027t know the\nsize of the buffer it\u0027s dealing with, it passes in ((size_t) -1),\nwhich is the largest possible size_t.\n\nI added two new clang specific unittest files, primarily copied\nfrom fortify?_test.cpp.\n\nI\u0027ve also rebuild the entire system with these changes, and didn\u0027t\nobserve any obvious problems.\n\nChange-Id: If12a15089bb0ffe93824b485290d05b14355fcaa\n"
    },
    {
      "commit": "b24c0637d06fe0980b9e13a8d0c3e6f4dbda9cd5",
      "tree": "918218d294c845db4b5fda6f9fb9a211a443bb54",
      "parents": [
        "977a33137d2be0093f474055f839cf665b82b588"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 18 10:46:02 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 18 12:13:52 2013 -0700"
      },
      "message": "libc: Introduce __errordecl()\n\nDefine __errordecl and replace __attribute__((__error__(\"foo\")))\nwith __errordecl. Make sure __errordecl is a no-op on clang, as it\ngenerates a compile time warning.\n\nChange-Id: Ifa1a2d3afd6881de9d479fc2adac6737871a2949\n"
    },
    {
      "commit": "cf870199d576bdfc339b7fb016c9f6fe7f2c87ed",
      "tree": "e4bdb361862de3efd9b907379d0fe3f2ad3f4ae2",
      "parents": [
        "72f59c84fd73a0a701ce6448d103e9021c1cb060"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu May 30 16:48:53 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri May 31 09:07:46 2013 -0700"
      },
      "message": "FORTIFY_SOURCE: strcat / strncat optimize\n\n__strcat_chk and __strncat_chk are slightly inefficient,\nbecause they end up traversing over the same memory region\ntwo times.\n\nThis change optimizes __strcat_chk / __strncat_chk so they\nonly access the memory once. Although I haven\u0027t benchmarked these\nchanges, it should improve the performance of these functions.\n\n__strlen_chk - expose this function, even if -D_FORTIFY_SOURCE\nisn\u0027t defined. This is needed to compile libc itself without\n-D_FORTIFY_SOURCE.\n\nChange-Id: Id2c70dff55a276b47c59db27a03734d659f84b74\n"
    },
    {
      "commit": "1c462b7a04fc6afc99d8544728dd6d8f2a471fa2",
      "tree": "ac011571325064bb82f77b4e44c7cdfbe6611585",
      "parents": [
        "b01f7afd5fd5df5f8fe925b4fe493269191b62a2"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue May 07 10:00:21 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue May 07 10:00:21 2013 -0700"
      },
      "message": "Use restrict pointers for various libc functions.\n\nAll the cool kids say this is the best thing since sliced bread.\nhttp://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html\n\nFor the most part, these changes match what glibc does.\n\nChange-Id: I176268f27f82800162fe5f2515b08d5469ea2dfe\n"
    },
    {
      "commit": "3b2e6bc9acf5223db6e9967e46066219c76ee56f",
      "tree": "2f88c2c3c967fda99f5f17c5bbaa417a52206364",
      "parents": [
        "c46871302e7bd099aaf54d91da93a2248acbf733"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Apr 30 14:19:23 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Apr 30 14:19:23 2013 -0700"
      },
      "message": "libc: upgrade strrchr to FORTIFY_SOURCE\u003d2\n\nChange-Id: I4c34c2ce22c5092c4446dc1ab55f37604c1c223f\n"
    },
    {
      "commit": "9020fd503c9eb073f70dbc239a212f8ece19359d",
      "tree": "bd7f3027f2ccaede0e78d9e789ac3579c46eff00",
      "parents": [
        "b94b2851d72187cc9095864a9c99429ee62d7786"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Apr 30 11:31:35 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Apr 30 11:31:35 2013 -0700"
      },
      "message": "libc: upgrade some libc functions to _FORTIFY_SOURCE\u003d2\n\nUpgrade the following functions:\n\n* vsnprintf\n* vsprintf\n* snprintf\n* fgets\n* strcpy\n* strcat\n* strncat\n* strlcpy\n* strlcat\n* strlen\n* strchr\n\nChange-Id: Icc036fc7f0bb317e05f7c051617887a1601271aa\n"
    },
    {
      "commit": "1aae9bd170883805f2e7975cd3dbd2502b083cc1",
      "tree": "de73c01b4e8b61a11b54e8c4ecc8de222c4b0872",
      "parents": [
        "c6dc62f09c814b9688aee83e80dcfe80cb0ef604"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Apr 29 14:07:06 2013 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Apr 29 15:22:10 2013 -0700"
      },
      "message": "strncpy: implement _FORTIFY_SOURCE\u003d2\n\nAdd support for fortify source level 2 to strncpy.\nThis will enable detection of more areas where strncpy\nis used inappropriately. For example, this would have detected\nbug 8727221.\n\nMove the fortify_source tests out of string_test.cpp, and\nput it into fortify1_test.cpp.\n\nCreate a new fortify2_test.cpp file, which copies all\nthe tests in fortify1_test.cpp, and adds fortify_source level\n2 specific tests.\n\nChange-Id: Ica0fba531cc7d0609e4f23b8176739b13f7f7a83\n"
    },
    {
      "commit": "890c8ed6ef773160cd6840a92e0d469fe530871f",
      "tree": "6689569955f500ea13697ea928386dd9c64d1af3",
      "parents": [
        "34895c1bdfa5df48ee9a7b4368b6def403f24cf1"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Mar 22 10:58:55 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Mar 22 10:58:55 2013 -0700"
      },
      "message": "Fix builds where _FORTIFY_SOURCE is off.\n\nAlso add a more intention-revealing guard so we don\u0027t have loads of\nplaces checking whether our inlining macro is defined.\n\nChange-Id: I168860cedcfc798b07a5145bc48a125700265e47\n"
    },
    {
      "commit": "538f6fc202b07219ce78de54c0e05ab81e937154",
      "tree": "a8ed6260b45d305d695f99c7aa1b96e1617caaee",
      "parents": [
        "a0259b42eba08e6d71a274fa3f770afccbb93107"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 21 17:39:06 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 21 17:39:06 2013 -0800"
      },
      "message": "Stop advertising rindex(3), which is both deprecated and unimplemented.\n\nChange-Id: I3c775d9974e49c3f76a53e46e022659657b89034\n"
    },
    {
      "commit": "a44e9afdd16105d6f36319cb538666d9cc78435a",
      "tree": "8606530bcdef438dc305894c805f0713edad5306",
      "parents": [
        "f3fe19459fd9263e8cc8a413a5313b1ec3cf3975"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jan 17 15:41:33 2013 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jan 17 15:41:33 2013 -0800"
      },
      "message": "FORTIFY_SOURCE: optimize\n\nDon\u0027t do the fortify_source checks if we can determine, at\ncompile time, that the provided operation is safe.\n\nThis avoids silliness like calling fortify source on things like:\n\n  size_t len \u003d strlen(\"asdf\");\n  printf(\"%d\\n\", len);\n\nand allows the compiler to optimize this code to:\n\n  printf(\"%d\\n\", 4);\n\nDefer to gcc\u0027s builtin functions instead of pointing our code\nto the libc implementation.\n\nChange-Id: I5e1dcb61946461c4afaaaa983e39f07c7a0df0ae\n"
    },
    {
      "commit": "57874753900865312d7d265d2ca15cb4edb00ef2",
      "tree": "344ba9328ef618db3dec557b592ec5f1f64e272e",
      "parents": [
        "5dfdb701292c53e74e319f277d808e598389c8e7"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Dec 07 09:57:01 2012 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Dec 07 09:57:01 2012 -0800"
      },
      "message": "FORTIFY_SOURCE: remove memcpy overlap checks\n\nThese checks haven\u0027t been as useful as I hoped, and it\u0027s\ncausing a false positive finding.  Remove the overlap\ncompile time checks.\n\nChange-Id: I5d45dde10ae4663d728230d41fa904adf20acaea\n"
    },
    {
      "commit": "9a4d305340e6ce2fc6c3f371f2d7ede446f8c6d4",
      "tree": "e6c29deaf1b6789aa94bb1074db1b9b554033267",
      "parents": [
        "60fb68338b7541b6022fc343857b90c088c399cd"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Dec 03 10:36:13 2012 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Dec 03 10:39:16 2012 -0800"
      },
      "message": "FORTIFY_SOURCE: fortify strrchr\n\nThis change compliments 049e58369c37fdeacd0380a6bf1e078d9baf819f\n\nChange-Id: I27d015d70a520713c7472558a3c427f546d36ee4\n"
    },
    {
      "commit": "049e58369c37fdeacd0380a6bf1e078d9baf819f",
      "tree": "039599b75477a0759c69af2295e3dd20f293caff",
      "parents": [
        "16c61f088524756ef0fa1b030719f6745eaef2db"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Nov 30 15:15:58 2012 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Nov 30 15:19:15 2012 -0800"
      },
      "message": "FORTIFY_SOURCE: fortify strchr\n\nDetect when strchr reads off the end of a buffer.\n\nChange-Id: I0e952eedcff5c36d646a9c3bc4e1337b959224f2\n"
    },
    {
      "commit": "829c089f83ddee37203b52bcb294867a9ae7bdbc",
      "tree": "95fb7297694601b1ff65ba0296cfff3a5ee66fd6",
      "parents": [
        "069c64cdf2d3da7b7ff6ea5d1041f982fb10ab22"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 29 12:40:53 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Aug 29 12:47:41 2012 -0700"
      },
      "message": "disable _FORTIFY_SOURCE under clang\n\nClang and _FORTIFY_SOURCE are just plain incompatible with\neach other.  First of all, clang doesn\u0027t understand the\n__attribute__((gnu_inline)) header. Second of all,\nClang doesn\u0027t have support for __builtin_va_arg_pack()\nand __builtin_va_arg_pack_len() (see\nhttp://clang.llvm.org/docs/UsersManual.html#c_unimpl_gcc)\n\nUntil we can resolve these issues, don\u0027t even try using\n_FORTIFY_SOURCE under clang.\n\nChange-Id: I81c2b8073bb3276fa9a4a6b93c427b641038356a\n"
    },
    {
      "commit": "d600617645e85435cf98fc30139a6945aaadc1ca",
      "tree": "0fc63ef4c40101a78a58f3f94463d5fbab7d2458",
      "parents": [
        "9a3d53fad062cdadb4df81f6998a5e09336c637b"
      ],
      "author": {
        "name": "Shih-wei Liao",
        "email": "sliao@google.com",
        "time": "Mon Aug 06 10:57:37 2012 -0700"
      },
      "committer": {
        "name": "Shih-wei Liao",
        "email": "sliao@google.com",
        "time": "Mon Aug 06 10:57:37 2012 -0700"
      },
      "message": "When compiling with clang, don\u0027t \"fortify_source\" the strlcpy and\nstrlcat.\n\nChange-Id: I91f58322f28e425ab9d22b51c23fcd6b772ede97\n"
    },
    {
      "commit": "9a3d53fad062cdadb4df81f6998a5e09336c637b",
      "tree": "4692a1999871977640b81adb826da2efb649dc4e",
      "parents": [
        "1c861728e5c8dda7589e6595f4850d77ec21a236"
      ],
      "author": {
        "name": "Shih-wei Liao",
        "email": "sliao@google.com",
        "time": "Mon Aug 06 09:50:56 2012 -0700"
      },
      "committer": {
        "name": "Shih-wei Liao",
        "email": "sliao@google.com",
        "time": "Mon Aug 06 09:50:56 2012 -0700"
      },
      "message": "When compiling with clang, don\u0027t \"fortify_source\" the strlen.\n\nAt this point, FORTIFY_SOURCE and clang are just plain incompatible.\nNeed to solve the underlying incompatibility first.\n\nChange-Id: I3366477d19461e1ec93b1c30e0c7e8145b391b9b\n"
    },
    {
      "commit": "c37fc1ab6a3ac3956a8c9ba3ac089d41969815ed",
      "tree": "8fd21828b1fc97423bbe5e3652513772260604f3",
      "parents": [
        "e1d909f71e183ac3d1e21af5bb1af35d30e9de5b"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 17:49:10 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 17:58:37 2012 -0700"
      },
      "message": "FORTIFY_SOURCE: revert memcpy changes.\n\nPerformance regressions.  Hopefully this is a temporary\nrollback.\n\nBug: 6821003\nChange-Id: I84abbb89e1739d506b583f2f1668f31534127764\n"
    },
    {
      "commit": "9b6cc223a36835c4367a036d4cfeff14d25bc742",
      "tree": "8fcd143b253225860fbd817cdad02afac00f1be8",
      "parents": [
        "260bf8cfe00f83bc579dfe81c78b75bd9973f051"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 14:46:36 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 14:49:33 2012 -0700"
      },
      "message": "FORTIFY_SOURCE: introduce __BIONIC_FORTIFY_UNKNOWN_SIZE macro\n\nReplace all occurances of \"(size_t) -1\" with a\n__BIONIC_FORTIFY_UNKNOWN_SIZE macro.\n\nChange-Id: I0b188f6cf31417d2dbef0e1bd759de3f9782873a\n"
    },
    {
      "commit": "260bf8cfe00f83bc579dfe81c78b75bd9973f051",
      "tree": "b8ff686500d30625cb9d5908ecba4895f20a1467",
      "parents": [
        "b2060b027c9eb2748895b53a0d69d40b52371a4e"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 11:27:06 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Fri Jul 13 13:49:59 2012 -0700"
      },
      "message": "FORTIFY_SOURCE: strlen check.\n\nThis test is designed to detect code such as:\n\nint main() {\n  char buf[10];\n  memcpy(buf, \"1234567890\", sizeof(buf));\n  size_t len \u003d strlen(buf); // segfault here with _FORTIFY_SOURCE\n  printf(\"%d\\n\", len);\n  return 0;\n}\n\nor anytime strlen reads beyond an object boundary. This should\nhelp address memory leakage vulnerabilities and make other\nunrelated vulnerabilities harder to exploit.\n\nChange-Id: I354b425be7bef4713c85f6bab0e9738445e00182\n"
    },
    {
      "commit": "f3913b5b68347ce9a4cb17977df2c33f1e8f6000",
      "tree": "fae959e2f8c146b61eb43af80d9ae4918640d2c0",
      "parents": [
        "86a4fca0b473c49bcbcf2deb6b5822aa9ab9631e"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jul 12 15:10:03 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jul 12 15:38:15 2012 -0700"
      },
      "message": "FORTIFY_SOURCE: enhanced memcpy protections.\n\nTwo changes:\n\n1) Detect memory read overruns.\n\nFor example:\n\nint main() {\n  char buf[10];\n  memcpy(buf, \"abcde\", sizeof(buf));\n  sprintf(\"%s\\n\", buf);\n}\n\nbecause \"abcde\" is only 6 bytes, copying 10 bytes from it is a bug.\nThis particular bug will be detected at compile time.  Other similar\nbugs may be detected at runtime.\n\n2) Detect overlapping buffers on memcpy()\n\nIt is a bug to call memcpy() on buffers which overlap. For\nexample, the following code is buggy:\n\n  char buf3[0x800];\n  char *first_half  \u003d \u0026buf3[0x400];\n  char *second_half \u003d \u0026buf3[1];\n  memset(buf3, 0, sizeof(buf3));\n  memcpy(first_half, second_half, 0x400);\n  printf(\"1: %s\\n\", buf3);\n\nWe now detect this at compile and run time.\n\nChange-Id: I092bd89f11f18e08e8a9dda0ca903aaea8e06d91\n"
    },
    {
      "commit": "cb228fb4a91bdccfd974b8a4f45e2b6002e90728",
      "tree": "bef755285588a49afc5344e0bedcab6de517b84e",
      "parents": [
        "b52e4385c403d18a68309e568ac729c787d900c4"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 26 16:05:19 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 26 16:05:19 2012 -0700"
      },
      "message": "libc: cleanups\n\nPrefix private functions with underscores, to prevent name\nconflicts.\n\nUse __error__ instead of error, since occasionally programs will\ncreate their own \"#define error ...\".\n\nChange-Id: I7bb171df58aec5627e61896032a140db547fd95d\n"
    },
    {
      "commit": "8df49ad2467ec2d48f94a925162185c34bf6e68b",
      "tree": "00161cd65c6292eebd000699534b554b2c52be0a",
      "parents": [
        "4442d512c66aa32a26fe2e652e55ad05249ea3da"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Jun 13 16:57:27 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 14 12:52:42 2012 -0700"
      },
      "message": "FORTIFY_SOURCE: add strlcpy / strlcat support\n\nAdd strlcpy / strlcat support to FORTIFY_SOURCE. This allows\nus to do consistency checks on to ensure we don\u0027t overflow buffers\nwhen the compiler is able to tell us the size of the buffer we\u0027re\ndealing with.\n\nUnlike previous changes, this change DOES NOT use the compiler\u0027s\nbuiltin support. Instead, we do everything the compiler would\nnormally do.\n\nChange-Id: I47c099a911382452eafd711f8e9bfe7c2d0a0d22\n"
    },
    {
      "commit": "71a18dd435e96564539b5af71b8ea5093a2109a1",
      "tree": "fd59c2a7cc23b663d090b0b8843a5d19c97df7d0",
      "parents": [
        "7d11009a970732ea18f8a0599d63c94eab9ec3f0"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 07 14:01:26 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 07 14:19:52 2012 -0700"
      },
      "message": "_FORTIFY_SOURCE: add memset / bzero support\n\nAdd _FORTIFY_SOURCE support for the following functions:\n\n* memset\n* bzero\n\nMove the __BIONIC_FORTIFY_INLINE definition to cdefs.h so it\ncan be used from multiple header files.\n\nChange-Id: Iead4d5e35de6ec97786d58ee12573f9b11135bb7\n"
    },
    {
      "commit": "0a2301598c207fd1b50015984942fee5e8511593",
      "tree": "161496d8ec411c14f7f82990e82e970c7e328a2a",
      "parents": [
        "31431f454a9d3d3dde46de0e3c39cc409a39c436"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Jun 04 15:20:25 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Tue Jun 05 15:44:31 2012 -0700"
      },
      "message": "libc: implement some FORTIFY_SOURCE functions\n\nAdd initial support for -D_FORTIFY_SOURCE to bionic for the\nfollowing functions:\n\n* memcpy\n* memmove\n* strcpy\n* strcat\n* strncpy\n* strncat\n\nThis change adds a new version of the above functions which passes\nthe size of the destination buffer to __builtin___*_chk.\n\nIf the compiler can determine, at compile time, that the destination\nbuffer is large enough, or the destination buffer can point to an object\nof unknown size, then the check call is bypassed.\n\nIf the compiler can\u0027t make a compile time decision, then it calls\nthe __*_chk() function, which does a runtime buffer size check\n\nThese options are only enabled if the code is compiled with\n-D_FORTIFY_SOURCE\u003d1 or 2, and only when optimizations are enabled.\n\nPlease see\n* http://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html\n* http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html\n\nfor additional details on FORTIFY_SOURCE.\n\nTesting: Compiled the entire Android tree with -D_FORTIFY_SOURCE\u003d1,\nand verified that everything appears to be working properly.\nAlso created a test buffer overflow, and verified that it was\ncaught by this change.\n\nChange-Id: I4fddb445bafe92b16845b22458d72e6dedd24fbc\n"
    },
    {
      "commit": "a677907ee8ecca034318fdb97902fa73e7392c4f",
      "tree": "e937fcefb5cc8719a7a388cfdb45c9425443ae20",
      "parents": [
        "aac0dc97a9ad91231fa89878e745548d693366c1"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Mar 21 08:48:18 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Wed Mar 21 08:54:54 2012 -0700"
      },
      "message": "string.h: add __attribute__ ((pure)) to string functions\n\ncdefs.h: Introduce the __purefunc attribute, which allows us to mark\ncertain functions as being \"pure\".\n\nhttp://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html\n\n  Many functions have no effects except the return value and their\n  return value depends only on the parameters and/or global variables.\n  Such a function can be subject to common subexpression elimination\n  and loop optimization just as an arithmetic operator would be.\n\nstring.h: Mark many commently used string functions as \"pure\", to\nallow for additional compiler optimizations.\n\nChange-Id: I42961f90f822b6dbcbc3fd72cdbe774a7adc8785\n"
    },
    {
      "commit": "1dc9e472e19acfe6dc7f41e429236e7eef7ceda1",
      "tree": "3be0c520fae17689bbf5584e1136fb820caef26f",
      "parents": [
        "1767f908af327fa388b1c66883760ad851267013"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:28:35 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:28:35 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "1767f908af327fa388b1c66883760ad851267013",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [
        "a799b53f10e5a6fd51fef4436cfb7ec99836a516"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:13 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:13 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "9f65adf2ba3bb15feb8b7a7b3eef788df3fd270e",
      "tree": "c06064fc9022ef63a40f83a91292103784f49780",
      "parents": [
        "d37527501c85edcb3a6a7c8a0b6297d52d434897"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Feb 10 15:43:56 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Feb 10 15:43:56 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@130745\n"
    },
    {
      "commit": "6d6c82c7a0a6b9a89f61b61c66f9b90d9c7177dc",
      "tree": "8de86895228b63728c3a134c8b1fcab003db467d",
      "parents": [
        "4e468ed2eb86a2406e14f1eca82072ee501d05fd"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:50:54 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:50:54 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@125939\n"
    },
    {
      "commit": "a27d2baa0c1a2ec70f47ea9199b1dd6762c8a349",
      "tree": "defd1cc07d16ad2f3b21154114e092d11c94c5bb",
      "parents": [],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "message": "Initial Contribution\n"
    }
  ]
}
