diff options
| -rw-r--r-- | bgpd/ChangeLog | 13 | ||||
| -rw-r--r-- | bgpd/bgp_filter.c | 44 | ||||
| -rw-r--r-- | bgpd/bgp_route.c | 3 | ||||
| -rw-r--r-- | bgpd/bgp_routemap.c | 2 | ||||
| -rw-r--r-- | bgpd/bgp_vty.c | 17 | ||||
| -rw-r--r-- | lib/ChangeLog | 11 | ||||
| -rw-r--r-- | lib/buffer.c | 2 | ||||
| -rw-r--r-- | lib/buffer.h | 7 | ||||
| -rw-r--r-- | lib/filter.c | 32 | ||||
| -rw-r--r-- | lib/if.c | 16 | ||||
| -rw-r--r-- | lib/plist.c | 32 | 
11 files changed, 46 insertions, 133 deletions
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog index 93dc8c3b..6bee4def 100644 --- a/bgpd/ChangeLog +++ b/bgpd/ChangeLog @@ -1,3 +1,16 @@ +2005-01-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu> + +	* bgp_filter.c: (ip_as_path,no_ip_as_path) Use argv_concat instead +	  of buffer_getstr. +	* bgp_route.c: (bgp_show_regexp) Fix memory leak: need to free string +	  returned by buffer_getstr. +	  (bgp_show_community) Must use XFREE instead of free on string +	  returned by buffer_getstr. +	* bgp_routemap.c: (set_community) Must use XFREE instead of free +	  on string returned by buffer_getstr. +	* bgp_vty.c: (neighbor_description) Use argv_concat instead of +	  buffer_getstr. +  2005-01-24 Hasso Tepper <hasso at quagga.net>  	* bgp_route.c: Fix showstopper bug. New route must be selected also diff --git a/bgpd/bgp_filter.c b/bgpd/bgp_filter.c index 09dcc0fa..2f43cd05 100644 --- a/bgpd/bgp_filter.c +++ b/bgpd/bgp_filter.c @@ -446,10 +446,7 @@ DEFUN (ip_as_path, ip_as_path_cmd,    struct as_filter *asfilter;    struct as_list *aslist;    regex_t *regex; -  struct buffer *b; -  int i;    char *regstr; -  int first = 0;    /* Check the filter type. */    if (strncmp (argv[1], "p", 1) == 0) @@ -463,25 +460,12 @@ DEFUN (ip_as_path, ip_as_path_cmd,      }    /* Check AS path regex. */ -  b = buffer_new (1024); -  for (i = 2; i < argc; i++) -    { -      if (first) -	buffer_putc (b, ' '); -      else -	first = 1; - -      buffer_putstr (b, argv[i]); -    } -  buffer_putc (b, '\0'); - -  regstr = buffer_getstr (b); -  buffer_free (b); +  regstr = argv_concat(argv, argc, 2);    regex = bgp_regcomp (regstr);    if (!regex)      { -      free (regstr); +      XFREE (MTYPE_TMP, regstr);        vty_out (vty, "can't compile regexp %s%s", argv[0],  	       VTY_NEWLINE);        return CMD_WARNING; @@ -489,7 +473,7 @@ DEFUN (ip_as_path, ip_as_path_cmd,    asfilter = as_filter_make (regex, regstr, type); -  free (regstr); +  XFREE (MTYPE_TMP, regstr);    /* Install new filter to the access_list. */    aslist = as_list_get (argv[0]); @@ -518,9 +502,6 @@ DEFUN (no_ip_as_path,    enum as_filter_type type;    struct as_filter *asfilter;    struct as_list *aslist; -  struct buffer *b; -  int i; -  int first = 0;    char *regstr;    regex_t *regex; @@ -545,25 +526,12 @@ DEFUN (no_ip_as_path,      }    /* Compile AS path. */ -  b = buffer_new (1024); -  for (i = 2; i < argc; i++) -    { -      if (first) -	buffer_putc (b, ' '); -      else -	first = 1; - -      buffer_putstr (b, argv[i]); -    } -  buffer_putc (b, '\0'); - -  regstr = buffer_getstr (b); -  buffer_free (b); +  regstr = argv_concat(argv, argc, 2);    regex = bgp_regcomp (regstr);    if (!regex)      { -      free (regstr); +      XFREE (MTYPE_TMP, regstr);        vty_out (vty, "can't compile regexp %s%s", argv[0],  	       VTY_NEWLINE);        return CMD_WARNING; @@ -572,7 +540,7 @@ DEFUN (no_ip_as_path,    /* Lookup asfilter. */    asfilter = as_filter_lookup (aslist, regstr, type); -  free (regstr); +  XFREE (MTYPE_TMP, regstr);    bgp_regex_free (regex);    if (asfilter == NULL) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 849cc44f..40a61b61 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -6136,6 +6136,7 @@ bgp_show_regexp (struct vty *vty, int argc, const char **argv, afi_t afi,    buffer_free (b);    regex = bgp_regcomp (regstr); +  XFREE(MTYPE_TMP, regstr);    if (! regex)      {        vty_out (vty, "Can't compile regexp %s%s", argv[0], @@ -6712,7 +6713,7 @@ bgp_show_community (struct vty *vty, int argc, const char **argv, int exact,    buffer_free (b);    com = community_str2com (str); -  free (str); +  XFREE (MTYPE_TMP, str);    if (! com)      {        vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE); diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index e2ad5e0f..76740056 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -2846,7 +2846,7 @@ DEFUN (set_community,    if (str)      {        com = community_str2com (str); -      free (str); +      XFREE (MTYPE_TMP, str);      }    /* Can't compile user input into communities attribute.  */ diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 027b8ca9..5968f68c 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -28,6 +28,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  #include "stream.h"  #include "thread.h"  #include "log.h" +#include "memory.h"  #include "bgpd/bgpd.h"  #include "bgpd/bgp_attr.h" @@ -2576,9 +2577,7 @@ DEFUN (neighbor_description,         "Up to 80 characters describing this neighbor\n")  {    struct peer *peer; -  struct buffer *b;    char *str; -  int i;    peer = peer_and_group_lookup_vty (vty, argv[0]);    if (! peer) @@ -2587,21 +2586,11 @@ DEFUN (neighbor_description,    if (argc == 1)      return CMD_SUCCESS; -  /* Make string from buffer.  This function should be provided by -     buffer.c. */ -  b = buffer_new (1024); -  for (i = 1; i < argc; i++) -    { -      buffer_putstr (b, argv[i]); -      buffer_putc (b, ' '); -    } -  buffer_putc (b, '\0'); -  str = buffer_getstr (b); -  buffer_free (b); +  str = argv_concat(argv, argc, 1);    peer_description_set (peer, str); -  free (str); +  XFREE (MTYPE_TMP, str);    return CMD_SUCCESS;  } diff --git a/lib/ChangeLog b/lib/ChangeLog index 7955f098..34dad166 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,14 @@ +2005-01-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu> + +	* buffer.h: Fix comment on buffer_getstr to reflect that it now +	  uses XMALLOC. +	* buffer.c: (buffer_getstr) Use XMALLOC(MTYPE_TMP) instead of malloc. +	* filter.c: (access_list_remark,ipv6_access_list_remark) Use +	  argv_concat instead of buffer_getstr. +	* if.c: (interface_desc) Use argv_concat instead of buffer_getstr. +	* plist.c: (ip_prefix_list_description,ipv6_prefix_list_description) +	  Use argv_concat instead of buffer_getstr. +  2005-01-28 Andrew J. Schorr <ajschorr@alumni.princeton.edu>  	* lib/buffer.h: Document behavior of buffer_getstr function. diff --git a/lib/buffer.c b/lib/buffer.c index 60048bc0..8666ab78 100644 --- a/lib/buffer.c +++ b/lib/buffer.c @@ -95,7 +95,7 @@ buffer_getstr (struct buffer *b)    for (data = b->head; data; data = data->next)      totlen += data->cp - data->sp; -  if (!(s = malloc(totlen+1))) +  if (!(s = XMALLOC(MTYPE_TMP, totlen+1)))      return NULL;    p = s;    for (data = b->head; data; data = data->next) diff --git a/lib/buffer.h b/lib/buffer.h index c3787d78..c0245a7f 100644 --- a/lib/buffer.h +++ b/lib/buffer.h @@ -67,10 +67,9 @@ int buffer_write (struct buffer *, const void *, size_t);  void buffer_free (struct buffer *);  /* Combine all accumulated (and unflushed) data inside the buffer into a -   single NUL-terminated string allocated using malloc (N.B. should be changed -   to use XMALLOC(MTYPE_TMP)).  Note that this function does not alter -   the state of the buffer, so the data is still inside waiting to be -   flushed. */ +   single NUL-terminated string allocated using XMALLOC(MTYPE_TMP).  Note +   that this function does not alter the state of the buffer, so the data +   is still inside waiting to be flushed. */  char *buffer_getstr (struct buffer *);  int buffer_putc (struct buffer *, u_char); diff --git a/lib/filter.c b/lib/filter.c index 9817c07d..0dd7a775 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -1359,8 +1359,6 @@ DEFUN (access_list_remark,         "Comment up to 100 characters\n")  {    struct access_list *access; -  struct buffer *b; -  int i;    access = access_list_get (AFI_IP, argv[0]); @@ -1369,19 +1367,7 @@ DEFUN (access_list_remark,        XFREE (MTYPE_TMP, access->remark);        access->remark = NULL;      } - -  /* Below is remark get codes. */ -  b = buffer_new (1024); -  for (i = 1; i < argc; i++) -    { -      buffer_putstr (b, argv[i]); -      buffer_putc (b, ' '); -    } -  buffer_putc (b, '\0'); - -  access->remark = buffer_getstr (b); - -  buffer_free (b); +  access->remark = argv_concat(argv, argc, 1);    return CMD_SUCCESS;  } @@ -1541,8 +1527,6 @@ DEFUN (ipv6_access_list_remark,         "Comment up to 100 characters\n")  {    struct access_list *access; -  struct buffer *b; -  int i;    access = access_list_get (AFI_IP6, argv[0]); @@ -1551,19 +1535,7 @@ DEFUN (ipv6_access_list_remark,        XFREE (MTYPE_TMP, access->remark);        access->remark = NULL;      } - -  /* Below is remark get codes. */ -  b = buffer_new (1024); -  for (i = 1; i < argc; i++) -    { -      buffer_putstr (b, argv[i]); -      buffer_putc (b, ' '); -    } -  buffer_putc (b, '\0'); - -  access->remark = buffer_getstr (b); - -  buffer_free (b); +  access->remark = argv_concat(argv, argc, 1);    return CMD_SUCCESS;  } @@ -453,27 +453,15 @@ DEFUN (interface_desc,         "Interface specific description\n"         "Characters describing this interface\n")  { -  int i;    struct interface *ifp; -  struct buffer *b;    if (argc == 0)      return CMD_SUCCESS;    ifp = vty->index;    if (ifp->desc) -    XFREE (0, ifp->desc); - -  b = buffer_new (1024); -  for (i = 0; i < argc; i++) -    { -      buffer_putstr (b, argv[i]); -      buffer_putc (b, ' '); -    } -  buffer_putc (b, '\0'); - -  ifp->desc = buffer_getstr (b); -  buffer_free (b); +    XFREE (MTYPE_TMP, ifp->desc); +  ifp->desc = argv_concat(argv, argc, 0);    return CMD_SUCCESS;  } diff --git a/lib/plist.c b/lib/plist.c index 3520f82f..5e2edd29 100644 --- a/lib/plist.c +++ b/lib/plist.c @@ -1561,8 +1561,6 @@ DEFUN (ip_prefix_list_description,         "Up to 80 characters describing this prefix-list\n")  {    struct prefix_list *plist; -  struct buffer *b; -  int i;    plist = prefix_list_get (AFI_IP, argv[0]); @@ -1571,19 +1569,7 @@ DEFUN (ip_prefix_list_description,        XFREE (MTYPE_TMP, plist->desc);        plist->desc = NULL;      } - -  /* Below is description get codes. */ -  b = buffer_new (1024); -  for (i = 1; i < argc; i++) -    { -      buffer_putstr (b, argv[i]); -      buffer_putc (b, ' '); -    } -  buffer_putc (b, '\0'); - -  plist->desc = buffer_getstr (b); - -  buffer_free (b); +  plist->desc = argv_concat(argv, argc, 1);    return CMD_SUCCESS;  }        @@ -2171,8 +2157,6 @@ DEFUN (ipv6_prefix_list_description,         "Up to 80 characters describing this prefix-list\n")  {    struct prefix_list *plist; -  struct buffer *b; -  int i;    plist = prefix_list_get (AFI_IP6, argv[0]); @@ -2181,19 +2165,7 @@ DEFUN (ipv6_prefix_list_description,        XFREE (MTYPE_TMP, plist->desc);        plist->desc = NULL;      } - -  /* Below is description get codes. */ -  b = buffer_new (1024); -  for (i = 1; i < argc; i++) -    { -      buffer_putstr (b, argv[i]); -      buffer_putc (b, ' '); -    } -  buffer_putc (b, '\0'); - -  plist->desc = buffer_getstr (b); - -  buffer_free (b); +  plist->desc = argv_concat(argv, argc, 1);    return CMD_SUCCESS;  }         | 
