From 283b505889e044b319dd0d20e6a5f36612386bc7 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 27 Oct 2007 03:13:37 +0000 Subject: [PATCH] Fix memory leaks/wrong heap usage by replacing calls to _tcsdup with cmd_dup svn path=/trunk/; revision=29909 --- reactos/base/shell/cmd/cmddbg.c | 17 +++++++++++++++++ reactos/base/shell/cmd/cmddbg.h | 5 +++++ reactos/base/shell/cmd/for.c | 2 +- reactos/base/shell/cmd/where.c | 6 +++--- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/reactos/base/shell/cmd/cmddbg.c b/reactos/base/shell/cmd/cmddbg.c index ff196c737bd..527acc03322 100644 --- a/reactos/base/shell/cmd/cmddbg.c +++ b/reactos/base/shell/cmd/cmddbg.c @@ -146,6 +146,23 @@ cmd_free_dbg(void *ptr, const char *file, int line) free(ptr); } +TCHAR * +cmd_dup_dbg(const TCHAR *str, const char *file, int line) +{ + TCHAR *ptr = NULL; + + if (str != NULL) + { + ptr = (TCHAR *)cmd_alloc_dbg((_tcslen(str) + 1) * sizeof(TCHAR), file, line); + if (ptr != NULL) + { + _tcscpy(ptr, str); + } + } + + return ptr; +} + void cmd_checkbuffer_dbg(void *ptr, const char *file, int line) { diff --git a/reactos/base/shell/cmd/cmddbg.h b/reactos/base/shell/cmd/cmddbg.h index af5bbf63a27..01f5177c76d 100644 --- a/reactos/base/shell/cmd/cmddbg.h +++ b/reactos/base/shell/cmd/cmddbg.h @@ -4,6 +4,7 @@ #define cmd_realloc(ptr,size) cmd_realloc_dbg(ptr, size, __FILE__, __LINE__) #define cmd_free(ptr) cmd_free_dbg(ptr, __FILE__, __LINE__) #define cmd_checkbuffer(ptr) cmd_checkbuffer_dbg(ptr, __FILE__, __LINE__) +#define cmd_dup(str) cmd_dup_dbg(str, __FILE__, __LINE__) void * cmd_alloc_dbg(size_t size, const char *file, int line); @@ -14,6 +15,9 @@ cmd_realloc_dbg(void *ptr, size_t size, const char *file, int line); void cmd_free_dbg(void *ptr, const char *file, int line); +TCHAR * +cmd_dup_dbg(const TCHAR *str, const char *file, int line); + void cmd_checkbuffer_dbg(void *ptr, const char *file, int line); @@ -25,6 +29,7 @@ cmd_exit(int code); #define cmd_alloc(size) malloc(size) #define cmd_realloc(ptr,size) realloc(ptr, size) #define cmd_free(ptr) free(ptr) +#define cmd_dup(str) _tcsdup(str) #define cmd_checkbuffer(ptr) #endif diff --git a/reactos/base/shell/cmd/for.c b/reactos/base/shell/cmd/for.c index 25cc4889d6a..59f337f9213 100644 --- a/reactos/base/shell/cmd/for.c +++ b/reactos/base/shell/cmd/for.c @@ -135,7 +135,7 @@ INT cmd_for (LPTSTR cmd, LPTSTR param) bc->params = BatchParams (_T(""), param); /* Split out list */ bc->shiftlevel = 0; bc->forvar = var; - bc->forproto = _tcsdup (pp); + bc->forproto = cmd_dup (pp); if (bc->prev) bc->bEcho = bc->prev->bEcho; else diff --git a/reactos/base/shell/cmd/where.c b/reactos/base/shell/cmd/where.c index c13f11ab801..f85c0a6c174 100644 --- a/reactos/base/shell/cmd/where.c +++ b/reactos/base/shell/cmd/where.c @@ -236,7 +236,7 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) if (pExt != NULL) { LPTSTR pszBuffer2; - pszBuffer2 = _tcsdup(pszBuffer); + pszBuffer2 = cmd_dup(pszBuffer); if (pszBuffer2) { pCh = _tcstok(pszBuffer2, _T(";")); @@ -245,12 +245,12 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) if (0 == _tcsicmp(pCh, pExt)) { cmd_free(pszBuffer); - LocalFree(pszBuffer2); + cmd_free(pszBuffer2); return SearchForExecutableSingle(pFileName, pFullName, NULL); } pCh = _tcstok(NULL, _T(";")); } - LocalFree(pszBuffer2); + cmd_free(pszBuffer2); } }