Patches for Berkeley DB version 4.5.20

  1. Fixes access to sequences in the Java API in DB 4.5.20.
  2. Apply the following patch to the db-4.5.20 release.  
    *** sequence/sequence.c.orig	27 Sep 2006 14:56:17 -0000	12.39
    --- sequence/sequence.c	26 Oct 2006 07:36:05 -0000
    ***************
    *** 228,233 ****
    --- 228,236 ----
      	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,370 ****
    --- 368,374 ----
      		ret = t_ret;
     
      	ENV_LEAVE(dbenv, ip);
    + 	__dbt_userfree(dbenv, keyp, NULL, NULL);
      	return (ret);
      }
     
    ***************
    *** 764,769 ****
    --- 768,777 ----
      	DBT *key;
      {
      	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;
    

  3. The patch fixes a problem introduced in 4.5.20 when we changed the way DBTs are copied in calls from the Java API into the core API.
  4. Apply the following patch to the db-4.5.20 release.  
    *** rep/rep_method.c.orig	Fri Oct 20 08:34:06 2006
    --- rep/rep_method.c	Fri Oct 27 12:09:04 2006
    ***************
    *** 524,533 ****
      		 * will allow the client to either perform recovery or
      		 * simply join in.
      		 */
    ! 		if (announce)
      			(void)__rep_send_message(dbenv,
      			    DB_EID_BROADCAST, REP_NEWCLIENT, NULL, dbt, 0, 0);
    ! 		else
      			(void)__rep_send_message(dbenv,
      			    DB_EID_BROADCAST, REP_ALIVE_REQ, NULL, NULL, 0, 0);
      	}
    --- 524,535 ----
      		 * will allow the client to either perform recovery or
      		 * simply join in.
      		 */
    ! 		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
      			(void)__rep_send_message(dbenv,
      			    DB_EID_BROADCAST, REP_ALIVE_REQ, NULL, NULL, 0, 0);
      	}
    ***************
    *** 551,556 ****
    --- 553,559 ----
      	}
      	if (pending_event != DB_EVENT_NO_SUCH_EVENT)
      		DB_EVENT(dbenv, pending_event, NULL);
    + 	__dbt_userfree(dbenv, dbt, NULL, NULL);
      	return (ret);
      }
      
    *** rep/rep_record.c.orig	Fri Oct 20 08:34:06 2006
    --- rep/rep_record.c	Mon Nov 13 10:46:29 2006
    ***************
    *** 161,166 ****
    --- 161,174 ----
      		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;
    ***************
    *** 619,624 ****
    --- 627,633 ----
      			*ret_lsnp = rp->lsn;
      		ret = DB_REP_NOTPERM;
      	}
    + 	__dbt_userfree(dbenv, control, rec, NULL);
      	return (ret);
      }