changed to prototype of qse_mmgr_t function to accept mmgr itself instead of mmgr->ctx and fixed a memory leak bug under a certain failure condition
This commit is contained in:
		| @ -262,6 +262,7 @@ int StdAwk::__build_environ (Run* run, void* envptr) | ||||
| 			if (kptr == QSE_NULL || vptr == QSE_NULL) | ||||
| 			{ | ||||
| 				if (kptr) QSE_MMGR_FREE (mmgr, kptr); | ||||
| 				if (vptr) QSE_MMGR_FREE (mmgr, vptr); | ||||
|  | ||||
| 				/* mbstowcsdup() may fail for invalid encoding. | ||||
| 				 * so setting the error code to ENOMEM may not | ||||
| @ -282,6 +283,7 @@ int StdAwk::__build_environ (Run* run, void* envptr) | ||||
| 			if (kptr == QSE_NULL || vptr == QSE_NULL) | ||||
| 			{ | ||||
| 				if (kptr) QSE_MMGR_FREE (mmgr, kptr); | ||||
| 				if (vptr) QSE_MMGR_FREE (mmgr, vptr); | ||||
|  | ||||
| 				/* mbstowcsdup() may fail for invalid encoding. | ||||
| 				 * so setting the error code to ENOMEM may not | ||||
|  | ||||
| @ -1769,11 +1769,12 @@ static int __build_environ ( | ||||
| 			if (kptr == QSE_NULL || vptr == QSE_NULL) | ||||
| 			{ | ||||
| 				if (kptr) QSE_MMGR_FREE (rtx->awk->mmgr, kptr); | ||||
| 				if (vptr) QSE_MMGR_FREE (rtx->awk->mmgr, vptr); | ||||
| 				qse_awk_rtx_refdownval (rtx, v_env); | ||||
|  | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);  | ||||
| 				return -1; | ||||
| 			}			 | ||||
| 			} | ||||
|  | ||||
| 			*eq = QSE_MT('='); | ||||
| 		#else | ||||
| @ -1787,6 +1788,7 @@ static int __build_environ ( | ||||
| 			if (kptr == QSE_NULL || vptr == QSE_NULL) | ||||
| 			{ | ||||
| 				if (kptr) QSE_MMGR_FREE (rtx->awk->mmgr, kptr); | ||||
| 				if (vptr) QSE_MMGR_FREE (rtx->awk->mmgr, vptr); | ||||
| 				qse_awk_rtx_refdownval (rtx, v_env); | ||||
|  | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
|  | ||||
| @ -24,19 +24,19 @@ | ||||
| QSE_BEGIN_NAMESPACE(QSE) | ||||
| ///////////////////////////////// | ||||
|  | ||||
| void* Mmgr::alloc_mem (void* ctx, size_t n)  | ||||
| void* Mmgr::alloc_mem (mmgr_t* mmgr, size_t n)  | ||||
| { | ||||
| 	return ((Mmgr*)ctx)->allocMem (n); | ||||
| 	return ((Mmgr*)mmgr->ctx)->allocMem (n); | ||||
| } | ||||
|  | ||||
| void* Mmgr::realloc_mem (void* ctx, void* ptr, size_t n)  | ||||
| void* Mmgr::realloc_mem (mmgr_t* mmgr, void* ptr, size_t n)  | ||||
| { | ||||
| 	return ((Mmgr*)ctx)->reallocMem (ptr, n); | ||||
| 	return ((Mmgr*)mmgr->ctx)->reallocMem (ptr, n); | ||||
| } | ||||
|  | ||||
| void Mmgr::free_mem (void* ctx, void* ptr)  | ||||
| void Mmgr::free_mem (mmgr_t* mmgr, void* ptr)  | ||||
| { | ||||
| 	((Mmgr*)ctx)->freeMem (ptr); | ||||
| 	((Mmgr*)mmgr->ctx)->freeMem (ptr); | ||||
| } | ||||
|  | ||||
| ///////////////////////////////// | ||||
|  | ||||
| @ -22,6 +22,12 @@ | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| #	include <windows.h> | ||||
| /* | ||||
| #elif defined(__OS2__) | ||||
| #	define INCL_DOSMEMMGR | ||||
| #	include <os2.h> | ||||
| #	include <bsememf.h> | ||||
| */ | ||||
| #else | ||||
| #	include <stdlib.h> | ||||
| #endif | ||||
| @ -439,7 +445,7 @@ void* qse_memrmem (const void* hs, qse_size_t hl, const void* nd, qse_size_t nl) | ||||
| 	return QSE_NULL; | ||||
| } | ||||
|  | ||||
| static void* mmgr_alloc (void* data, qse_size_t n) | ||||
| static void* mmgr_alloc (qse_mmgr_t* mmgr, qse_size_t n) | ||||
| { | ||||
| #if defined(_WIN32) | ||||
| 	HANDLE heap; | ||||
| @ -452,7 +458,7 @@ static void* mmgr_alloc (void* data, qse_size_t n) | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static void* mmgr_realloc (void* data, void* ptr, qse_size_t n) | ||||
| static void* mmgr_realloc (qse_mmgr_t* mmgr, void* ptr, qse_size_t n) | ||||
| { | ||||
| #if defined(_WIN32) | ||||
| 	HANDLE heap; | ||||
| @ -466,7 +472,7 @@ static void* mmgr_realloc (void* data, void* ptr, qse_size_t n) | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static void mmgr_free (void* data, void* ptr) | ||||
| static void mmgr_free (qse_mmgr_t* mmgr, void* ptr) | ||||
| { | ||||
| #if defined(_WIN32) | ||||
| 	HANDLE heap; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user