[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lwip-devel] [bug #19729] pbuf_free problem
From: |
Cui hengbin |
Subject: |
[lwip-devel] [bug #19729] pbuf_free problem |
Date: |
Sat, 28 Apr 2007 08:28:23 +0000 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3 |
URL:
<http://savannah.nongnu.org/bugs/?19729>
Summary: pbuf_free problem
Project: lwIP - A Lightweight TCP/IP stack
Submitted by: phant
Submitted on: Saturday 04/28/2007 at 08:28
Category: pbufs
Severity: 3 - Normal
Item Group: Crash Error
Status: None
Privacy: Public
Assigned to: None
Open/Closed: Open
Discussion Lock: Any
_______________________________________________________
Details:
Hi ALL:
When I define ETHARP_TCPIP_ETHINPUT , using sniffer generating
broadcast frame to network,there always assert at line 606 in pbuf.c .
But I find it a bug,
in tcpip.c when no memory can malloc ,free it ,but in
ethernetif.c ethernetif_input free it again.
#if ETHARP_TCPIP_ETHINPUT
err_t
tcpip_ethinput(struct pbuf *p, struct netif *inp)
{
struct tcpip_msg *msg;
if (mbox != SYS_MBOX_NULL) {
msg = memp_malloc(MEMP_TCPIP_MSG);
if (msg == NULL) {
pbuf_free(p);
//free here
return ERR_MEM;
}
msg->type = TCPIP_MSG_ETHINPUT;
msg->msg.inp.p = p;
msg->msg.inp.netif = inp;
sys_mbox_post(mbox, msg);
return ERR_OK;
}
return ERR_VAL;
}
#endif /* ETHARP_TCPIP_ETHINPUT */
static void
ethernetif_input(struct netif *netif)
{
struct ethernetif *ethernetif;
struct eth_hdr *ethhdr;
struct pbuf *p;
ethernetif = netif->state;
/* move received packet into a new pbuf */
p = low_level_input(netif);
/* no packet could be read, silently ignore this */
if (p == NULL) return;
/* points to packet payload, which starts with an Ethernet header */
ethhdr = p->payload;
switch (htons(ethhdr->type)) {
#if ETHARP_TCPIP_ETHINPUT
/* IP or ARP packet? */
case ETHTYPE_IP:
case ETHTYPE_ARP:
/* full packet send to tcpip_thread to process */
if (netif->input(p, netif)!=ERR_OK)
{ LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: IP input error\n"));
pbuf_free(p);
p = NULL;
}
break;
#else /* ETHARP_TCPIP_ETHINPUT */
#if ETHARP_TCPIP_INPUT
/* IP packet? */
case ETHTYPE_IP:
#if ETHARP_TRUST_IP_MAC
/* update ARP table */
etharp_ip_input(netif, p);
#endif /* ETHARP_TRUST_IP_MAC */
/* skip Ethernet header */
pbuf_header(p, -sizeof(struct eth_hdr));
/* pass to network layer */
if (netif->input(p, netif)!=ERR_OK) /* should
change to "if (netif->input(p, netif)==ERR_MEM)"*/
{ LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: IP input error\n"));
pbuf_free(p); /*
free again so cause asserting in pbuf.c*/
p = NULL;
}
break;
/* ARP packet? */
case ETHTYPE_ARP:
/* pass p to ARP module */
etharp_arp_input(netif, ethernetif->ethaddr, p);
break;
#endif /* ETHARP_TCPIP_INPUT */
#endif /* ETHARP_TCPIP_ETHINPUT */
default:
pbuf_free(p);
p = NULL;
break;
}
}
FYI:
Cuihengbin
-----------------------------------------------------
_______________________________________________________
Reply to this item at:
<http://savannah.nongnu.org/bugs/?19729>
_______________________________________________
Message sent via/by Savannah
http://savannah.nongnu.org/
- [lwip-devel] [bug #19729] pbuf_free problem,
Cui hengbin <=