- 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,38 +182,40 @@ Ethernet_createSocket(const char* interfaceId, uint8_t* destAddress)
{ {
EthernetSocket ethernetSocket = GLOBAL_CALLOC(1, sizeof(struct sEthernetSocket)); EthernetSocket ethernetSocket = GLOBAL_CALLOC(1, sizeof(struct sEthernetSocket));
ethernetSocket->rawSocket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (ethernetSocket) {
ethernetSocket->rawSocket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (ethernetSocket->rawSocket == -1) {
if (DEBUG_SOCKET) if (ethernetSocket->rawSocket == -1) {
printf("Error creating raw socket!\n"); if (DEBUG_SOCKET)
GLOBAL_FREEMEM(ethernetSocket); printf("Error creating raw socket!\n");
return NULL; GLOBAL_FREEMEM(ethernetSocket);
} return NULL;
}
ethernetSocket->socketAddress.sll_family = PF_PACKET; ethernetSocket->socketAddress.sll_family = PF_PACKET;
ethernetSocket->socketAddress.sll_protocol = htons(ETH_P_IP); ethernetSocket->socketAddress.sll_protocol = htons(ETH_P_IP);
int ifcIdx = getInterfaceIndex(ethernetSocket->rawSocket, interfaceId); int ifcIdx = getInterfaceIndex(ethernetSocket->rawSocket, interfaceId);
if (ifcIdx == -1) { if (ifcIdx == -1) {
Ethernet_destroySocket(ethernetSocket); Ethernet_destroySocket(ethernetSocket);
return NULL; return NULL;
} }
ethernetSocket->socketAddress.sll_ifindex = ifcIdx; ethernetSocket->socketAddress.sll_ifindex = ifcIdx;
ethernetSocket->socketAddress.sll_hatype = ARPHRD_ETHER; ethernetSocket->socketAddress.sll_hatype = ARPHRD_ETHER;
ethernetSocket->socketAddress.sll_pkttype = PACKET_OTHERHOST; ethernetSocket->socketAddress.sll_pkttype = PACKET_OTHERHOST;
ethernetSocket->socketAddress.sll_halen = ETH_ALEN; ethernetSocket->socketAddress.sll_halen = ETH_ALEN;
memset(ethernetSocket->socketAddress.sll_addr, 0, 8); memset(ethernetSocket->socketAddress.sll_addr, 0, 8);
if (destAddress != NULL) if (destAddress != NULL)
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,48 +129,53 @@ 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);
memcpy(self->buffer, dstAddr, 6); if (self->buffer) {
memcpy(self->buffer + 6, srcAddr, 6); memcpy(self->buffer, dstAddr, 6);
memcpy(self->buffer + 6, srcAddr, 6);
int bufPos = 12; int bufPos = 12;
if (useVlanTags) { if (useVlanTags) {
/* Priority tag - IEEE 802.1Q */ /* Priority tag - IEEE 802.1Q */
self->buffer[bufPos++] = 0x81; self->buffer[bufPos++] = 0x81;
self->buffer[bufPos++] = 0x00; self->buffer[bufPos++] = 0x00;
uint8_t tci1 = priority << 5; uint8_t tci1 = priority << 5;
tci1 += vlanId / 256; tci1 += vlanId / 256;
uint8_t tci2 = vlanId % 256; uint8_t tci2 = vlanId % 256;
self->buffer[bufPos++] = tci1; /* Priority + VLAN-ID */ self->buffer[bufPos++] = tci1; /* Priority + VLAN-ID */
self->buffer[bufPos++] = tci2; /* VLAN-ID */ self->buffer[bufPos++] = tci2; /* VLAN-ID */
} }
/* EtherType Sampled Values */ /* EtherType Sampled Values */
self->buffer[bufPos++] = 0x88; self->buffer[bufPos++] = 0x88;
self->buffer[bufPos++] = 0xBa; self->buffer[bufPos++] = 0xBa;
/* APPID */ /* APPID */
self->buffer[bufPos++] = appId / 256; self->buffer[bufPos++] = appId / 256;
self->buffer[bufPos++] = appId % 256; self->buffer[bufPos++] = appId % 256;
self->lengthField = bufPos; self->lengthField = bufPos;
/* Length */ /* Length */
self->buffer[bufPos++] = 0x00; self->buffer[bufPos++] = 0x00;
self->buffer[bufPos++] = 0x08; self->buffer[bufPos++] = 0x08;
/* Reserved1 */ /* Reserved1 */
self->buffer[bufPos++] = 0x00; self->buffer[bufPos++] = 0x00;
self->buffer[bufPos++] = 0x00; self->buffer[bufPos++] = 0x00;
/* Reserved2 */ /* Reserved2 */
self->buffer[bufPos++] = 0x00; self->buffer[bufPos++] = 0x00;
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)
{ {
GLOBAL_FREEMEM(self->buffer); if (self->ethernetSocket)
Ethernet_destroySocket(self->ethernetSocket);
if (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