]> granicus.if.org Git - php/commitdiff
-fix memory leak on failure
authorMarcus Boerger <helly@php.net>
Tue, 27 Aug 2002 00:20:37 +0000 (00:20 +0000)
committerMarcus Boerger <helly@php.net>
Tue, 27 Aug 2002 00:20:37 +0000 (00:20 +0000)
-only use one function for nearly identical things
-fix stripslashes not working on input directly

ext/db/db.c

index fc9ec2d23c64a8a613a724382aac69b190bd2882..dbe4abf1fbb08d27e9b78a3670ecb3d22094cb3e 100644 (file)
@@ -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);