diff options
author | Phil Sutter <phil@nwl.cc> | 2018-09-19 15:16:44 +0200 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2018-09-24 11:23:46 +0200 |
commit | 31f1434dfe3770ecbdac1bacb8e0fc4a17b3d671 (patch) | |
tree | 0816392be62930436e984e1300c088fdf8f4d551 /iptables | |
parent | 7ae4fb1348874afbfd760d6b7a24e4ea2d6e67ab (diff) |
libxtables: Integrate getethertype.c from xtables core
This moves getethertype.c into libxtables so that both extensions and
xtables-nft-multi may use the implementations therein. New users are
libebt_arp and libebt_vlan which drop their own duplicated
implementations of getethertypebyname() for the shared one.
This change originated from a covscan report of extensions'
implementations not checking fopen() return value which should be
implicitly fixed by this as well.
Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'iptables')
-rw-r--r-- | iptables/Makefile.am | 2 | ||||
-rw-r--r-- | iptables/getethertype.c | 161 |
2 files changed, 1 insertions, 162 deletions
diff --git a/iptables/Makefile.am b/iptables/Makefile.am index d0218ddc..581dc32b 100644 --- a/iptables/Makefile.am +++ b/iptables/Makefile.am @@ -43,7 +43,7 @@ xtables_nft_multi_SOURCES += xtables-save.c xtables-restore.c \ nft-shared.c nft-ipv4.c nft-ipv6.c nft-arp.c \ xtables-monitor.c \ xtables-arp-standalone.c xtables-arp.c \ - getethertype.c nft-bridge.c \ + nft-bridge.c \ xtables-eb-standalone.c xtables-eb.c \ xtables-eb-translate.c \ xtables-translate.c diff --git a/iptables/getethertype.c b/iptables/getethertype.c deleted file mode 100644 index 027ef4ad..00000000 --- a/iptables/getethertype.c +++ /dev/null @@ -1,161 +0,0 @@ -/* -* getethertype.c -* -* This file was part of the NYS Library. -* -** The NYS Library is free software; you can redistribute it and/or -** modify it under the terms of the GNU Library General Public License as -** published by the Free Software Foundation; either version 2 of the -** License, or (at your option) any later version. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -/******************************************************************** -* Description: Ethertype name service switch and the ethertypes -* database access functions -* Author: Nick Fedchik <fnm@ukrsat.com> -* Checker: Bart De Schuymer <bdschuym@pandora.be> -* Origin: uClibc-0.9.16/libc/inet/getproto.c -* Created at: Mon Nov 11 12:20:11 EET 2002 -********************************************************************/ - -#include <ctype.h> -#include <features.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netdb.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <netinet/ether.h> -#include <net/ethernet.h> - -#include <ebtables/ethernetdb.h> - -#define MAXALIASES 35 - -static FILE *etherf = NULL; -static char line[BUFSIZ + 1]; -static struct ethertypeent et_ent; -static char *ethertype_aliases[MAXALIASES]; -static int ethertype_stayopen; - -void setethertypeent(int f) -{ - if (etherf == NULL) - etherf = fopen(_PATH_ETHERTYPES, "r"); - else - rewind(etherf); - ethertype_stayopen |= f; -} - -void endethertypeent(void) -{ - if (etherf) { - fclose(etherf); - etherf = NULL; - } - ethertype_stayopen = 0; -} - -struct ethertypeent *getethertypeent(void) -{ - char *e; - char *endptr; - register char *cp, **q; - - if (etherf == NULL - && (etherf = fopen(_PATH_ETHERTYPES, "r")) == NULL) { - return (NULL); - } - -again: - if ((e = fgets(line, BUFSIZ, etherf)) == NULL) { - return (NULL); - } - if (*e == '#') - goto again; - cp = strpbrk(e, "#\n"); - if (cp == NULL) - goto again; - *cp = '\0'; - et_ent.e_name = e; - cp = strpbrk(e, " \t"); - if (cp == NULL) - goto again; - *cp++ = '\0'; - while (*cp == ' ' || *cp == '\t') - cp++; - e = strpbrk(cp, " \t"); - if (e != NULL) - *e++ = '\0'; -// Check point - et_ent.e_ethertype = strtol(cp, &endptr, 16); - if (*endptr != '\0' - || (et_ent.e_ethertype < ETH_ZLEN - || et_ent.e_ethertype > 0xFFFF)) - goto again; // Skip invalid etherproto type entry - q = et_ent.e_aliases = ethertype_aliases; - if (e != NULL) { - cp = e; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < ðertype_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - } - } - *q = NULL; - return (&et_ent); -} - - -struct ethertypeent *getethertypebyname(const char *name) -{ - register struct ethertypeent *e; - register char **cp; - - setethertypeent(ethertype_stayopen); - while ((e = getethertypeent()) != NULL) { - if (strcasecmp(e->e_name, name) == 0) - break; - for (cp = e->e_aliases; *cp != 0; cp++) - if (strcasecmp(*cp, name) == 0) - goto found; - } -found: - if (!ethertype_stayopen) - endethertypeent(); - return (e); -} - -struct ethertypeent *getethertypebynumber(int type) -{ - register struct ethertypeent *e; - - setethertypeent(ethertype_stayopen); - while ((e = getethertypeent()) != NULL) - if (e->e_ethertype == type) - break; - if (!ethertype_stayopen) - endethertypeent(); - return (e); -} |