[SR-Dev] git:janakj/postgres: - fix memory leak in db_postgres module related to BLOBs (also caused an

Jan Janak jan at iptel.org
Wed Feb 18 01:26:22 CET 2009


Module: sip-router
Branch: janakj/postgres
Commit: f09596d32a99108f6c34f5fa3641be3dd6470b24
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=f09596d32a99108f6c34f5fa3641be3dd6470b24

Author: Henning Westerholt <henning.westerholt at 1und1.de>
Committer: Henning Westerholt <henning.westerholt at 1und1.de>
Date:   Mon Nov 24 17:38:46 2008 +0000

- fix memory leak in db_postgres module related to BLOBs (also caused an
  abort in a assertion when DBG_QM_MALLOC memory manager is used)
- PQunescapeBytea is used for BLOBs, this allocates new memory, which could
  not freed from us later in pkg_free in the DB core
- thus we need to allocate new memory for this datatype, copy the string and
  free the postgres result after that
- small comment fix


git-svn-id: https://openser.svn.sourceforge.net/svnroot/openser/trunk@5250 689a6050-402a-0410-94f2-e92a70836424

---

 modules/db_postgres/km_val.c |   30 ++++++++++++++++++++++--------
 1 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/modules/db_postgres/km_val.c b/modules/db_postgres/km_val.c
index d5a3115..9b7d12b 100644
--- a/modules/db_postgres/km_val.c
+++ b/modules/db_postgres/km_val.c
@@ -61,6 +61,7 @@
 int db_postgres_str2val(const db_type_t _t, db_val_t* _v, const char* _s, const int _l)
 {
 	static str dummy_string = {"", 0};
+	char *tmp_s;
 
 	if (!_v) {
 		LM_ERR("invalid parameter value\n");
@@ -159,19 +160,32 @@ int db_postgres_str2val(const db_type_t _t, db_val_t* _v, const char* _s, const
 
 	case DB_BLOB:
 		LM_DBG("converting BLOB [%.*s]\n", _l, _s);
-		/* PQunescapeBytea:  Converts a string representation of binary data
-		 * into binary data - the reverse of PQescapeBytea.
-		 * This is needed when retrieving bytea data in text format,
-		 * but not when retrieving it in binary format.
+		/*
+		 * The string is stored in new allocated memory, which we could
+		 * not free later thus we need to copy it to some new memory here.
 		 */
-		VAL_BLOB(_v).s = (char*)PQunescapeBytea((unsigned char*)_s, 
-			(size_t*)(void*)&(VAL_BLOB(_v).len) );
+ 		tmp_s = (char*)PQunescapeBytea((unsigned char*)_s, (size_t*)(void*)&(VAL_BLOB(_v).len));
+		if(tmp_s==NULL) {
+			LM_ERR("PQunescapeBytea failed\n");
+			return -7;
+		}
+		VAL_BLOB(_v).s = pkg_malloc(VAL_BLOB(_v).len);
+		if (VAL_BLOB(_v).s == NULL) {
+			LM_ERR("no private memory left\n");
+			PQfreemem(tmp_s);
+			return -8;
+		}
+		LM_DBG("allocate %d bytes memory for BLOB at %p", VAL_BLOB(_v).len, VAL_BLOB(_v).s);
+		memcpy(VAL_BLOB(_v).s, tmp_s, VAL_BLOB(_v).len);
+		PQfreemem(tmp_s);
+
 		VAL_TYPE(_v) = DB_BLOB;
 		VAL_FREE(_v) = 1;
+
 		LM_DBG("got blob len %d\n", _l);
 		return 0;
 	}
-	return -7;
+	return -9;
 }
 
 
@@ -314,7 +328,7 @@ int db_postgres_val2str(const db_con_t* _con, const db_val_t* _v, char* _s, int*
 					(size_t)l, (size_t*)&tmp_len);
 			if(tmp_s==NULL)
 			{
-				LM_ERR("PQescapeBytea failed\n");
+				LM_ERR("PQescapeByteaConn failed\n");
 				return -9;
 			}
 			if (tmp_len > *_len) {




More information about the sr-dev mailing list