I'm using Valgrind to find if there's bug in my program (i'm coding under linux) and it find someting, but i don't understand where's the problem.
Valgrind sais:
For the first error valgrind is referring to that conditional jump:==5397== Thread 2:
==5397== Conditional jump or move depends on uninitialised value(s)
==5397== at 0x401358: ListSearch (packethandler.c:97)
==5397== by 0x40177D: HandlePackets (packetreader.c:47)
==5397== by 0x401643: Listen (packethandler.c:146)
==5397== by 0x4E2BFC6: start_thread (in /lib/libpthread-2.7.so)
==5397== by 0x51105AC: clone (in /lib/libc-2.7.so)
==5397==
==5397== Jump to the invalid address stated on the next line
==5397== at 0x0: ???
==5397== by 0x401643: Listen (packethandler.c:146)
==5397== by 0x4E2BFC6: start_thread (in /lib/libpthread-2.7.so)
==5397== by 0x51105AC: clone (in /lib/libc-2.7.so)
==5397== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==5397==
==5397== Process terminating with default action of signal 11 (SIGSEGV)
==5397== Bad permissions for mapped region at address 0x0
==5397== at 0x0: ???
==5397== by 0x401643: Listen (packethandler.c:146)
==5397== by 0x4E2BFC6: start_thread (in /lib/libpthread-2.7.so)
==5397== by 0x51105AC: clone (in /lib/libc-2.7.so)
--5397-- REDIR: 0x50b69e0 (free) redirected to 0x4c20b00 (free)
ListSearch is called here:Code:RecvPacketList *ListSearch(RecvPacketList *plist, unsigned char i) { while (plist != NULL)<- THIS ONE { if (plist->ID == i) { return plist; } plist = plist->next; } return NULL; }
And going again "back", HandlePackets is called here:Code:void HandlePackets(RecvPacketList **plist, char *recvBuff) { unsigned int ID = -1; RecvPacketList *list; while(ID != 0) { ID = (unsigned int)*recvBuff; recvBuff++; list = ListSearch(*plist, ID); if(list != NULL){ pFunction pfunc = list->func; (*pfunc)(&recvBuff); } } }
And as you can see here.. plist IS initialized:Code:void *Listen(void *args) { char recvPacketBuff[1024] = {0}; RecvPacketList *plist; fd_set fset; FD_ZERO(&fset); printf("Initializing Packet List: "); Initialize(&plist); printf("Done\n"); while(1) { FD_SET(sock_fd, &fset); select(sock_fd + 1, &fset, NULL, NULL, NULL); if(FD_ISSET(sock_fd, &fset)){ recv(sock_fd, &recvPacketBuff, sizeof(recvPacketBuff), 0); HandlePackets(&plist, recvPacketBuff); <- THE SECOND ERROR, ln 146 CleanBuff(recvPacketBuff); } } }
If you want also to see register:Code:void Initialize(RecvPacketList **plist) { pFunction temp = NULL; *plist = malloc(sizeof(RecvPacketList)); if(*plist == NULL){ printf("Error to allocate space for plist"); exit(1); } (*plist)->ID = 0; (*plist)->func = NULL; Register(0x0B,plist, temp = DamagePacket); Register(0x24,plist, temp = DisplayBuyList); Register(0x25,plist, temp = TradeEquipOp); Register(0x3C,plist, temp = VendorBuyContentOp); Register(0x6F,plist, temp = SecureTradeOp); Register(0x74,plist, temp = VendorBuyList); Register(0x82,plist, temp = AccountLoginRej); Register(0xA8,plist, temp = AccountLoginAck); Register(0xBA,plist, temp = ArrowOp); Register(0xB7,plist, temp = ObjectHelpResponse); }
Anyway plist is a linked list that contains "static" packet informations (packet to be read).Code:void Register(unsigned char value, RecvPacketList **plist, pFunction func) { RecvPacketList *nextlist = (RecvPacketList *)malloc(sizeof(RecvPacketList)); if(nextlist == NULL){ printf("Memory allocation failed for nextlist"); return; } nextlist->next = *plist; *plist = nextlist; nextlist->ID = value; nextlist->func = func; }
I also highlighted where's the second error.



LinkBack URL
About LinkBacks



