Submitted By: Matthew Burgess Date: 2007-02-24 Initial Package Version: 4.5.20 Upstream Status: From Upstream Origin: http://www.oracle.com/technology/products/berkeley-db/db/update/4.5.20/patch.4.5.20.html Description: Fixes a couple of issues when trying to access databases through the Java API. diff -Naur db-4.5.20.orig/rep/rep_method.c db-4.5.20/rep/rep_method.c --- db-4.5.20.orig/rep/rep_method.c 2006-09-09 14:29:04.000000000 +0000 +++ db-4.5.20/rep/rep_method.c 2007-02-14 21:14:13.000000000 +0000 @@ -526,10 +526,12 @@ * will allow the client to either perform recovery or * simply join in. */ - if (announce) + if (announce) { + if ((ret = __dbt_usercopy(dbenv, dbt)) != 0) + goto err; (void)__rep_send_message(dbenv, DB_EID_BROADCAST, REP_NEWCLIENT, NULL, dbt, 0, 0); - else + } else (void)__rep_send_message(dbenv, DB_EID_BROADCAST, REP_ALIVE_REQ, NULL, NULL, 0, 0); } @@ -553,6 +555,7 @@ } if (pending_event != DB_EVENT_NO_SUCH_EVENT) DB_EVENT(dbenv, pending_event, NULL); + __dbt_userfree(dbenv, dbt, NULL, NULL); return (ret); } diff -Naur db-4.5.20.orig/rep/rep_record.c db-4.5.20/rep/rep_record.c --- db-4.5.20.orig/rep/rep_record.c 2006-09-12 20:15:21.000000000 +0000 +++ db-4.5.20/rep/rep_record.c 2007-02-14 21:14:13.000000000 +0000 @@ -163,6 +163,14 @@ return (EINVAL); } + if ((ret = __dbt_usercopy(dbenv, control)) != 0 || + (ret = __dbt_usercopy(dbenv, rec)) != 0) { + __dbt_userfree(dbenv, control, rec, NULL); + __db_errx(dbenv, + "DB_ENV->rep_process_message: error retrieving DBT contents"); + return ret; + } + ret = 0; db_rep = dbenv->rep_handle; rep = db_rep->region; @@ -621,6 +629,7 @@ *ret_lsnp = rp->lsn; ret = DB_REP_NOTPERM; } + __dbt_userfree(dbenv, control, rec, NULL); return (ret); } diff -Naur db-4.5.20.orig/sequence/sequence.c db-4.5.20/sequence/sequence.c --- db-4.5.20.orig/sequence/sequence.c 2006-08-24 14:56:16.000000000 +0000 +++ db-4.5.20/sequence/sequence.c 2007-02-14 21:13:48.000000000 +0000 @@ -228,6 +228,9 @@ seq->seq_data.ulen = seq->seq_data.size = sizeof(seq->seq_record); seq->seq_rp = &seq->seq_record; + if ((ret = __dbt_usercopy(dbenv, keyp)) != 0) + goto err; + memset(&seq->seq_key, 0, sizeof(DBT)); if ((ret = __os_malloc(dbenv, keyp->size, &seq->seq_key.data)) != 0) goto err; @@ -365,6 +368,7 @@ ret = t_ret; ENV_LEAVE(dbenv, ip); + __dbt_userfree(dbenv, keyp, NULL, NULL); return (ret); } @@ -765,6 +769,10 @@ { SEQ_ILLEGAL_BEFORE_OPEN(seq, "DB_SEQUENCE->get_key"); + if (F_ISSET(key, DB_DBT_USERCOPY)) + return (__db_retcopy(seq->seq_dbp->dbenv, key, + seq->seq_key.data, seq->seq_key.size, NULL, 0)); + key->data = seq->seq_key.data; key->size = key->ulen = seq->seq_key.size; key->flags = seq->seq_key.flags;