From 23524bf85b887adbc513bc015c9530355967bc04 Mon Sep 17 00:00:00 2001 From: Kruzya Date: Sat, 15 Sep 2018 08:55:11 +0300 Subject: 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(-) (limited to 'docs') diff --git a/docs/examples/crawler.c b/docs/examples/crawler.c index 0aeb86545..d8fa5a459 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 141f5a88a..49f52e614 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 f5e8942f8..a21a2aafc 100644 --- a/docs/examples/getinmemory.c +++ b/docs/examples/getinmemory.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2015, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2018, Daniel Stenberg, , 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 488d227be..176f24af3 100644 --- a/docs/examples/postinmemory.c +++ b/docs/examples/postinmemory.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2018, Daniel Stenberg, , 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 9ee4a2e88..296ae3b26 100644 --- a/docs/examples/xmlstream.c +++ b/docs/examples/xmlstream.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2018, Daniel Stenberg, , 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; -- cgit v1.2.3