)]}'
{
  "commit": "228da42898c4f7bd72d9c1ee4135108e8d40d860",
  "tree": "a780ed018bfeb97c174958f188c770c74a48bad9",
  "parents": [
    "54a15182e05ca757db3bb90a4135e9f8fd3c84f2"
  ],
  "author": {
    "name": "Chris Caputo",
    "email": "ccaputo@alt.net",
    "time": "Sat Jul 18 05:44:03 2009 +0000"
  },
  "committer": {
    "name": "Paul Jakma",
    "email": "paul@quagga.net",
    "time": "Sun Jul 19 18:28:08 2009 +0100"
  },
  "message": "[bgpd] Stability fixes including bugs 397, 492\n\nI\u0027ve spent the last several weeks working on stability fixes to bgpd.\nThese patches fix all of the numerous crashes, assertion failures, memory\nleaks and memory stomping I could find.  Valgrind was used extensively.\n\nAdded new function bgp_exit() to help catch problems.  If \"debug bgp\" is\nconfigured and bgpd exits with status of 0, statistics on remaining\nlib/memory.c allocations are printed to stderr.  It is my hope that other\ndevelopers will use this to stay on top of memory issues.\n\nExample questionable exit:\n\n  bgpd: memstats: Current memory utilization in module LIB:\n  bgpd: memstats:  Link List                     :          6\n  bgpd: memstats:  Link Node                     :          5\n  bgpd: memstats:  Hash                          :          8\n  bgpd: memstats:  Hash Bucket                   :          2\n  bgpd: memstats:  Hash Index                    :          8\n  bgpd: memstats:  Work queue                    :          3\n  bgpd: memstats:  Work queue item               :          2\n  bgpd: memstats:  Work queue name string        :          3\n  bgpd: memstats: Current memory utilization in module BGP:\n  bgpd: memstats:  BGP instance                  :          1\n  bgpd: memstats:  BGP peer                      :          1\n  bgpd: memstats:  BGP peer hostname             :          1\n  bgpd: memstats:  BGP attribute                 :          1\n  bgpd: memstats:  BGP extra attributes          :          1\n  bgpd: memstats:  BGP aspath                    :          1\n  bgpd: memstats:  BGP aspath str                :          1\n  bgpd: memstats:  BGP table                     :         24\n  bgpd: memstats:  BGP node                      :          1\n  bgpd: memstats:  BGP route                     :          1\n  bgpd: memstats:  BGP synchronise               :          8\n  bgpd: memstats:  BGP Process queue             :          1\n  bgpd: memstats:  BGP node clear queue          :          1\n  bgpd: memstats: NOTE: If configuration exists, utilization may be expected.\n\nExample clean exit:\n\n  bgpd: memstats: No remaining tracked memory utilization.\n\nThis patch fixes bug #397: \"Invalid free in bgp_announce_check()\".\n\nThis patch fixes bug #492: \"SIGBUS in bgpd/bgp_route.c:\nbgp_clear_route_node()\".\n\nMy apologies for not separating out these changes into individual patches.\nThe complexity of doing so boggled what is left of my brain.  I hope this\nis all still useful to the community.\n\nThis code has been production tested, in non-route-server-client mode, on\na linux 32-bit box and a 64-bit box.\n\nRelease/reset functions, used by bgp_exit(), added to:\n\n  bgpd/bgp_attr.c,h\n  bgpd/bgp_community.c,h\n  bgpd/bgp_dump.c,h\n  bgpd/bgp_ecommunity.c,h\n  bgpd/bgp_filter.c,h\n  bgpd/bgp_nexthop.c,h\n  bgpd/bgp_route.c,h\n  lib/routemap.c,h\n\nFile by file analysis:\n\n* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.\n\n* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().\n\n* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from\n  bgp_exit().\n\n* bgpd/bgp_filter.c: Fix aslist-\u003ename use without allocation check, and\n  also fix memory leak.\n\n* bgpd/bgp_main.c: Created bgp_exit() exit routine.  This function frees\n  allocations made as part of bgpd initialization and, to some extent,\n  configuration.  If \"debug bgp\" is configured, memory stats are printed\n  as described above.\n\n* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for\n  ibuf/obuf, so bgp_scan_init() shouldn\u0027t do it too.  Also, made it so\n  zlookup is global so bgp_exit() can use it.\n\n* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()\n  adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.\n\n* bgpd/bgp_route.h: Correct reference counter \"lock\" to be signed.\n  bgp_clear_route() now accepts a bgp_clear_route_type of either\n  BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.\n\n* bgpd/bgp_route.c:\n  - bgp_process_rsclient(): attr was being zero\u0027ed and then\n    bgp_attr_extra_free() was being called with it, even though it was\n    never filled with valid data.\n\n  - bgp_process_rsclient(): Make sure rsclient-\u003egroup is not NULL before\n    use.\n\n  - bgp_processq_del(): Add call to bgp_table_unlock().\n\n  - bgp_process(): Add call to bgp_table_lock().\n\n  - bgp_update_rsclient(): memset clearing of new_attr not needed since\n    declarationw with \"\u003d { 0 }\" does it.  memset was already commented\n    out.\n\n  - bgp_update_rsclient(): Fix screwed up misleading indentation.\n\n  - bgp_withdraw_rsclient(): Fix screwed up misleading indentation.\n\n  - bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.\n\n  - bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also\n    free struct bgp_clear_node_queue used for work item.\n\n  - bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in\n    case peer is released by peer_unlock() call.\n\n  - bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.  Use\n    struct bgp_clear_node_queue to supply data to worker.  Add call to\n    bgp_table_lock().\n\n  - bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or\n    BGP_CLEAR_ROUTE_MY_RSCLIENT.\n\n  - bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.\n\n  Bug 397 fixes:\n\n    - bgp_default_originate()\n    - bgp_announce_table()\n\n* bgpd/bgp_table.h:\n  - struct bgp_table: Added reference count.  Changed type of owner to be\n    \"struct peer *\" rather than \"void *\".\n\n  - struct bgp_node: Correct reference counter \"lock\" to be signed.\n\n* bgpd/bgp_table.c:\n  - Added bgp_table reference counting.\n\n  - bgp_table_free(): Fixed cleanup code.  Call peer_unlock() on owner if\n    set.\n\n  - bgp_unlock_node(): Added assertion.\n\n  - bgp_node_get(): Added call to bgp_lock_node() to code path that it was\n    missing from.\n\n* bgpd/bgp_vty.c:\n  - peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment\n    to owner.  Handle failure gracefully.\n\n  - peer_rsclient_unset_vty(): Add call to bgp_clear_route() with\n    BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.\n\n* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.\n\n* bgpd/bgpd.c:\n  - peer_lock(): Allow to be called when status is \"Deleted\".\n\n  - peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to\n    bgp_clear_route() call.\n\n  - peer_delete(): Common variable listnode pn.  Fix bug in which rsclient\n    was only dealt with if not part of a peer group.  Call\n    bgp_clear_route() for rsclient, if appropriate, and do so with\n    BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.\n\n  - peer_group_get(): Use XSTRDUP() instead of strdup() for conf-\u003ehost.\n\n  - peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with\n    BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.\n\n  - bgp_create(): Use XSTRDUP() instead of strdup() for peer_self-\u003ehost.\n\n  - bgp_delete(): Delete peers before groups, rather than after.  And then\n    rather than deleting rsclients, verify that there are none at this\n    point.\n\n  - bgp_unlock(): Add assertion.\n\n  - bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.\n\n* lib/command.c,h: Compiler warning fixes.  Add cmd_terminate().  Fixed\n  massive leak in install_element() in which cmd_make_descvec() was being\n  called more than once for the same cmd-\u003estrvec/string/doc.\n\n* lib/log.c: Make closezlog() check fp before calling fclose().\n\n* lib/memory.c: Catch when alloc count goes negative by using signed\n  counts.  Correct #endif comment.  Add log_memstats_stderr().\n\n* lib/memory.h: Add log_memstats_stderr().\n\n* lib/thread.c: thread-\u003efuncname was being accessed in thread_call() after\n  it had been freed.  Rearranged things so that thread_call() frees\n  funcname.  Also made it so thread_master_free() cleans up cpu_record.\n\n* lib/vty.c,h: Use global command_cr.  Add vty_terminate().\n\n* lib/zclient.c,h: Re-enable zclient_free().\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "002fff9f5e1a5ae31abdd90ed6fe166b22c06978",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_aspath.c",
      "new_id": "13f32b8675ee0bba34928e3c11251dd3d99b1e9e",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_aspath.c"
    },
    {
      "type": "modify",
      "old_id": "82d907e27b8d85bf6d6e3ca28f8dac74dd821ab3",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_attr.c",
      "new_id": "9416837288b5f47bf69a447dffaf1ac4df81a189",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_attr.c"
    },
    {
      "type": "modify",
      "old_id": "12149a1777e27adfc650ae22355cbc78fef17ede",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_attr.h",
      "new_id": "ed8753bd93e876b6520fefe1558c86919fe17116",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_attr.h"
    },
    {
      "type": "modify",
      "old_id": "8d8c90c4a15637cba3f37807a1c9e537dfa40689",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_clist.c",
      "new_id": "d6601674677ba843cd434dc50cde93bb090bc7a0",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_clist.c"
    },
    {
      "type": "modify",
      "old_id": "6d7e363e972a8c22accb48ffb270f533f0a845cf",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_clist.h",
      "new_id": "5dcb3b4c1a59fd69bf2930ddef4de92a9bb27a00",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_clist.h"
    },
    {
      "type": "modify",
      "old_id": "d40d69a2ffa1090d00e4f96b4b4579ca090990f9",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_community.c",
      "new_id": "ae1d7a15579e541dea02c8546dc4d821fb5470e8",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_community.c"
    },
    {
      "type": "modify",
      "old_id": "aed7f3303b4d2747e94bcf0405967bd5f4ccf02a",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_community.h",
      "new_id": "bc1e56eff1e1592c45b935875efd94cc23800519",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_community.h"
    },
    {
      "type": "modify",
      "old_id": "53dea805c08fb5e4b37e9822c79093e4b110b938",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_dump.c",
      "new_id": "8087a403bc6fca9e84c63971c7466c27aafe4d02",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_dump.c"
    },
    {
      "type": "modify",
      "old_id": "6bb1197bb212760ef4d63cb68efb314dd8bde19e",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_dump.h",
      "new_id": "e097c7840921f6285da6d17dae53504fd4de19fa",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_dump.h"
    },
    {
      "type": "modify",
      "old_id": "6152a1db2157c0620e66884ed44e182cd70f7c73",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_ecommunity.c",
      "new_id": "8d5fa741a882ddaab1355be3f3c1c85ef38f87dc",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_ecommunity.c"
    },
    {
      "type": "modify",
      "old_id": "5c8deb561588a591420cfdfe5c0d53df72f329f8",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_ecommunity.h",
      "new_id": "942fdc73305f546c51bc5ee528b89c929d8d3ba9",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_ecommunity.h"
    },
    {
      "type": "modify",
      "old_id": "bdb756cb0d1432e77957fd506751564500b1b2a4",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_filter.c",
      "new_id": "8ee62b01309d34b3a931bd509aeddf0b3ebce28d",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_filter.c"
    },
    {
      "type": "modify",
      "old_id": "d389f165f4f95729772477ca378197645d854cf5",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_filter.h",
      "new_id": "8c27a930216895fe27a4066a4fc8bb0dfe86be31",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_filter.h"
    },
    {
      "type": "modify",
      "old_id": "620ca128a873fa133a47bb05b8077c37c1b4291d",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_main.c",
      "new_id": "9d14683caf3780242d615267d02976acdc0a8886",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_main.c"
    },
    {
      "type": "modify",
      "old_id": "67a49f7ad8687b46ce1c6079938eaf4c8b1398e9",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_nexthop.c",
      "new_id": "0cde665eb380e4d2585d3d8595d7a41b249d30ca",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_nexthop.c"
    },
    {
      "type": "modify",
      "old_id": "a8b92df6a1965caffd6abbc2d5374a14c277b2b7",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_nexthop.h",
      "new_id": "2dad742ff424b473d15aed706d6200847a92a5a0",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_nexthop.h"
    },
    {
      "type": "modify",
      "old_id": "d98b689a9b8da45385fd17f0754a574bf7cffdc3",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_packet.c",
      "new_id": "1c9a3c911edc3ddf7d2435b5fde785394ffc7e26",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_packet.c"
    },
    {
      "type": "modify",
      "old_id": "87fe7f5cf87c4b6e8a0ff72533eec8ce5980a114",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_route.c",
      "new_id": "8dafd181e58a051f1a9fd07af07457facc7ee6b9",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_route.c"
    },
    {
      "type": "modify",
      "old_id": "e5987972a39de8b4cf7e0149d3ff1ecb1af7f670",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_route.h",
      "new_id": "5eed3486d1083af20badc7ab1ef66d251657e56b",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_route.h"
    },
    {
      "type": "modify",
      "old_id": "663325678ea3f365df4ac3ebb9fd58276ef34264",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_table.c",
      "new_id": "5b8c6a490b07bef4e4ab811b4ecc218c1606ecfd",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_table.c"
    },
    {
      "type": "modify",
      "old_id": "dfa7e1f36c91e8e0a386e599ef584f7faa37e56b",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_table.h",
      "new_id": "53df0bc6caa0f3998d5a1247dce73d2eea940cf7",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_table.h"
    },
    {
      "type": "modify",
      "old_id": "e97b4c9728c0b5b70dbf5ca651f9ecd2d7a38d42",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_vty.c",
      "new_id": "13c37b57877bfa247e12ab6bd63db879bfb08074",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_vty.c"
    },
    {
      "type": "modify",
      "old_id": "0b6ab45a715e192b9cf45e7740be34634ccb81dd",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_zebra.c",
      "new_id": "49380cc37b87135173fc05666062baa078d5fb05",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_zebra.c"
    },
    {
      "type": "modify",
      "old_id": "86bf60ec1aa1b726b6ff830f8c1276adddb8243d",
      "old_mode": 33188,
      "old_path": "bgpd/bgpd.c",
      "new_id": "60722d27a39777a11c02a56ce4b47ec849ac144e",
      "new_mode": 33188,
      "new_path": "bgpd/bgpd.c"
    },
    {
      "type": "modify",
      "old_id": "0bbd99e5bccdcbe148962abad0c1b241cda1a57e",
      "old_mode": 33188,
      "old_path": "lib/command.c",
      "new_id": "31c067a36a91438e95439ebc829d7838b2165082",
      "new_mode": 33188,
      "new_path": "lib/command.c"
    },
    {
      "type": "modify",
      "old_id": "d093df3cbe8ad9e2897d55a259af7abf8650687c",
      "old_mode": 33188,
      "old_path": "lib/command.h",
      "new_id": "1275efee2b61e3974ec06bee703896e8975f8253",
      "new_mode": 33188,
      "new_path": "lib/command.h"
    },
    {
      "type": "modify",
      "old_id": "8c3e2ddce0808df5d416ae39d9325a403613d91c",
      "old_mode": 33188,
      "old_path": "lib/log.c",
      "new_id": "0c2f655bc0ed11b7773a863c07873bb4c10824cb",
      "new_mode": 33188,
      "new_path": "lib/log.c"
    },
    {
      "type": "modify",
      "old_id": "f5d0cba6b2cc9b05b0bd35e9142cd5688b9a2825",
      "old_mode": 33188,
      "old_path": "lib/memory.c",
      "new_id": "dc09d8a6c9a4294a4651f5d8cc292607a775b097",
      "new_mode": 33188,
      "new_path": "lib/memory.c"
    },
    {
      "type": "modify",
      "old_id": "a23c27875e436c027ea6a5fdc4e06a362b86c12e",
      "old_mode": 33188,
      "old_path": "lib/memory.h",
      "new_id": "42eb5caec418f5887eca38861bb853ad85c7eb52",
      "new_mode": 33188,
      "new_path": "lib/memory.h"
    },
    {
      "type": "modify",
      "old_id": "5f7a3182037507d4d8fdddcccf9f561e49abf0a4",
      "old_mode": 33188,
      "old_path": "lib/routemap.c",
      "new_id": "4f4e6d620c5e11530956cbf7b986a312bae4cbfe",
      "new_mode": 33188,
      "new_path": "lib/routemap.c"
    },
    {
      "type": "modify",
      "old_id": "321e1927aa64a8bf09f8cb75f8abf81db412c6c0",
      "old_mode": 33188,
      "old_path": "lib/routemap.h",
      "new_id": "1402f5c84bd2b4348efd570c3252e05686fe9071",
      "new_mode": 33188,
      "new_path": "lib/routemap.h"
    },
    {
      "type": "modify",
      "old_id": "47a9dc4387459dc830fcff0abb14a2b64f937bbb",
      "old_mode": 33188,
      "old_path": "lib/thread.c",
      "new_id": "e89af541c61f7ddaaa1709d4bb5e444f775785d0",
      "new_mode": 33188,
      "new_path": "lib/thread.c"
    },
    {
      "type": "modify",
      "old_id": "14a36c162385765261a8c94dee554c087c1c29c9",
      "old_mode": 33188,
      "old_path": "lib/vty.c",
      "new_id": "30a94e1128bf9a05d77ca3c5da1f39ddc2a79cb0",
      "new_mode": 33188,
      "new_path": "lib/vty.c"
    },
    {
      "type": "modify",
      "old_id": "65ae6201c0c497aa21303da7757f9e8e0839378e",
      "old_mode": 33188,
      "old_path": "lib/vty.h",
      "new_id": "7df04b5fbad53dc6ca378456550135dc4c73678f",
      "new_mode": 33188,
      "new_path": "lib/vty.h"
    },
    {
      "type": "modify",
      "old_id": "4a716a660ebf249bc66b3138b73aa8872a947f37",
      "old_mode": 33188,
      "old_path": "lib/zclient.c",
      "new_id": "d3d532274d34301312db61f57c7e8fad59af22a6",
      "new_mode": 33188,
      "new_path": "lib/zclient.c"
    },
    {
      "type": "modify",
      "old_id": "69ada144b9ffaf3b03de27944a28e78113bce231",
      "old_mode": 33188,
      "old_path": "lib/zclient.h",
      "new_id": "21786ab8795e55e1a7db231e0bf65311f2f474a3",
      "new_mode": 33188,
      "new_path": "lib/zclient.h"
    }
  ]
}
