- SV publisher: fixed memory leaks (#191)

pull/202/head
Michael Zillgith 6 years ago
parent 7d1a552cde
commit 118a731b36

@ -29,6 +29,8 @@ main(int argc, char** argv)
printf("Using interface %s\n", interface); printf("Using interface %s\n", interface);
signal(SIGINT, sigint_handler);
SVPublisher svPublisher = SVPublisher_create(NULL, interface); SVPublisher svPublisher = SVPublisher_create(NULL, interface);
if (svPublisher) { if (svPublisher) {

@ -182,6 +182,7 @@ Ethernet_createSocket(const char* interfaceId, uint8_t* destAddress)
{ {
EthernetSocket ethernetSocket = GLOBAL_CALLOC(1, sizeof(struct sEthernetSocket)); EthernetSocket ethernetSocket = GLOBAL_CALLOC(1, sizeof(struct sEthernetSocket));
if (ethernetSocket) {
ethernetSocket->rawSocket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); ethernetSocket->rawSocket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (ethernetSocket->rawSocket == -1) { if (ethernetSocket->rawSocket == -1) {
@ -214,6 +215,7 @@ Ethernet_createSocket(const char* interfaceId, uint8_t* destAddress)
memcpy(ethernetSocket->socketAddress.sll_addr, destAddress, 6); memcpy(ethernetSocket->socketAddress.sll_addr, destAddress, 6);
ethernetSocket->isBind = false; ethernetSocket->isBind = false;
}
return ethernetSocket; return ethernetSocket;
} }

@ -129,6 +129,7 @@ preparePacketBuffer(SVPublisher self, CommParameters* parameters, const char* in
self->buffer = (uint8_t*) GLOBAL_MALLOC(SV_MAX_MESSAGE_SIZE); self->buffer = (uint8_t*) GLOBAL_MALLOC(SV_MAX_MESSAGE_SIZE);
if (self->buffer) {
memcpy(self->buffer, dstAddr, 6); memcpy(self->buffer, dstAddr, 6);
memcpy(self->buffer + 6, srcAddr, 6); memcpy(self->buffer + 6, srcAddr, 6);
@ -171,6 +172,10 @@ preparePacketBuffer(SVPublisher self, CommParameters* parameters, const char* in
self->buffer[bufPos++] = 0x00; self->buffer[bufPos++] = 0x00;
self->payloadStart = bufPos; self->payloadStart = bufPos;
}
else {
return false;
}
return true; return true;
} }
@ -303,7 +308,7 @@ SVPublisher_createEx(CommParameters* parameters, const char* interfaceId, bool u
self->asduList = NULL; self->asduList = NULL;
if (preparePacketBuffer(self, parameters, interfaceId, useVlanTag) == false) { if (preparePacketBuffer(self, parameters, interfaceId, useVlanTag) == false) {
GLOBAL_FREEMEM(self); SVPublisher_destroy(self);
self = NULL; self = NULL;
} }
@ -502,7 +507,6 @@ SVPublisher_setupComplete(SVPublisher self)
} }
void void
SVPublisher_publish(SVPublisher self) SVPublisher_publish(SVPublisher self)
{ {
@ -512,11 +516,26 @@ SVPublisher_publish(SVPublisher self)
Ethernet_sendPacket(self->ethernetSocket, self->buffer, self->payloadStart + self->payloadLength); Ethernet_sendPacket(self->ethernetSocket, self->buffer, self->payloadStart + self->payloadLength);
} }
void void
SVPublisher_destroy(SVPublisher self) SVPublisher_destroy(SVPublisher self)
{ {
if (self->ethernetSocket)
Ethernet_destroySocket(self->ethernetSocket);
if (self->buffer)
GLOBAL_FREEMEM(self->buffer); GLOBAL_FREEMEM(self->buffer);
SVPublisher_ASDU asdu = self->asduList;
while (asdu) {
SVPublisher_ASDU nextAsdu = asdu->_next;
GLOBAL_FREEMEM(asdu);
asdu = nextAsdu;
}
GLOBAL_FREEMEM(self);
} }

Loading…
Cancel
Save