* sven falempin <sven.falem...@gmail.com> [2012-06-30 02:06]:
> -                       ea = ether_aton(argv[0]);
> +                       m_size = strnlen(argv[0], ETHER_ADDR_LEN+1 );
> +                       if ( m_size > ETHER_ADDR_LEN ||  m_size < 3 ) {
> +                               warnx("mac address  expression too long or
> too small %s", argv[0]);
> +                               return (1);
> +                       }
> +                       if (    ( argv[0][0] == '*'  && argv[0][1] == ':' )
> ||
> +                               ( argv[0][m_size-1] == '*' &&
> argv[0][m_size-2] == ':' )
> +                          ) {
> +                               int n = 0;
> +                               char* mac = malloc(
> (ETHER_ADDR_LEN+1)*sizeof(char) );
> +                               char* p;
> +                               if ( mac == NULL ) {
> +                                       warnx("not enough memory");
> +                                       return (1);
> +                               }
> +                               for ( p = argv[0]; *p != '\0'; ++p) {
> +                                       if ( *p == ':' ) n++;
> +                               }
> +                               if ( argv[0][0] == '*' ) {
> +                                       for (; n > 0; --n) strlcat( mac,
> "0:", ETHER_ADDR_LEN);
> +                                       strlcat( mac, &(argv[0][2]),
> ETHER_ADDR_LEN);
> +                                       *m_b = -n;
> +                               }
> +                               if ( argv[0][m_size-1] == '*' ) {
> +                                       strlcat( mac, argv[0],
> ETHER_ADDR_LEN);
> +                                       for (; n > 0; --n) strlcat( mac,
> ":0", ETHER_ADDR_LEN);
> +                                       *m_b = n;
> +                               }
> +                               rule.ifbr_flags |= m_flag;
> +                               ea = ether_aton(mac);
> +                               free(mac);
> +                       } else {
> +                               ea = ether_aton(argv[0]);
> +                       }

NO WAY.

doing this with string fiddling (in the kernel!) is beyond inacceptible.

-- 
Henning Brauer, h...@bsws.de, henn...@openbsd.org
BS Web Services, http://bsws.de, Full-Service ISP
Secure Hosting, Mail and DNS Services. Dedicated Servers, Root to Fully Managed
Henning Brauer Consulting, http://henningbrauer.com/

Reply via email to