From 2740a81103d6ab3c8baa789a3b951b472d0f4065 Mon Sep 17 00:00:00 2001 From: goldsimon Date: Wed, 16 May 2007 18:55:25 +0000 Subject: [PATCH] If a udp_pcb has a local_ip set, check if it is the same as the one of the netif used for sending to prevent sending from old addresses after a netif address gets changed (partly fixes bug #3168). --- CHANGELOG | 5 +++++ src/api/api_msg.c | 8 ++++---- src/core/udp.c | 10 ++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 31aaf0e0..ffa307e9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -158,6 +158,11 @@ HISTORY ++ Bug fixes: + 2007-05-16 Simon Goldschmidt + * api_msg.c, udp.c: If a udp_pcb has a local_ip set, check if it is the same + as the one of the netif used for sending to prevent sending from old + addresses after a netif address gets changed (partly fixes bug #3168). + 2007-05-16 Frédéric Bernon * tcpip.c, igmp.h, igmp.c: Fixed bug "#19800 : IGMP: igmp_tick() will not work with NO_SYS=1". Note that igmp_init is always in tcpip_thread (and not in diff --git a/src/api/api_msg.c b/src/api/api_msg.c index 915d8dde..077ed3a9 100644 --- a/src/api/api_msg.c +++ b/src/api/api_msg.c @@ -582,9 +582,9 @@ do_send(struct api_msg_msg *msg) #if LWIP_RAW case NETCONN_RAW: if (msg->msg.b->addr==NULL) { - raw_send(msg->conn->pcb.raw, msg->msg.b->p); + msg->conn->err = raw_send(msg->conn->pcb.raw, msg->msg.b->p); } else { - raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, msg->msg.b->addr); + msg->conn->err = raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, msg->msg.b->addr); } break; #endif @@ -595,9 +595,9 @@ do_send(struct api_msg_msg *msg) /* FALLTHROUGH */ case NETCONN_UDP: if (msg->msg.b->addr==NULL) { - udp_send(msg->conn->pcb.udp, msg->msg.b->p); + msg->conn->err = udp_send(msg->conn->pcb.udp, msg->msg.b->p); } else { - udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, msg->msg.b->addr, msg->msg.b->port); + msg->conn->err = udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, msg->msg.b->addr, msg->msg.b->port); } break; #endif /* LWIP_UDP */ diff --git a/src/core/udp.c b/src/core/udp.c index 29326f5b..5e1ef75b 100644 --- a/src/core/udp.c +++ b/src/core/udp.c @@ -355,6 +355,16 @@ udp_send(struct udp_pcb *pcb, struct pbuf *p) /* use outgoing network interface IP address as source address */ src_ip = &(netif->ip_addr); } else { + /* check if UDP PCB local IP address is correct */ + if (!ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) { + if (q != p) { + /* free the header pbuf */ + pbuf_free(q); + q = NULL; + /* p is still referenced by the caller, and will live on */ + } + return ERR_VAL; + } /* use UDP PCB local IP address as source address */ src_ip = &(pcb->local_ip); }