--- bgpctl/parser.c.orig 2007-01-11 15:02:38.000000000 +1000 +++ bgpctl/parser.c 2007-01-11 16:28:30.000000000 +1000 @@ -269,7 +269,7 @@ int parse_addr(const char *, struct bgpd_addr *); int parse_prefix(const char *, struct bgpd_addr *, u_int8_t *); -int parse_asnum(const char *, u_int16_t *); +int parse_asnum(const char *, u_int32_t *); int parse_number(const char *, struct parse_result *, enum token_type); int getcommunity(const char *); @@ -592,9 +592,9 @@ } int -parse_asnum(const char *word, u_int16_t *asnum) +parse_asnum(const char *word, u_int32_t *asnum) { - u_long ulval; + u_long ulval, ulval2; char *ep; if (word == NULL) @@ -602,13 +602,20 @@ errno = 0; ulval = strtoul(word, &ep, 0); + if (*ep == '.') { + ++ep ; + ulval2 = strtoul(ep,&ep,0) ; + if (ulval > USHRT_MAX) return(0) ; + if (ulval2 > USHRT_MAX) return(0) ; + ulval = (ulval << 16) + ulval2 ; + } if (word[0] == '\0' || *ep != '\0') return (0); if (errno == ERANGE && ulval == ULONG_MAX) return (0); - if (ulval > USHRT_MAX) + if (ulval > UINT_MAX) return (0); - *asnum = (u_int16_t)ulval; + *asnum = (u_int32_t)ulval; return (1); } @@ -698,7 +705,8 @@ struct filter_set *fs; char *p; int i; - u_int16_t as, type; + u_int16_t as; + u_int16_t type; /* Well-known communities */ if (strcasecmp(word, "NO_EXPORT") == 0) {