Module: sip-router
Branch: janakj/postgres
Commit: f09596d32a99108f6c34f5fa3641be3dd6470b24
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=f09596d…
Author: Henning Westerholt <henning.westerholt(a)1und1.de>
Committer: Henning Westerholt <henning.westerholt(a)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) {