)]}'
{
  "commit": "76975f8a3186dae501584d0155ea410464f62815",
  "tree": "265ed11c16755560e27f81a8e7ff2562031cfb58",
  "parents": [
    "304b46996ca1a989fe0fe99831ed38c79e855245"
  ],
  "author": {
    "name": "Julia Lawall",
    "email": "julia@diku.dk",
    "time": "Tue Jan 01 19:30:30 2008 -0800"
  },
  "committer": {
    "name": "David S. Miller",
    "email": "davem@davemloft.net",
    "time": "Fri Jan 04 00:47:02 2008 -0800"
  },
  "message": "[X25]: Add missing x25_neigh_put\n\nThe function x25_get_neigh increments a reference count.  At the point of\nthe second goto out, the result of calling x25_get_neigh is only stored in\na local variable, and thus no one outside the function will be able to\ndecrease the reference count.  Thus, x25_neigh_put should be called before\nthe return in this case.\n\nThe problem was found using the following semantic match.\n(http://www.emn.fr/x-info/coccinelle/)\n\n// \u003csmpl\u003e\n\n@@\ntype T,T1,T2;\nidentifier E;\nstatement S;\nexpression x1,x2,x3;\nint ret;\n@@\n\n  T E;\n  ...\n* if ((E \u003d x25_get_neigh(...)) \u003d\u003d NULL)\n  S\n  ... when !\u003d x25_neigh_put(...,(T1)E,...)\n      when !\u003d if (E !\u003d NULL) { ... x25_neigh_put(...,(T1)E,...); ...}\n      when !\u003d x1 \u003d (T1)E\n      when !\u003d E \u003d x3;\n      when any\n  if (...) {\n    ... when !\u003d x25_neigh_put(...,(T2)E,...)\n        when !\u003d if (E !\u003d NULL) { ... x25_neigh_put(...,(T2)E,...); ...}\n        when !\u003d x2 \u003d (T2)E\n(\n*   return;\n|\n*   return ret;\n)\n  }\n// \u003c/smpl\u003e\n\nSigned-off-by: Julia Lawall \u003cjulia@diku.dk\u003e\nSigned-off-by: David S. Miller \u003cdavem@davemloft.net\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8738ec7ce69336dd1960d9e3c8c9a0e1fa68a0e4",
      "old_mode": 33188,
      "old_path": "net/x25/x25_forward.c",
      "new_id": "34478035e05edd64131525b438eab2bedc55791c",
      "new_mode": 33188,
      "new_path": "net/x25/x25_forward.c"
    }
  ]
}
