lwip-devel
[Top][All Lists]
Advanced

[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/





reply via email to

[Prev in Thread] Current Thread [Next in Thread]