dinoco

Query DNS records
git clone git://git.relim.de/dinoco.git
Log | Files | Refs | README | LICENSE

commit 65d5467027c14393f50ac6a39cd8d319cc8dead0
parent c0582e2c3e3ad1d41c0f9fb12ec2454088798ee7
Author: Nibo <kroekerrobin@gmail.com>
Date:   Wed, 21 Jun 2023 10:56:26 +0200

Add free()s to all malloc or realloc calls

Diffstat:
Mdinoco.c | 35++++++++++++++++++++++++++++++++---
1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/dinoco.c b/dinoco.c @@ -90,8 +90,12 @@ short parseType(char *arg) for (int i=0; i<16; i++) { if (strcmp(arg, types[i]) == 0) + { + free(arg); return i+1; + } } + free(arg); return -1; } @@ -247,6 +251,8 @@ struct byte_array *formQuestion(struct dns_question *qu) question->bytes[i+2] = 0x00; question->bytes[i+3] = qu->class; question->length = d->length+4; + free(d->bytes); + free(d); return question; } @@ -309,6 +315,7 @@ struct dns_resource_record *parseAnswer(struct byte_array *res, int *start) answer->rdata->bytes = realloc(answer->rdata->bytes, (i+1) * sizeof(char)); } *start += nameLength + 8 + answer->rdlength; + *start += 2; return answer; } @@ -360,10 +367,15 @@ void printAnswer(struct dns_resource_record *answer, enum type type, struct byte char *mailDomain = parseDomain(res, startOfMailDomain, &useless); printf("Preference: %d\n", preference); printf("Mail Exchange: %s\n", mailDomain); + free(mailDomain); break; case TYPE_TXT: break; } + free(answer->rdata->bytes); + free(answer->rdata); + free(answer->domain); + free(answer); } struct byte_array *reqServer(char *req, int length) @@ -375,6 +387,7 @@ struct byte_array *reqServer(char *req, int length) return NULL; } struct hostent *host = (struct hostent *) gethostbyname(ip); + free(ip); int port = 53; int fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd == -1) @@ -481,6 +494,7 @@ int main(int argc, char *argv[]) .class = CLASS_IN }; struct byte_array *question = formQuestion(&qu); + free(qu.domain); req = realloc(req, (reqHeader->length + question->length) * sizeof(char)); for (int e=0; e<question->length; e++) { @@ -488,7 +502,10 @@ int main(int argc, char *argv[]) i++; } int length = reqHeader->length + question->length; + free(reqHeader->bytes); + free(reqHeader); struct byte_array *res = reqServer(req, length); + free(req); if (res == NULL) { printf("reqServer failed.\n"); @@ -496,38 +513,50 @@ int main(int argc, char *argv[]) } if (res->length >= DNS_HEADER_LENGTH) { - /* printf("res:\n"); + printf("res:\n"); for (int i=0; i<res->length; i++) { printf("%d: %02X\n", i, res->bytes[i]); } - printf("\n"); */ + printf("\n"); struct dns_header *resHeader = parseHeader(res->bytes); if (isValidResponse(&DNS_HEADER_DEFAULT, resHeader)) { int startOfAnswer = DNS_HEADER_LENGTH + question->length; + free(question->bytes); + free(question); /* This doesn't mean it's long enough to parse an answer but there is at least part of an answer. */ if (res->length > startOfAnswer) { - struct dns_resource_record *answer = malloc(sizeof(struct dns_resource_record)); + struct dns_resource_record *answer; for (int i=0; i<resHeader->ancount; i++) { answer = parseAnswer(res, &startOfAnswer); printAnswer(answer, t, res); } } + free(res->bytes); + free(res); + free(resHeader); } else { + free(res->bytes); + free(res); + free(resHeader); + free(question->bytes); + free(question); printf("isValidResponse failed.\n"); return -1; } } else { + free(res->bytes); + free(res); printf("Response too short.\n"); return -1; }