0

I was trying to allocate some memory for my data structures (To get data from internet packets), but I faced the problem, that my program just stop, when it goes fro second loop. The first loop goes perfect and all data, inside the structs are correct. Here is the code:

    struct ipOut *ipHeadr = NULL;
    struct ipAddr *addrHeadr = NULL;
    struct hexOut *hexHeadr = NULL;
    struct icmpOut *icmpHeadr = NULL;
    struct igmpOut *igmpHeadr = NULL;
    struct tcpOut *tcpHeadr = NULL;
    struct udpOut *udpHeadr = NULL;

    int main() {

ipHeadr = (struct ipOut*)malloc(sizeof(ipHeadr));
addrHeadr = (struct ipAddr*)malloc(sizeof(addrHeadr));
hexHeadr = (struct hexOut*)malloc(sizeof(hexHeadr));
icmpHeadr = (struct icmpOut*)malloc(sizeof(icmpHeadr));
igmpHeadr = (struct igmpOut*)malloc(sizeof(igmpHeadr));
tcpHeadr = (struct tcpOut*)malloc(sizeof(tcpHeadr));
udpHeadr = (struct udpOut*)malloc(sizeof(udpHeadr));

struct sockaddr saddr;
unsigned char *buff = (unsigned char *)malloc(65536);
int sock = socket(AF_INET , SOCK_RAW , IPPROTO_TCP);
if (sock < 0){
    printf ("Error creating socket");
    return 1;
}
int loop =  1;
while (loop == 1){
    int saddrLength = sizeof saddr;
    rawData = recvfrom(sock, buff, 65536, 0, &saddr, &saddrLength);
    printf("raw data %d\n", rawData);
    if(rawData <0 )
    {
        printf("Failed to get packets\n");
        return 1;
    }
    gettingPacket(buff, rawData);
}
return 0;
    }

    void gettingPacket(unsigned char * buff, int data){
packetNum++;
ipHeadr = (struct ipOut*)realloc(ipHeadr, sizeof(ipHeadr)*packetNum);
addrHeadr = (struct ipAddr*)realloc(addrHeadr,sizeof(addrHeadr)*packetNum);
hexHeadr = (struct hexOut*)realloc(hexHeadr, sizeof(hexHeadr)*packetNum);
struct iphdr *iph = (struct iphdr*)buff;


switch (iph -> protocol)
{
    case 1:
        icmpNum++;
        icmpHeadr = (struct icmpOut*)realloc(icmpHeadr, sizeof(icmpHeadr)*icmpNum);
        icmpOutput(buff, data);
        hexDataOut(buff, data);
        break;
    case 2:
        igmpNum++;
        igmpHeadr = (struct igmpOut*)realloc(igmpHeadr,sizeof(igmpHeadr)*igmpNum);
        igmpOutput(buff, data);
        hexDataOut(buff, data);
        break;
    case 6:
        tcpNum++;
        tcpHeadr = (struct tcpOut*)realloc(tcpHeadr,sizeof(tcpHeadr)*tcpNum);
        tcpPacketOutput(buff, data);
        hexDataOut(buff, data);
        break;
    case 17:
        udpNum++;
        udpHeadr = (struct udpOut*)realloc(udpHeadr, sizeof(udpHeadr)*udpNum);
        udpPacketOutput(buff, data);
        hexDataOut(buff, data);
        break;

}
    }

Debugging tells that code stops on this line:

    ipHeadr = (struct ipOut*)realloc(ipHeadr, sizeof(ipHeadr)*packetNum);

I think there is a memory leak somewhere, but I cant find it.

Matthew Darens
  • 129
  • 2
  • 8

1 Answers1

0

You are not filling your buffers with any data, so they are a bit useless.

Also, in your call to realloc:

icmpHeadr = (struct icmpOut*)realloc(icmpHeadr, sizeof(icmpHeadr) * icmpNum);
/* the size given above is wrong, sizeof(icmpHeadr) is the size of a pointer. */

You should keep realloc and the copy of data within the buffer together. Such as:

void main(..)
{
void* tmp;

/*  no need to initialize your arrays here
    a NULL value would indicate an empty array */

/*...*/

  case 1:
    /* icmpHeadr can be NULL on first call to realloc that's not a problem
       but realloc could fail if you run out of memory...
    */
    tmp = realloc(icmpHeadr, sizeof(struct icmpOut)*(icmpNum + 1));
    if (tmp)
    {
       icmpHeadr = (struct icmpOut*)tmp;
       memcpy(&icmpHeadr[icmpNum], buff, sizeof(struct icmpOut));
       ++icmpNum;
       icmpOutput(buff, data);
       hexDataOut(buff, data);
    }
    else 
    {
      /* you've ran out of memory 
         You could keep counting icmp messages
         but that would mess your array size, in case memory 
         becomes available later.

         ...or you could simply exit your app.  Avoiding running out of
         memory would necessitate a major rewrite of your app, anyway.
      */
    }
    break;
Michaël Roy
  • 6,338
  • 1
  • 15
  • 19