164 lines
5.8 KiB
Diff
164 lines
5.8 KiB
Diff
From 23524bf85b887adbc513bc015c9530355967bc04 Mon Sep 17 00:00:00 2001
|
|
From: Kruzya <CrazyHackGUT@users.noreply.github.com>
|
|
Date: Sat, 15 Sep 2018 08:55:11 +0300
|
|
Subject: [PATCH 065/557] examples: Fix memory leaks from realloc errors
|
|
|
|
Make sure to not overwrite the reallocated pointer in realloc() calls
|
|
to avoid a memleak on memory errors.
|
|
---
|
|
docs/examples/crawler.c | 8 +++++++-
|
|
docs/examples/curlx.c | 12 ++++++++++--
|
|
docs/examples/getinmemory.c | 7 ++++---
|
|
docs/examples/postinmemory.c | 7 ++++---
|
|
docs/examples/xmlstream.c | 7 ++++---
|
|
5 files changed, 29 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/docs/examples/crawler.c b/docs/examples/crawler.c
|
|
index 0aeb865..d8fa5a4 100644
|
|
--- a/docs/examples/crawler.c
|
|
+++ b/docs/examples/crawler.c
|
|
@@ -52,7 +52,13 @@ size_t grow_buffer(void *contents, size_t sz, size_t nmemb, void *ctx)
|
|
{
|
|
size_t realsize = sz * nmemb;
|
|
memory *mem = (memory*) ctx;
|
|
- mem->buf = realloc(mem->buf, mem->size + realsize);
|
|
+ char *ptr = realloc(mem->buf, mem->size + realsize);
|
|
+ if(!ptr) {
|
|
+ /* out of memory */
|
|
+ printf("not enough memory (realloc returned NULL)\n");
|
|
+ return 0;
|
|
+ }
|
|
+ mem->buf = ptr;
|
|
memcpy(&(mem->buf[mem->size]), contents, realsize);
|
|
mem->size += realsize;
|
|
return realsize;
|
|
diff --git a/docs/examples/curlx.c b/docs/examples/curlx.c
|
|
index 141f5a8..49f52e6 100644
|
|
--- a/docs/examples/curlx.c
|
|
+++ b/docs/examples/curlx.c
|
|
@@ -515,12 +515,20 @@ int main(int argc, char **argv)
|
|
curl_easy_setopt(p.curl, CURLOPT_SSL_CTX_DATA, &p);
|
|
|
|
{
|
|
+ char *ptr;
|
|
int lu; int i = 0;
|
|
while((lu = BIO_read(in, &binaryptr[i], tabLength-i)) >0) {
|
|
i += lu;
|
|
if(i == tabLength) {
|
|
tabLength += 100;
|
|
- binaryptr = realloc(binaryptr, tabLength); /* should be more careful */
|
|
+ ptr = realloc(binaryptr, tabLength); /* should be more careful */
|
|
+ if(!ptr) {
|
|
+ /* out of memory */
|
|
+ BIO_printf(p.errorbio, "out of memory (realloc returned NULL)\n");
|
|
+ goto fail;
|
|
+ }
|
|
+ binaryptr = ptr;
|
|
+ ptr = NULL;
|
|
}
|
|
}
|
|
tabLength = i;
|
|
@@ -551,7 +559,7 @@ int main(int argc, char **argv)
|
|
/*** code d'erreur si accept mime ***, egalement code return HTTP != 200 ***/
|
|
|
|
/* free the header list*/
|
|
-
|
|
+fail:
|
|
curl_slist_free_all(headers);
|
|
|
|
/* always cleanup */
|
|
diff --git a/docs/examples/getinmemory.c b/docs/examples/getinmemory.c
|
|
index f5e8942..a21a2aa 100644
|
|
--- a/docs/examples/getinmemory.c
|
|
+++ b/docs/examples/getinmemory.c
|
|
@@ -5,7 +5,7 @@
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
*
|
|
* This software is licensed as described in the file COPYING, which
|
|
* you should have received as part of this distribution. The terms
|
|
@@ -42,13 +42,14 @@ WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
|
size_t realsize = size * nmemb;
|
|
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
|
|
|
|
- mem->memory = realloc(mem->memory, mem->size + realsize + 1);
|
|
- if(mem->memory == NULL) {
|
|
+ char *ptr = realloc(mem->memory, mem->size + realsize + 1);
|
|
+ if(ptr == NULL) {
|
|
/* out of memory! */
|
|
printf("not enough memory (realloc returned NULL)\n");
|
|
return 0;
|
|
}
|
|
|
|
+ mem->memory = ptr;
|
|
memcpy(&(mem->memory[mem->size]), contents, realsize);
|
|
mem->size += realsize;
|
|
mem->memory[mem->size] = 0;
|
|
diff --git a/docs/examples/postinmemory.c b/docs/examples/postinmemory.c
|
|
index 488d227..176f24a 100644
|
|
--- a/docs/examples/postinmemory.c
|
|
+++ b/docs/examples/postinmemory.c
|
|
@@ -5,7 +5,7 @@
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
*
|
|
* This software is licensed as described in the file COPYING, which
|
|
* you should have received as part of this distribution. The terms
|
|
@@ -39,13 +39,14 @@ WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
|
size_t realsize = size * nmemb;
|
|
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
|
|
|
|
- mem->memory = realloc(mem->memory, mem->size + realsize + 1);
|
|
- if(mem->memory == NULL) {
|
|
+ char *ptr = realloc(mem->memory, mem->size + realsize + 1);
|
|
+ if(!ptr) {
|
|
/* out of memory! */
|
|
printf("not enough memory (realloc returned NULL)\n");
|
|
return 0;
|
|
}
|
|
|
|
+ mem->memory = ptr;
|
|
memcpy(&(mem->memory[mem->size]), contents, realsize);
|
|
mem->size += realsize;
|
|
mem->memory[mem->size] = 0;
|
|
diff --git a/docs/examples/xmlstream.c b/docs/examples/xmlstream.c
|
|
index 9ee4a2e..296ae3b 100644
|
|
--- a/docs/examples/xmlstream.c
|
|
+++ b/docs/examples/xmlstream.c
|
|
@@ -5,7 +5,7 @@
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
*
|
|
* This software is licensed as described in the file COPYING, which
|
|
* you should have received as part of this distribution. The terms
|
|
@@ -69,14 +69,15 @@ static void characterDataHandler(void *userData, const XML_Char *s, int len)
|
|
struct ParserStruct *state = (struct ParserStruct *) userData;
|
|
struct MemoryStruct *mem = &state->characters;
|
|
|
|
- mem->memory = realloc(mem->memory, mem->size + len + 1);
|
|
- if(mem->memory == NULL) {
|
|
+ char *ptr = realloc(mem->memory, mem->size + len + 1);
|
|
+ if(!ptr) {
|
|
/* Out of memory. */
|
|
fprintf(stderr, "Not enough memory (realloc returned NULL).\n");
|
|
state->ok = 0;
|
|
return;
|
|
}
|
|
|
|
+ mem->memory = ptr;
|
|
memcpy(&(mem->memory[mem->size]), s, len);
|
|
mem->size += len;
|
|
mem->memory[mem->size] = 0;
|
|
--
|
|
1.8.3.1
|
|
|