diff options
author | Marcus Boerger <helly@php.net> | 2002-08-27 00:20:37 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2002-08-27 00:20:37 +0000 |
commit | 36ede8b86f9fee13f1cadd747a2042ac3152fe77 (patch) | |
tree | 06c71bd5387f55aa24f0d7d6e335c5dd8200d25e | |
parent | 9cf662e1a2775d0a425790b2b099ac5158542c8d (diff) | |
download | php-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.c | 57 |
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); |