Another try to fix bug #49264: Crash Error when LWIP_SOCKET_OFFSET is in use

This commit is contained in:
Dirk Ziegelmeier 2016-10-04 14:05:56 +02:00
parent bef7873042
commit 95754ba95a

View File

@ -266,8 +266,8 @@ union sockaddr_aligned {
/* This is to keep track of IP_ADD_MEMBERSHIP calls to drop the membership when /* This is to keep track of IP_ADD_MEMBERSHIP calls to drop the membership when
a socket is closed */ a socket is closed */
struct lwip_socket_multicast_pair { struct lwip_socket_multicast_pair {
/** the socket (+1 to not require initialization) */ /** the socket */
int sa; struct lwip_sock* sock;
/** the interface address */ /** the interface address */
ip4_addr_t if_addr; ip4_addr_t if_addr;
/** the group address */ /** the group address */
@ -2730,14 +2730,16 @@ lwip_fcntl(int s, int cmd, int val)
static int static int
lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr) lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr)
{ {
/* s+1 is stored in the array to prevent having to initialize the array struct lwip_sock *sock = get_socket(s);
(default initialization is to 0) */
int sa = s + 1 - LWIP_SOCKET_OFFSET;
int i; int i;
if (!sock) {
return 0;
}
for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {
if (socket_ipv4_multicast_memberships[i].sa == 0) { if (socket_ipv4_multicast_memberships[i].sock == NULL) {
socket_ipv4_multicast_memberships[i].sa = sa; socket_ipv4_multicast_memberships[i].sock = sock;
ip4_addr_copy(socket_ipv4_multicast_memberships[i].if_addr, *if_addr); ip4_addr_copy(socket_ipv4_multicast_memberships[i].if_addr, *if_addr);
ip4_addr_copy(socket_ipv4_multicast_memberships[i].multi_addr, *multi_addr); ip4_addr_copy(socket_ipv4_multicast_memberships[i].multi_addr, *multi_addr);
return 1; return 1;
@ -2754,16 +2756,18 @@ lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr
static void static void
lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr) lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr)
{ {
/* s+1 is stored in the array to prevent having to initialize the array struct lwip_sock *sock = get_socket(s);
(default initialization is to 0) */
int sa = s + 1 - LWIP_SOCKET_OFFSET;
int i; int i;
if (!sock) {
return;
}
for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {
if ((socket_ipv4_multicast_memberships[i].sa == sa) && if ((socket_ipv4_multicast_memberships[i].sock == sock) &&
ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].if_addr, if_addr) && ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].if_addr, if_addr) &&
ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].multi_addr, multi_addr)) { ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].multi_addr, multi_addr)) {
socket_ipv4_multicast_memberships[i].sa = 0; socket_ipv4_multicast_memberships[i].sock = NULL;
ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr); ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr);
ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr); ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr);
return; return;
@ -2775,21 +2779,22 @@ lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_ad
* *
* ATTENTION: this function is NOT called from tcpip_thread (or under CORE_LOCK). * ATTENTION: this function is NOT called from tcpip_thread (or under CORE_LOCK).
*/ */
static void lwip_socket_drop_registered_memberships(int s) static void
lwip_socket_drop_registered_memberships(int s)
{ {
/* s+1 is stored in the array to prevent having to initialize the array struct lwip_sock *sock = get_socket(s);
(default initialization is to 0) */
int sa = s + 1 - LWIP_SOCKET_OFFSET;
int i; int i;
LWIP_ASSERT("socket has no netconn", sockets[s].conn != NULL); if (!sock) {
return;
}
for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {
if (socket_ipv4_multicast_memberships[i].sa == sa) { if (socket_ipv4_multicast_memberships[i].sock == sock) {
ip_addr_t multi_addr, if_addr; ip_addr_t multi_addr, if_addr;
ip_addr_copy_from_ip4(multi_addr, socket_ipv4_multicast_memberships[i].multi_addr); ip_addr_copy_from_ip4(multi_addr, socket_ipv4_multicast_memberships[i].multi_addr);
ip_addr_copy_from_ip4(if_addr, socket_ipv4_multicast_memberships[i].if_addr); ip_addr_copy_from_ip4(if_addr, socket_ipv4_multicast_memberships[i].if_addr);
socket_ipv4_multicast_memberships[i].sa = 0; socket_ipv4_multicast_memberships[i].sock = NULL;
ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr); ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr);
ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr); ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr);