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:
| M | dinoco.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;
}