Browse Source

cleaned up leaky memory. Got rid of invalid reads/writes

cecylia 8 years ago
parent
commit
3117747ac8
5 changed files with 46 additions and 6 deletions
  1. 1 0
      server/crypto.c
  2. 38 0
      server/flow.c
  3. 1 0
      server/relay.c
  4. 2 2
      server/slitheen-proxy.c
  5. 4 4
      server/slitheen.h

+ 1 - 0
server/crypto.c

@@ -398,6 +398,7 @@ int verify_finish_hash(flow *f, uint8_t *p, int32_t incoming){
 	if(CRYPTO_memcmp(p, output, fin_length) != 0){
 	//	printf("VERIFY FAILED\n");
 		free(output);
+		EVP_MD_CTX_cleanup(&ctx);
 		return 1;
 	} else {
 		printf("VERIFY PASSED\n");

+ 38 - 0
server/flow.c

@@ -303,6 +303,8 @@ int update_flow(flow *f) {
 			//TODO: later figure this out, for now delete
 			packet *tmp = f->packet_chain;
 			f->packet_chain = f->packet_chain->next;
+			printf("Freed data %p\n", tmp->data);
+			printf("Freed packet %p\n", tmp);
 			free(tmp->data);
 			free(tmp);
 			
@@ -328,6 +330,8 @@ int update_flow(flow *f) {
 			packet *tmp = f->packet_chain;
 			while(tmp != current){
 				f->packet_chain = tmp->next;
+				printf("Freed data %p\n", tmp->data);
+				printf("Freed packet %p\n", tmp);
 				free(tmp->data);
 				free(tmp);
 				tmp = f->packet_chain;
@@ -337,6 +341,8 @@ int update_flow(flow *f) {
 			packet *tmp = f->packet_chain;
 			while(tmp != current){
 				f->packet_chain = tmp->next;
+				printf("Freed data %p\n", tmp->data);
+				printf("Freed packet %p\n", tmp);
 				free(tmp->data);
 				free(tmp);
 				tmp = f->packet_chain;
@@ -367,6 +373,7 @@ err:
  */
 int remove_flow(flow *f) {
 
+	EVP_MD_CTX_cleanup(f->finish_md_ctx);
 	EVP_MD_CTX_destroy(f->finish_md_ctx);
 	//Clean up cipher ctxs
 	if(f->clnt_read_ctx != NULL){
@@ -397,6 +404,30 @@ int remove_flow(flow *f) {
 		free(f->current_session);
 	}
 
+	if(f->packet_chain != NULL){
+		packet *tmp = f->packet_chain;
+		while(tmp != NULL){
+			f->packet_chain = tmp->next;
+			printf("Freed data %p\n", tmp->data);
+			printf("Freed packet %p\n", tmp);
+			free(tmp->data);
+			free(tmp);
+			tmp = f->packet_chain;
+		}
+	}
+		
+	if(f->upstream_queue != NULL){
+		queue_block *tmp = f->upstream_queue;
+		while(tmp != NULL){
+			f->upstream_queue = tmp->next;
+			printf("Freed data %p\n", tmp->data);
+			printf("Freed packet %p\n", tmp);
+			free(tmp->data);
+			free(tmp);
+			tmp = f->upstream_queue;
+		}
+	}
+
 	sem_wait(&flow_table_lock);
 	flow_entry *entry = table->first_entry;
 	if(entry->f == f){
@@ -804,10 +835,12 @@ int add_packet(flow *f, struct packet_info *info){
 	}
 
 	packet *new_packet = calloc(1, sizeof(packet));
+	printf("Allocated new packet %p\n", new_packet);
 	new_packet->seq_num = ntohl(info->tcp_hdr->sequence_num);
 	new_packet->len = info->app_data_len;
 
 	uint8_t *packet_data = calloc(1, new_packet->len);
+	printf("Allocated new packet data %p\n", packet_data);
 	memcpy(packet_data, info->app_data, new_packet->len);
 
 	new_packet->data = packet_data;
@@ -835,6 +868,11 @@ int add_packet(flow *f, struct packet_info *info){
 			previous->next = new_packet;
 		}
 
+	} else {
+		free(new_packet);
+		if(packet_data != NULL){
+			free(packet_data);
+		}
 	}
 	
 	return 0;

+ 1 - 0
server/relay.c

@@ -149,6 +149,7 @@ int read_header(flow *f, struct packet_info *info){
 				free(current->data);
 				f->upstream_queue = current->next;
 				free(current);
+				current = f->upstream_queue;
 			}
 			memcpy(record_ptr+offset, p, f->upstream_remaining);
 			p = record_ptr;

+ 2 - 2
server/slitheen-proxy.c

@@ -34,7 +34,7 @@ int main(int argc, char *argv[]){
 	dev2 = argv[2];
 
 	snprintf(filter1, 33, "ether src host %s", macaddr1);
-	snprintf(filter2, 33, "ether dst host %s", macaddr2);
+	snprintf(filter2, 33, "ether src host %s", macaddr2);
 
 	init_tables();
 	init_session_cache();
@@ -120,7 +120,7 @@ void got_packet(uint8_t *args, const struct pcap_pkthdr *header, const uint8_t *
 
 	struct packet_info *info = calloc(1, sizeof(struct packet_info));
 	uint8_t *tmp_packet = calloc(1, header->len);
-	printf("Allocated %d bytes to %p\n", header->len, tmp_packet);
+	//printf("Allocated %d bytes to %p\n", header->len, tmp_packet);
 	memcpy(tmp_packet, packet, header->len);
 	extract_packet_headers(tmp_packet, info);
 

+ 4 - 4
server/slitheen.h

@@ -4,11 +4,11 @@
 #include <netinet/in.h>
 #include <pcap.h>
 
-//#define macaddr1 "00:25:90:5a:26:99"
-//#define macaddr2 "00:25:90:c9:5a:09"
+#define macaddr1 "00:25:90:5a:26:99"
+#define macaddr2 "00:25:90:c9:5a:09"
 
-#define macaddr1 "08:00:27:0e:89:ea"
-#define macaddr2 "08:00:27:0e:89:ea"
+//#define macaddr1 "08:00:27:0e:89:ea"
+//#define macaddr2 "08:00:27:0e:89:ea"
 
 /* Ethernet addresses are 6 bytes */
 #define ETHER_ADDR_LEN	6