Merge changes I57cb2003,I569d2b81,I01a10e36 into rvc-dev

* changes:
  libnetutils/packet.c - create socket with close-on-exec
  libnetutils/packet.c - fix a raw socket reception race
  libnetutils/packet.c - fix a socket leak on bind error
This commit is contained in:
Maciej Zenczykowski 2020-05-12 01:57:56 +00:00 committed by Android (Google) Code Review
commit ce7d0ba607
2 changed files with 14 additions and 15 deletions

View file

@ -37,25 +37,22 @@
#include "dhcpmsg.h"
int fatal();
int fatal(const char*);
int open_raw_socket(const char *ifname __attribute__((unused)), uint8_t *hwaddr, int if_index)
{
int s;
struct sockaddr_ll bindaddr;
int open_raw_socket(const char* ifname __unused, uint8_t hwaddr[ETH_ALEN], int if_index) {
int s = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
if (s < 0) return fatal("socket(PF_PACKET)");
if((s = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0) {
return fatal("socket(PF_PACKET)");
}
memset(&bindaddr, 0, sizeof(bindaddr));
bindaddr.sll_family = AF_PACKET;
bindaddr.sll_protocol = htons(ETH_P_IP);
bindaddr.sll_halen = ETH_ALEN;
struct sockaddr_ll bindaddr = {
.sll_family = AF_PACKET,
.sll_protocol = htons(ETH_P_IP),
.sll_ifindex = if_index,
.sll_halen = ETH_ALEN,
};
memcpy(bindaddr.sll_addr, hwaddr, ETH_ALEN);
bindaddr.sll_ifindex = if_index;
if (bind(s, (struct sockaddr *)&bindaddr, sizeof(bindaddr)) < 0) {
close(s);
return fatal("Cannot bind raw socket to interface");
}

View file

@ -17,7 +17,9 @@
#ifndef _WIFI_PACKET_H_
#define _WIFI_PACKET_H_
int open_raw_socket(const char *ifname, uint8_t *hwaddr, int if_index);
#include <linux/if_ether.h>
int open_raw_socket(const char* ifname, uint8_t hwaddr[ETH_ALEN], int if_index);
int send_packet(int s, int if_index, struct dhcp_msg *msg, int size,
uint32_t saddr, uint32_t daddr, uint32_t sport, uint32_t dport);
int receive_packet(int s, struct dhcp_msg *msg);