Just need to bugfix now
This commit is contained in:
		| @@ -24,6 +24,7 @@ int main(int argc, char *argv[]) { | |||||||
| 		printf("It's a PNG file\n"); | 		printf("It's a PNG file\n"); | ||||||
| 	} | 	} | ||||||
| 	png_chunk **chunks = get_png_chunks(png_buffer); | 	png_chunk **chunks = get_png_chunks(png_buffer); | ||||||
|  | 	free(png_buffer); | ||||||
| 	int size = get_number_of_chunks(chunks); | 	int size = get_number_of_chunks(chunks); | ||||||
| 	for (int i = 0; i < size; i++) { | 	for (int i = 0; i < size; i++) { | ||||||
| 		// Check if header is IDAT or IEND | 		// Check if header is IDAT or IEND | ||||||
| @@ -39,5 +40,7 @@ int main(int argc, char *argv[]) { | |||||||
| 		} | 		} | ||||||
| 		printf("Chunk size is:%d\n", chunks[i]->length); | 		printf("Chunk size is:%d\n", chunks[i]->length); | ||||||
| 	} | 	} | ||||||
| 	// write_png_chunks(path, chunks); | 	write_png_chunks(path, chunks); | ||||||
|  | 	destroy_chunks(chunks); | ||||||
|  | 	return EXIT_SUCCESS; | ||||||
| } | } | ||||||
| @@ -31,8 +31,8 @@ | |||||||
| #include <arpa/inet.h> | #include <arpa/inet.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <zlib.h> |  | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  | #include <stdbool.h> | ||||||
| #include "png.h" | #include "png.h" | ||||||
|  |  | ||||||
| int get_fd(char *path) { | int get_fd(char *path) { | ||||||
| @@ -77,7 +77,7 @@ int is_png(char *buffer) { | |||||||
| 	return memcmp(buffer, PNG_SIGNATURE, PNG_SIGNATURE_SIZE) == 0; | 	return memcmp(buffer, PNG_SIGNATURE, PNG_SIGNATURE_SIZE) == 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| png_chunk *get_png_chunk(char *buffer, int offset) { | png_chunk *get_png_chunk(char *buffer, unsigned int offset) { | ||||||
| 	png_chunk *chunk = malloc(sizeof(png_chunk)); | 	png_chunk *chunk = malloc(sizeof(png_chunk)); | ||||||
| 	if (chunk == NULL) { | 	if (chunk == NULL) { | ||||||
| 		perror("malloc"); | 		perror("malloc"); | ||||||
| @@ -102,7 +102,7 @@ png_chunk **get_png_chunks(char *buffer) { | |||||||
| 		perror("malloc"); | 		perror("malloc"); | ||||||
| 		exit(1); | 		exit(1); | ||||||
| 	} | 	} | ||||||
| 	int offset = PNG_SIGNATURE_SIZE; | 	unsigned int offset = PNG_SIGNATURE_SIZE; | ||||||
| 	int i = 0; | 	int i = 0; | ||||||
| 	while (1) { | 	while (1) { | ||||||
| 		chunks[i] = get_png_chunk(buffer, offset); | 		chunks[i] = get_png_chunk(buffer, offset); | ||||||
| @@ -123,7 +123,10 @@ png_chunk **get_png_chunks(char *buffer) { | |||||||
|  |  | ||||||
| int get_number_of_chunks(png_chunk **chunks) { | int get_number_of_chunks(png_chunk **chunks) { | ||||||
| 	int i = 0; | 	int i = 0; | ||||||
| 	while (chunks[i] != NULL) { | 	while (true) { | ||||||
|  | 		if (memcmp(chunks[i]->type, "IEND", 4) == 0) { | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
| 		i++; | 		i++; | ||||||
| 	} | 	} | ||||||
| 	return i; | 	return i; | ||||||
| @@ -135,6 +138,16 @@ void xor_data(png_chunk *chunk) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void destroy_chunks(png_chunk **chunks) { | ||||||
|  | 	for (int i = 0; get_number_of_chunks(chunks); i++) { | ||||||
|  | 		free(chunks[i]->data); | ||||||
|  | 		free(chunks[i]); | ||||||
|  | 	} | ||||||
|  | 	free(chunks); | ||||||
|  | } | ||||||
|  |  | ||||||
| void write_png_chunks(char *path, png_chunk **chunks) { | void write_png_chunks(char *path, png_chunk **chunks) { | ||||||
| 	FILE *fp = fopen(path, "wb"); | 	FILE *fp = fopen(path, "wb"); | ||||||
| 	if (fp == NULL) { | 	if (fp == NULL) { | ||||||
|   | |||||||
| @@ -62,7 +62,7 @@ char *load_file(int fd); | |||||||
| int is_png(char *buffer); | int is_png(char *buffer); | ||||||
|  |  | ||||||
| // Get PNG chunk | // Get PNG chunk | ||||||
| png_chunk *get_png_chunk(char *buffer, int offset); | png_chunk *get_png_chunk(char *buffer, unsigned int offset); | ||||||
|  |  | ||||||
| // Get all PNG chunks | // Get all PNG chunks | ||||||
| png_chunk **get_png_chunks(char *buffer); | png_chunk **get_png_chunks(char *buffer); | ||||||
| @@ -73,5 +73,8 @@ int get_number_of_chunks(png_chunk **chunks); | |||||||
| // XOR chunk with key | // XOR chunk with key | ||||||
| void xor_data(png_chunk *chunk); | void xor_data(png_chunk *chunk); | ||||||
|  |  | ||||||
|  | // Destroy all chunks | ||||||
|  | void destroy_chunks(png_chunk **chunks); | ||||||
|  |  | ||||||
| // Write PNG chunks to file | // Write PNG chunks to file | ||||||
| void write_png_chunks(char *path, png_chunk **chunks); | void write_png_chunks(char *path, png_chunk **chunks); | ||||||
		Reference in New Issue
	
	Block a user