Submitted By: Bruce Dubbs <bdubbs AT linuxfromscratch DOT org>
Date: 2006-07-29
Initial Package Version: 4.4.20
Origin: Sleepycat
Description: Fix bugs that could cause traps


*** qam/qam_files.c.orig	2005-10-20 11:57:12.000000000 -0700
--- qam/qam_files.c	2006-01-27 13:38:38.000000000 -0800
***************
*** 411,416 ****
--- 411,422 ----
  	    DB_APP_DATA, buf, 0, NULL, &real_name)) != 0)
  		goto err;
  #endif
+ 
+ 	mpf = array->mpfarray[offset].mpf;
+ 	/* This extent my already be marked for delete and closed. */
+ 	if (mpf == NULL)
+ 		goto err;
+ 
  	/*
  	 * The log must be flushed before the file is deleted.  We depend on
  	 * the log record of the last delete to recreate the file if we crash.
***************
*** 418,424 ****
  	if (LOGGING_ON(dbenv) && (ret = __log_flush(dbenv, NULL)) != 0)
  		goto err;
  
- 	mpf = array->mpfarray[offset].mpf;
  	(void)__memp_set_flags(mpf, DB_MPOOL_UNLINK, 1);
  	/* Someone could be real slow, let them close it down. */
  	if (array->mpfarray[offset].pinref != 0)
--- 424,429 ----


*** txn/txn.c.orig	Tue Nov  1 06:50:03 2005
--- txn/txn.c	Tue Jan 31 15:05:13 2006
***************
*** 1049,1060 ****
--- 1049,1062 ----
  		return (ret);
  	memcpy(txn->name, name, len);
  
+ 	TXN_SYSTEM_LOCK(dbenv);
  	if (td->name != INVALID_ROFF) {
  		__db_shalloc_free(
  		    &mgr->reginfo, R_ADDR(&mgr->reginfo, td->name));
  		td->name = INVALID_ROFF;
  	}
  	if ((ret = __db_shalloc(&mgr->reginfo, len, 0, &p)) != 0) {
+ 		TXN_SYSTEM_UNLOCK(dbenv);
  		__db_err(dbenv,
  		    "Unable to allocate memory for transaction name");
  
***************
*** 1063,1068 ****
--- 1065,1071 ----
  
  		return (ret);
  	}
+ 	TXN_SYSTEM_UNLOCK(dbenv);
  	td->name = R_OFFSET(&mgr->reginfo, p);
  	memcpy(p, name, len);
  
