summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2002-08-27 00:20:37 +0000
committerMarcus Boerger <helly@php.net>2002-08-27 00:20:37 +0000
commit36ede8b86f9fee13f1cadd747a2042ac3152fe77 (patch)
tree06c71bd5387f55aa24f0d7d6e335c5dd8200d25e
parent9cf662e1a2775d0a425790b2b099ac5158542c8d (diff)
downloadphp-git-36ede8b86f9fee13f1cadd747a2042ac3152fe77.tar.gz
-fix memory leak on failure
-only use one function for nearly identical things -fix stripslashes not working on input directly
-rw-r--r--ext/db/db.c57
1 files changed, 15 insertions, 42 deletions
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);