ETHER: Fix Coverity identified issues
- Let dynamically loaded (Shared Library) routines do argument checking if they've been successfully loaded. - Properly cast file descriptors into SOCKET when stored in the fd_handle - Clean up error paths when opening tun/tap transports - potential leaks. - Avoid possible string overflow when opening a tap device on Linux - Try another way to ignore a return from fread() without getting warnings.
This commit is contained in:
parent
5706465bff
commit
829e64ae67
1 changed files with 40 additions and 25 deletions
59
sim_ether.c
59
sim_ether.c
|
@ -1194,7 +1194,7 @@ int load_pcap(void) {
|
||||||
|
|
||||||
/* define functions with dynamic revectoring */
|
/* define functions with dynamic revectoring */
|
||||||
void pcap_close(pcap_t* a) {
|
void pcap_close(pcap_t* a) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
p_pcap_close(a);
|
p_pcap_close(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1205,7 +1205,7 @@ int pcap_compile(pcap_t* a, struct bpf_program* b, char* c, int d, bpf_u_int32 e
|
||||||
#else
|
#else
|
||||||
int pcap_compile(pcap_t* a, struct bpf_program* b, const char* c, int d, bpf_u_int32 e) {
|
int pcap_compile(pcap_t* a, struct bpf_program* b, const char* c, int d, bpf_u_int32 e) {
|
||||||
#endif
|
#endif
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_compile(a, b, c, d, e);
|
return p_pcap_compile(a, b, c, d, e);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1230,7 +1230,7 @@ const char *pcap_lib_version(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int pcap_datalink(pcap_t* a) {
|
int pcap_datalink(pcap_t* a) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_datalink(a);
|
return p_pcap_datalink(a);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1238,7 +1238,7 @@ int pcap_datalink(pcap_t* a) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int pcap_dispatch(pcap_t* a, int b, pcap_handler c, u_char* d) {
|
int pcap_dispatch(pcap_t* a, int b, pcap_handler c, u_char* d) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_dispatch(a, b, c, d);
|
return p_pcap_dispatch(a, b, c, d);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1246,7 +1246,7 @@ int pcap_dispatch(pcap_t* a, int b, pcap_handler c, u_char* d) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int pcap_findalldevs(pcap_if_t** a, char* b) {
|
int pcap_findalldevs(pcap_if_t** a, char* b) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_findalldevs(a, b);
|
return p_pcap_findalldevs(a, b);
|
||||||
} else {
|
} else {
|
||||||
*a = 0;
|
*a = 0;
|
||||||
|
@ -1257,19 +1257,19 @@ int pcap_findalldevs(pcap_if_t** a, char* b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcap_freealldevs(pcap_if_t* a) {
|
void pcap_freealldevs(pcap_if_t* a) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
p_pcap_freealldevs(a);
|
p_pcap_freealldevs(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcap_freecode(struct bpf_program* a) {
|
void pcap_freecode(struct bpf_program* a) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
p_pcap_freecode(a);
|
p_pcap_freecode(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char* pcap_geterr(pcap_t* a) {
|
char* pcap_geterr(pcap_t* a) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_geterr(a);
|
return p_pcap_geterr(a);
|
||||||
} else {
|
} else {
|
||||||
return (char*) "";
|
return (char*) "";
|
||||||
|
@ -1294,7 +1294,7 @@ pcap_t* pcap_open_live(const char* a, int b, int c, int d, char* e) {
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
int pcap_setmintocopy(pcap_t* a, int b) {
|
int pcap_setmintocopy(pcap_t* a, int b) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_setmintocopy(a, b);
|
return p_pcap_setmintocopy(a, b);
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1302,7 +1302,7 @@ int pcap_setmintocopy(pcap_t* a, int b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE pcap_getevent(pcap_t* a) {
|
HANDLE pcap_getevent(pcap_t* a) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_getevent(a);
|
return p_pcap_getevent(a);
|
||||||
} else {
|
} else {
|
||||||
return (HANDLE) 0;
|
return (HANDLE) 0;
|
||||||
|
@ -1312,7 +1312,7 @@ HANDLE pcap_getevent(pcap_t* a) {
|
||||||
#else
|
#else
|
||||||
#ifdef MUST_DO_SELECT
|
#ifdef MUST_DO_SELECT
|
||||||
int pcap_get_selectable_fd(pcap_t* a) {
|
int pcap_get_selectable_fd(pcap_t* a) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_get_selectable_fd(a);
|
return p_pcap_get_selectable_fd(a);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1321,7 +1321,7 @@ int pcap_get_selectable_fd(pcap_t* a) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int pcap_fileno(pcap_t * a) {
|
int pcap_fileno(pcap_t * a) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_fileno(a);
|
return p_pcap_fileno(a);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1330,7 +1330,7 @@ int pcap_fileno(pcap_t * a) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int pcap_sendpacket(pcap_t* a, const u_char* b, int c) {
|
int pcap_sendpacket(pcap_t* a, const u_char* b, int c) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_sendpacket(a, b, c);
|
return p_pcap_sendpacket(a, b, c);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1338,7 +1338,7 @@ int pcap_sendpacket(pcap_t* a, const u_char* b, int c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int pcap_setfilter(pcap_t* a, struct bpf_program* b) {
|
int pcap_setfilter(pcap_t* a, struct bpf_program* b) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_setfilter(a, b);
|
return p_pcap_setfilter(a, b);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1346,7 +1346,7 @@ int pcap_setfilter(pcap_t* a, struct bpf_program* b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int pcap_setnonblock(pcap_t* a, int nonblock, char *errbuf) {
|
int pcap_setnonblock(pcap_t* a, int nonblock, char *errbuf) {
|
||||||
if (a && (load_pcap() != 0)) {
|
if (load_pcap() != 0) {
|
||||||
return p_pcap_setnonblock(a, nonblock, errbuf);
|
return p_pcap_setnonblock(a, nonblock, errbuf);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1616,7 +1616,7 @@ static void eth_get_nic_hw_addr(ETH_DEV* dev, const char *devname)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fclose(f);
|
fclose(f);
|
||||||
remove("NIC.hwaddr");
|
(void)remove("NIC.hwaddr");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1673,12 +1673,16 @@ FILE *f;
|
||||||
|
|
||||||
memset (buf, 0, buf_size);
|
memset (buf, 0, buf_size);
|
||||||
if ((f = fopen ("/etc/machine-id", "r"))) {
|
if ((f = fopen ("/etc/machine-id", "r"))) {
|
||||||
if (fread (buf, 1, buf_size - 1, f)) {};
|
if (fread (buf, 1, buf_size - 1, f))
|
||||||
|
fclose (f);
|
||||||
|
else
|
||||||
fclose (f);
|
fclose (f);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ((f = popen ("hostname", "r"))) {
|
if ((f = popen ("hostname", "r"))) {
|
||||||
if (fread (buf, 1, buf_size - 1, f)) {};
|
if (fread (buf, 1, buf_size - 1, f))
|
||||||
|
pclose (f);
|
||||||
|
else
|
||||||
pclose (f);
|
pclose (f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2020,7 +2024,7 @@ if (0 == strncmp("tap:", savname, 4)) {
|
||||||
|
|
||||||
memset(&ifr, 0, sizeof(ifr));
|
memset(&ifr, 0, sizeof(ifr));
|
||||||
/* Set up interface flags */
|
/* Set up interface flags */
|
||||||
strcpy(ifr.ifr_name, devname);
|
strlcpy(ifr.ifr_name, devname, sizeof(ifr.ifr_name));
|
||||||
ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
|
ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
|
||||||
|
|
||||||
/* Send interface requests to TUN/TAP driver. */
|
/* Send interface requests to TUN/TAP driver. */
|
||||||
|
@ -2028,9 +2032,10 @@ if (0 == strncmp("tap:", savname, 4)) {
|
||||||
if (ioctl(tun, FIONBIO, &on)) {
|
if (ioctl(tun, FIONBIO, &on)) {
|
||||||
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
||||||
close(tun);
|
close(tun);
|
||||||
|
tun = -1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*fd_handle = tun;
|
*fd_handle = (SOCKET)tun;
|
||||||
strcpy(savname, ifr.ifr_name);
|
strcpy(savname, ifr.ifr_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2039,6 +2044,10 @@ if (0 == strncmp("tap:", savname, 4)) {
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
||||||
|
if ((tun >= 0) && (errbuf[0] != 0)) {
|
||||||
|
close(tun);
|
||||||
|
tun = -1;
|
||||||
|
}
|
||||||
#elif defined(HAVE_BSDTUNTAP) && defined(HAVE_TAP_NETWORK)
|
#elif defined(HAVE_BSDTUNTAP) && defined(HAVE_TAP_NETWORK)
|
||||||
if (1) {
|
if (1) {
|
||||||
char dev_name[64] = "";
|
char dev_name[64] = "";
|
||||||
|
@ -2050,9 +2059,10 @@ if (0 == strncmp("tap:", savname, 4)) {
|
||||||
if (ioctl(tun, FIONBIO, &on)) {
|
if (ioctl(tun, FIONBIO, &on)) {
|
||||||
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
||||||
close(tun);
|
close(tun);
|
||||||
|
tun = -1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*fd_handle = tun;
|
*fd_handle = (SOCKET)tun;
|
||||||
strcpy(savname, devname);
|
strcpy(savname, devname);
|
||||||
}
|
}
|
||||||
#if defined (__APPLE__)
|
#if defined (__APPLE__)
|
||||||
|
@ -2069,6 +2079,7 @@ if (0 == strncmp("tap:", savname, 4)) {
|
||||||
if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr)) {
|
if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr)) {
|
||||||
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
||||||
close(tun);
|
close(tun);
|
||||||
|
tun = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
close(s);
|
close(s);
|
||||||
|
@ -2078,6 +2089,10 @@ if (0 == strncmp("tap:", savname, 4)) {
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
||||||
|
if ((tun >= 0) && (errbuf[0] != 0)) {
|
||||||
|
close(tun);
|
||||||
|
tun = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
strlcpy(errbuf, "No support for tap: devices", PCAP_ERRBUF_SIZE);
|
strlcpy(errbuf, "No support for tap: devices", PCAP_ERRBUF_SIZE);
|
||||||
|
@ -2116,7 +2131,7 @@ else { /* !tap: */
|
||||||
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE);
|
||||||
else {
|
else {
|
||||||
*eth_api = ETH_API_VDE;
|
*eth_api = ETH_API_VDE;
|
||||||
*fd_handle = vde_datafd((VDECONN*)(*handle));
|
*fd_handle = (SOCKET)vde_datafd((VDECONN*)(*handle));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
strlcpy(errbuf, "No support for vde: network devices", PCAP_ERRBUF_SIZE);
|
strlcpy(errbuf, "No support for vde: network devices", PCAP_ERRBUF_SIZE);
|
||||||
|
|
Loading…
Add table
Reference in a new issue