From: Marcus Boerger Date: Tue, 27 Aug 2002 00:20:37 +0000 (+0000) Subject: -fix memory leak on failure X-Git-Tag: RELEASE_0_91~223 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=36ede8b86f9fee13f1cadd747a2042ac3152fe77;p=php -fix memory leak on failure -only use one function for nearly identical things -fix stripslashes not working on input directly --- diff --git a/ext/db/db.c b/ext/db/db.c index fc9ec2d23c..dbe4abf1fb 100644 --- a/ext/db/db.c +++ b/ext/db/db.c @@ -491,46 +491,12 @@ PHP_FUNCTION(dbminsert) RETURN_FALSE; } - ret = php_dbm_insert(info, Z_STRVAL_P(key), Z_STRVAL_P(value) TSRMLS_CC); + ret = php_dbm_insert_replace(info, Z_STRVAL_P(key), Z_STRVAL_P(value), 0 TSRMLS_CC); RETURN_LONG(ret); } /* }}} */ -/* {{{ php_dbm_insert - */ -int php_dbm_insert(dbm_info *info, char *key, char *value TSRMLS_DC) { - datum key_datum, value_datum; - int ret; - DBM_TYPE dbf; - - php_stripslashes(key, NULL TSRMLS_CC); - php_stripslashes(value, NULL TSRMLS_CC); - - value_datum.dptr = estrdup(value); - value_datum.dsize = strlen(value); - - key_datum.dptr = estrdup(key); - key_datum.dsize = strlen(key); -#if GDBM_FIX - key_datum.dsize++; -#endif - - dbf = info->dbf; - if (!dbf) { - php_error(E_WARNING, "%s(): Unable to locate dbm file", get_active_function_name(TSRMLS_C)); - return 1; - } - - ret = DBM_STORE(dbf, key_datum, value_datum, DBM_INSERT); - - /* free the memory */ - efree(key_datum.dptr); efree(value_datum.dptr); - - return(ret); -} -/* }}} */ - /* {{{ proto int dbmreplace(int dbm_identifier, string key, string value) Replaces the value for a key in a dbm database */ PHP_FUNCTION(dbmreplace) @@ -551,28 +517,31 @@ PHP_FUNCTION(dbmreplace) RETURN_FALSE; } - ret = php_dbm_replace(info, Z_STRVAL_P(key), Z_STRVAL_P(value) TSRMLS_CC); + ret = php_dbm_insert_replace(info, Z_STRVAL_P(key), Z_STRVAL_P(value), 1 TSRMLS_CC); RETURN_LONG(ret); } /* }}} */ /* {{{ php_dbm_replace */ -int php_dbm_replace(dbm_info *info, char *key, char *value TSRMLS_DC) +int php_dbm_insert_replace(dbm_info *info, char *key, char *value, int replace_mode TSRMLS_DC) { DBM_TYPE dbf; int ret; datum key_datum, value_datum; + key = estrdup(key); + value = estrdup(value); + if (PG(magic_quotes_runtime)) { php_stripslashes(key, NULL TSRMLS_CC); php_stripslashes(value, NULL TSRMLS_CC); } - value_datum.dptr = estrdup(value); + value_datum.dptr = value; value_datum.dsize = strlen(value); - key_datum.dptr = estrdup(key); + key_datum.dptr = key; key_datum.dsize = strlen(key); #if GDBM_FIX key_datum.dsize++; @@ -581,11 +550,15 @@ int php_dbm_replace(dbm_info *info, char *key, char *value TSRMLS_DC) dbf = info->dbf; if (!dbf) { php_error(E_WARNING, "%s(): Unable to locate dbm file", get_active_function_name(TSRMLS_C)); - return 1; + ret = 1; + } else { + if (!replace_mode) { + ret = DBM_STORE(dbf, key_datum, value_datum, DBM_INSERT); + } else { + ret = DBM_STORE(dbf, key_datum, value_datum, DBM_REPLACE); + } } - ret = DBM_STORE(dbf, key_datum, value_datum, DBM_REPLACE); - /* free the memory */ efree(key_datum.dptr); efree(value_datum.dptr);