)]}'
{
  "commit": "e64259e860a84c9527ffbe6d9bd2f6eeab6fdac4",
  "tree": "59b3fd8b76808b6e61bc2fa5853757293e2f8452",
  "parents": [
    "6334c662cae4cd9b61f5f3185048b0cd3633dad7"
  ],
  "author": {
    "name": "Nick Kralevich",
    "email": "nnk@google.com",
    "time": "Wed Jul 11 17:34:04 2012 -0700"
  },
  "committer": {
    "name": "Nick Kralevich",
    "email": "nnk@google.com",
    "time": "Wed Jul 11 17:46:03 2012 -0700"
  },
  "message": "memmove: Don\u0027t call memcpy if regions overlap\n\nmemmove() unconditionally calls memcpy() if \"dst\" \u003c \"src\". For\nexample, in the code below, memmove() would end up calling memcpy(),\neven though the regions of memory overlap.\n\nint main() {\n  char buf3[0x800];\n  char *dst  \u003d \u0026buf3[1];\n  char *src \u003d \u0026buf3[0x400];\n  memset(buf3, 0, sizeof(buf3));\n  memmove(dst, src, 0x400);\n  printf(\"1: %s\\n\", buf3);\n  return 0;\n}\n\nCalling memcpy() on overlaping regions only works if you assume\nthat memcpy() copies from start to finish. On some architectures,\nit\u0027s more efficient to call memcpy() from finish to start.\n\nThis is also triggering a failure in some of my code.\n\nMore reading:\n* http://lwn.net/Articles/414467/\n* https://bugzilla.redhat.com/show_bug.cgi?id\u003d638477#c31 (comment 31)\n\nChange-Id: I65a51ae3a52dd4af335fe5c278056b8c2cbd8948\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "072104b6c9a33b7035ec995638da385cf301dd40",
      "old_mode": 33188,
      "old_path": "libc/string/memmove.c",
      "new_id": "fb1d9753edc273c27029d5f2cf99630aa6032334",
      "new_mode": 33188,
      "new_path": "libc/string/memmove.c"
    }
  ]
}
