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.