| 
     
      
      
      From: <di...@us...> - 2010-09-18 06:52:52
       
   | 
Revision: 51570
          http://firebird.svn.sourceforge.net/firebird/?rev=51570&view=rev
Author:   dimitr
Date:     2010-09-18 06:52:46 +0000 (Sat, 18 Sep 2010)
Log Message:
-----------
Fixed CORE-3137: Partial rollback is possible for a selectable procedure modifying data.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2010-09-18 06:52:12 UTC (rev 51569)
+++ firebird/trunk/src/jrd/vio.cpp	2010-09-18 06:52:46 UTC (rev 51570)
@@ -2149,19 +2149,22 @@
 		return;
 	}
 
-	// one by one go on putting all savepoints in the sav_point_list on
-	// top of transaction save points and call VIO_verb_cleanup()
+	// Merge all savepoints in the sav_point_list at the top
+	// of transaction save points and call VIO_verb_cleanup()
 
+	Savepoint* const org_save_point = transaction->tra_save_point;
+	transaction->tra_save_point = *sav_point_list;
+
 	for (Savepoint* sav_point = *sav_point_list; sav_point; sav_point = sav_point->sav_next)
 	{
 		Savepoint* const sav_next = sav_point->sav_next;
 		const SLONG sav_number = sav_point->sav_number;
 
-		// add it to the front
+		if (!sav_point->sav_next)
+		{
+			sav_point->sav_next = org_save_point;
+		}
 
-		sav_point->sav_next = transaction->tra_save_point;
-		transaction->tra_save_point = sav_point;
-
 		VIO_verb_cleanup(tdbb, transaction);
 
 		if ( (sav_point = transaction->tra_save_free) ) {
@@ -2175,6 +2178,8 @@
 		*sav_point_list = sav_point;
 		sav_point_list = &sav_point->sav_next;
 	}
+
+	fb_assert(org_save_point == transaction->tra_save_point);
 }
 
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <asf...@us...> - 2011-02-25 15:28:16
       
   | 
Revision: 52464
          http://firebird.svn.sourceforge.net/firebird/?rev=52464&view=rev
Author:   asfernandes
Date:     2011-02-25 15:28:10 +0000 (Fri, 25 Feb 2011)
Log Message:
-----------
The (bad) definition of fb_assert cause this code to not work in clang. It's a surprive if it works in MSVC.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2011-02-25 13:06:14 UTC (rev 52463)
+++ firebird/trunk/src/jrd/vio.cpp	2011-02-25 15:28:10 UTC (rev 52464)
@@ -1877,10 +1877,14 @@
 			 rpb->rpb_f_page, rpb->rpb_f_line);
 	}
 #endif
-	if (rpb->rpb_stream_flags & RPB_s_undo_data) 
+	if (rpb->rpb_stream_flags & RPB_s_undo_data)
+	{
 		fb_assert(rpb->getWindow(tdbb).win_bdb == NULL);
+	}
 	else
+	{
 		fb_assert(rpb->getWindow(tdbb).win_bdb != NULL);
+	}
 
 	if (pool && !(rpb->rpb_stream_flags & RPB_s_undo_data))
 	{
@@ -2650,10 +2654,14 @@
 		}
 	} while (!VIO_chase_record_version(tdbb, rpb, transaction, pool, false));
 
-	if (rpb->rpb_stream_flags & RPB_s_undo_data) 
+	if (rpb->rpb_stream_flags & RPB_s_undo_data)
+	{
 		fb_assert(rpb->getWindow(tdbb).win_bdb == NULL);
+	}
 	else
+	{
 		fb_assert(rpb->getWindow(tdbb).win_bdb != NULL);
+	}
 
 	if (pool && !(rpb->rpb_stream_flags & RPB_s_undo_data))
 	{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <hv...@us...> - 2011-06-24 12:03:38
       
   | 
Revision: 53228
          http://firebird.svn.sourceforge.net/firebird/?rev=53228&view=rev
Author:   hvlad
Date:     2011-06-24 12:03:32 +0000 (Fri, 24 Jun 2011)
Log Message:
-----------
Delete deferred work when savepoint is cleaned up after failure even if no records was modified. Else DFW task will be repeated at commit making system tables logically inconsistent.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2011-06-24 11:52:00 UTC (rev 53227)
+++ firebird/trunk/src/jrd/vio.cpp	2011-06-24 12:03:32 UTC (rev 53228)
@@ -3292,7 +3292,7 @@
 
 	// Cleanup/merge deferred work/event post
 
-	if (sav_point->sav_verb_actions || (sav_point->sav_flags & SAV_force_dfw))
+	if (sav_point->sav_verb_actions || sav_point->sav_verb_count || (sav_point->sav_flags & SAV_force_dfw))
 	{
 		if (sav_point->sav_verb_count) {
 			DFW_delete_deferred(transaction, sav_point->sav_number);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <hv...@us...> - 2011-07-16 10:41:33
       
   | 
Revision: 53318
          http://firebird.svn.sourceforge.net/firebird/?rev=53318&view=rev
Author:   hvlad
Date:     2011-07-16 10:41:27 +0000 (Sat, 16 Jul 2011)
Log Message:
-----------
Port forward fix for bug CORE-3557 : AV in engine when preparing query against dropping table
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2011-07-16 10:38:10 UTC (rev 53317)
+++ firebird/trunk/src/jrd/vio.cpp	2011-07-16 10:41:27 UTC (rev 53318)
@@ -1341,7 +1341,9 @@
 					IBERROR(187);	// msg 187 cannot delete system relations
 				}
 				DFW_post_work(transaction, dfw_delete_relation, &desc, id);
-				MET_lookup_relation_id(tdbb, id, false);
+				jrd_rel* rel_drop = MET_lookup_relation_id(tdbb, id, false);
+				if (rel_drop)
+					MET_scan_relation(tdbb, rel_drop);
 			}
 			break;
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <hv...@us...> - 2011-09-29 12:34:17
       
   | 
Revision: 53490
          http://firebird.svn.sourceforge.net/firebird/?rev=53490&view=rev
Author:   hvlad
Date:     2011-09-29 12:34:07 +0000 (Thu, 29 Sep 2011)
Log Message:
-----------
Port forward fix for bug CORE-3610 : Can insert DUPLICATE keys in UNIQUE index
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2011-09-29 08:01:32 UTC (rev 53489)
+++ firebird/trunk/src/jrd/vio.cpp	2011-09-29 12:34:07 UTC (rev 53490)
@@ -2162,11 +2162,13 @@
 			if (rpb->rpb_flags & rpb_deleted)
 				return !foreign_key;
 
-			if (rpb->rpb_flags & rpb_uk_modified)
-					return !foreign_key;
+			if (foreign_key)
+			{
+				// clear lock error from status vector
+				fb_utils::init_status(tdbb->tdbb_status_vector);
+				return !(rpb->rpb_flags & rpb_uk_modified);
+			}
 
-			// clear lock error from status vector
-			fb_utils::init_status(tdbb->tdbb_status_vector);
 			return true;
 
 		case tra_dead:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <di...@us...> - 2011-12-01 09:25:08
       
   | 
Revision: 53654
          http://firebird.svn.sourceforge.net/firebird/?rev=53654&view=rev
Author:   dimitr
Date:     2011-12-01 09:24:59 +0000 (Thu, 01 Dec 2011)
Log Message:
-----------
Attempted to fix CORE-3490: Concurrency problem when using named cursors. The solution may look sub-optimal but it doesn't seem to affect the performance.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2011-12-01 09:23:53 UTC (rev 53653)
+++ firebird/trunk/src/jrd/vio.cpp	2011-12-01 09:24:59 UTC (rev 53654)
@@ -119,6 +119,7 @@
 
 static UndoDataRet get_undo_data(thread_db* tdbb, jrd_tra* transaction, record_param* rpb);
 
+static void invalidate_cursor_records(jrd_tra*, record_param*);
 static void list_staying(thread_db*, record_param*, RecordStack&);
 static void notify_garbage_collector(thread_db*, record_param*, SLONG = -1);
 static Record* realloc_record(Record*& record, USHORT fmt_length);
@@ -1608,6 +1609,11 @@
 		}
 	}
 
+	// We're about to erase the record. Post a refetch request
+	// to all the active cursors positioned at this record.
+
+	invalidate_cursor_records(transaction, rpb);
+
 	// If the page can be updated simply, we can skip the remaining crud
 
 	record_param temp;
@@ -2582,6 +2588,11 @@
 		}
 	}
 
+	// We're about to modify the record. Post a refetch request
+	// to all the active cursors positioned at this record.
+
+	invalidate_cursor_records(transaction, org_rpb);
+
 	// hvlad: prepare_update() take EX lock on data page. Subsequent call of
 	// IDX_modify_flag_uk_modified() will read database - if relation's partners
 	// list has not been scanned yet. It could lead to single thread deadlock
@@ -4563,6 +4574,43 @@
 }
 
 
+static void invalidate_cursor_records(jrd_tra* transaction, record_param* mod_rpb)
+{
+/**************************************
+ *
+ *	i n v a l i d a t e _ c u r s o r _ r e c o r d s
+ *
+ **************************************
+ *
+ * Functional description
+ *	Post a refetch request to the records currently fetched
+ *  by active cursors of our transaction, because those records
+ *  have just been updated or deleted.
+ *
+ **************************************/
+	fb_assert(mod_rpb && mod_rpb->rpb_relation);
+
+	for (jrd_req* request = transaction->tra_requests; request; request = request->req_tra_next)
+	{
+		if (request->req_flags & req_active)
+		{
+			for (size_t i = 0; i < request->req_count; i++)
+			{
+				record_param* const org_rpb = &request->req_rpb[i];
+
+				if (org_rpb != mod_rpb &&
+					org_rpb->rpb_relation && org_rpb->rpb_number.isValid() &&
+					org_rpb->rpb_relation->rel_id == mod_rpb->rpb_relation->rel_id &&
+					org_rpb->rpb_number == mod_rpb->rpb_number)
+				{
+					org_rpb->rpb_stream_flags |= RPB_s_refetch;
+				}
+			}
+		}
+	}
+}
+
+
 static void list_staying(thread_db* tdbb, record_param* rpb, RecordStack& staying)
 {
 /**************************************
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <di...@us...> - 2011-12-01 09:37:34
       
   | 
Revision: 53655
          http://firebird.svn.sourceforge.net/firebird/?rev=53655&view=rev
Author:   dimitr
Date:     2011-12-01 09:37:25 +0000 (Thu, 01 Dec 2011)
Log Message:
-----------
Correction.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2011-12-01 09:24:59 UTC (rev 53654)
+++ firebird/trunk/src/jrd/vio.cpp	2011-12-01 09:37:25 UTC (rev 53655)
@@ -4594,7 +4594,7 @@
 	{
 		if (request->req_flags & req_active)
 		{
-			for (size_t i = 0; i < request->req_count; i++)
+			for (size_t i = 0; i < request->req_rpb.getCount(); i++)
 			{
 				record_param* const org_rpb = &request->req_rpb[i];
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <di...@us...> - 2012-09-12 05:26:44
       
   | 
Revision: 57136
          http://firebird.svn.sourceforge.net/firebird/?rev=57136&view=rev
Author:   dimitr
Date:     2012-09-12 05:26:38 +0000 (Wed, 12 Sep 2012)
Log Message:
-----------
Fixed CORE-3924: Bugcheck 291 (cannot find record back version) if GTT is modified concurrently using at least one read-committed read-only transaction.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2012-09-12 03:44:56 UTC (rev 57135)
+++ firebird/trunk/src/jrd/vio.cpp	2012-09-12 05:26:38 UTC (rev 57136)
@@ -2125,6 +2125,7 @@
 		if (!(rpb->rpb_flags & rpb_gc_active))
 		{
 			state = TRA_wait(tdbb, transaction, rpb->rpb_transaction_nr, jrd_tra::tra_wait);
+
 			if (state == tra_precommitted)
 				state = check_precommitted(transaction, rpb);
 		}
@@ -2148,7 +2149,6 @@
 			// removed the records it modified and marked itself
 			// committed
 
-
 			if (!DPM_get(tdbb, rpb, LCK_read)) {
 				return false;
 			}
@@ -2157,7 +2157,6 @@
 			// we are reading is another record (newly inserted),
 			// loop back and try again.
 
-
 			if (tid_fetch != rpb->rpb_transaction_nr)
 			{
 				CCH_RELEASE(tdbb, &rpb->getWindow(tdbb));
@@ -2213,8 +2212,12 @@
 			VIO_backout(tdbb, rpb, transaction);
 			break;
 
+		case tra_limbo:
+			BUGCHECK(184);		// limbo impossible
+			break;
+
 		default:
-			BUGCHECK(184);		// limbo impossible
+			fb_assert(false);
 		}
 	}
 
@@ -5137,11 +5140,11 @@
 
 			/*
 			 * The case statement for tra_us has been pushed down to this
-			 * current position as we donot want to give update conflict
+			 * current position as we do not want to give update conflict
 			 * errors and the "cannot update erased record" within the same
-			 * transaction. We were getting these erroe in case of triggers.
+			 * transaction. We were getting these errors in case of triggers.
 			 * A pre-delete trigger could update or delete a record which we
-			 * are then tring to change.
+			 * are then trying to change.
 			 * In order to remove these changes and restore original behaviour,
 			 * move this case statement above the 2 "if" statements.
 			 * smistry 23-Aug-99
@@ -5207,8 +5210,12 @@
 			// backout a fragmented dead record version, spin wait because it will
 			// finish shortly.
 
-			if (!(rpb->rpb_flags & rpb_gc_active)) {
+			if (!(rpb->rpb_flags & rpb_gc_active))
+			{
 				state = TRA_wait(tdbb, transaction, rpb->rpb_transaction_nr, jrd_tra::tra_wait);
+
+				if (state == tra_precommitted)
+					state = check_precommitted(transaction, rpb);
 			}
 			else
 			{
@@ -5231,6 +5238,7 @@
 				update_conflict_trans = rpb->rpb_transaction_nr;
 				continue;
 			}
+
 			if (state != tra_dead && !(temp->rpb_flags & rpb_deleted))
 			{
 				if (!DPM_fetch(tdbb, temp, LCK_write)) {
@@ -5238,6 +5246,7 @@
 				}
 				delete_record(tdbb, temp, 0, 0);
 			}
+
 			switch (state)
 			{
 			case tra_committed:
@@ -5257,6 +5266,10 @@
 
 			case tra_dead:
 				break;
+
+			default:
+				fb_assert(false);
+
 			} // switch (state)
 			break;
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <di...@us...> - 2012-10-31 14:20:35
       
   | 
Revision: 57266
          http://firebird.svn.sourceforge.net/firebird/?rev=57266&view=rev
Author:   dimitr
Date:     2012-10-31 14:20:24 +0000 (Wed, 31 Oct 2012)
Log Message:
-----------
Avoid a sweep pass for temporary tables, as the sweeper always sees those tables as empty, but even setting them up as empty has a non-zero cost.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2012-10-31 14:16:00 UTC (rev 57265)
+++ firebird/trunk/src/jrd/vio.cpp	2012-10-31 14:20:24 UTC (rev 57266)
@@ -3269,8 +3269,10 @@
 
 		for (size_t i = 1; (vector = attachment->att_relations) && i < vector->count(); i++)
 		{
-			if ((relation = (*vector)[i]) && !(relation->rel_flags & (REL_deleted | REL_deleting)) &&
-				 relation->getPages(tdbb)->rel_pages)
+			if ((relation = (*vector)[i]) &&
+				!(relation->rel_flags & (REL_deleted | REL_deleting)) &&
+				!relation->isTemporary() &&
+				relation->getPages(tdbb)->rel_pages)
 			{
 				rpb.rpb_relation = relation;
 				rpb.rpb_number.setValue(BOF_NUMBER);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <hv...@us...> - 2012-11-20 12:24:03
       
   | 
Revision: 57386
          http://firebird.svn.sourceforge.net/firebird/?rev=57386&view=rev
Author:   hvlad
Date:     2012-11-20 12:23:53 +0000 (Tue, 20 Nov 2012)
Log Message:
-----------
Make sure relation's flags are loaded from disk before analyze them
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2012-11-20 12:23:17 UTC (rev 57385)
+++ firebird/trunk/src/jrd/vio.cpp	2012-11-20 12:23:53 UTC (rev 57386)
@@ -3234,7 +3234,11 @@
 
 		for (size_t i = 1; (vector = attachment->att_relations) && i < vector->count(); i++)
 		{
-			if ((relation = (*vector)[i]) &&
+			relation = (*vector)[i];
+			if (relation)
+				relation = MET_lookup_relation_id(tdbb, i, false);
+
+			if (relation && 
 				!(relation->rel_flags & (REL_deleted | REL_deleting)) &&
 				!relation->isTemporary() &&
 				relation->getPages(tdbb)->rel_pages)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <ale...@us...> - 2013-01-08 10:51:05
       
   | 
Revision: 57584
          http://sourceforge.net/p/firebird/code/57584
Author:   alexpeshkoff
Date:     2013-01-08 10:51:02 +0000 (Tue, 08 Jan 2013)
Log Message:
-----------
comment
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2013-01-07 03:25:01 UTC (rev 57583)
+++ firebird/trunk/src/jrd/vio.cpp	2013-01-08 10:51:02 UTC (rev 57584)
@@ -3217,7 +3217,7 @@
 
 	DPM_scan_pages(tdbb);
 
-	// hvlad: restore tdbb->getTransaction() since it can be used later
+	// hvlad: restore tdbb->transaction since it can be used later
 	tdbb->setTransaction(transaction);
 
 	record_param rpb;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <di...@us...> - 2013-07-02 11:27:03
       
   | 
Revision: 58284
          http://sourceforge.net/p/firebird/code/58284
Author:   dimitr
Date:     2013-07-02 11:27:02 +0000 (Tue, 02 Jul 2013)
Log Message:
-----------
Misc.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2013-07-01 01:03:46 UTC (rev 58283)
+++ firebird/trunk/src/jrd/vio.cpp	2013-07-02 11:27:02 UTC (rev 58284)
@@ -2815,9 +2815,7 @@
 	}
 
 	if (!(rpb->rpb_stream_flags & RPB_s_undo_data))
-	{
-		VIO_data(tdbb, rpb, tdbb->getRequest()->req_pool);
-	}
+		VIO_data(tdbb, rpb, tdbb->getDefaultPool());
 
 	// If record is present, and the transaction is read committed,
 	// make sure the record has not been updated.  Also, punt after
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <di...@us...> - 2013-07-15 13:44:49
       
   | 
Revision: 58352
          http://sourceforge.net/p/firebird/code/58352
Author:   dimitr
Date:     2013-07-15 13:44:47 +0000 (Mon, 15 Jul 2013)
Log Message:
-----------
A quick fix for the bugcheck appeared in test bugs.core_195.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2013-07-15 13:06:57 UTC (rev 58351)
+++ firebird/trunk/src/jrd/vio.cpp	2013-07-15 13:44:47 UTC (rev 58352)
@@ -4485,6 +4485,9 @@
 	if (!transaction->tra_save_point)
 		return udNone;
 
+	if (rpb->rpb_stream_flags & RPB_s_refetch)
+		return udNone;
+
 	VerbAction* action = transaction->tra_save_point->sav_verb_actions;
 
 	for (; action; action = action->vct_next)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <hv...@us...> - 2013-09-10 14:30:44
       
   | 
Revision: 58595
          http://sourceforge.net/p/firebird/code/58595
Author:   hvlad
Date:     2013-09-10 14:30:42 +0000 (Tue, 10 Sep 2013)
Log Message:
-----------
Fixed bug CORE-4212 : Dropping FK on GTT crashes server
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2013-09-10 11:39:54 UTC (rev 58594)
+++ firebird/trunk/src/jrd/vio.cpp	2013-09-10 14:30:42 UTC (rev 58595)
@@ -1439,7 +1439,7 @@
 					jrd_rel *partner;
 					index_desc idx;
 
-					if ((BTR_lookup(tdbb, r2, id - 1, &idx, r2->getPages(tdbb)) == FB_SUCCESS) &&
+					if ((BTR_lookup(tdbb, r2, id - 1, &idx, r2->getBasePages()) == FB_SUCCESS) &&
 						MET_lookup_partner(tdbb, r2, &idx, index_name.nullStr()) &&
 						(partner = MET_lookup_relation_id(tdbb, idx.idx_primary_relation, false)) )
 					{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
From hv...@us... Tue Sep 10 14:35:53 2013
Received: from sog-mx-1.v43.ch3.sourceforge.com ([172.29.43.191]
	helo=mx.sourceforge.net)
	by sfs-ml-4.v29.ch3.sourceforge.com with esmtp (Exim 4.76)
	(envelope-from <hv...@us...>) id 1VJP2n-0006v8-9v
	for fir...@li...;
	Tue, 10 Sep 2013 14:35:53 +0000
X-ACL-Warn: 
Received: from sfp-scm-3.v30.ch3.sourceforge.com ([172.29.30.33])
	by sog-mx-1.v43.ch3.sourceforge.com with smtp (Exim 4.76)
	id 1VJP2l-0005Aw-8Q for fir...@li...;
	Tue, 10 Sep 2013 14:35:53 +0000
Received: by sfp-scm-3.v30.ch3.sourceforge.com (sSMTP sendmail emulation);
	Tue, 10 Sep 2013 14:35:51 +0000
Date: Tue, 10 Sep 2013 14:35:51 +0000
MIME-Version: 1.0
X-Mailer: SVN::Notify 2.80: http://search.cpan.org/dist/SVN-Notify/
From: hv...@us...
Errors-To: hv...@us...
To: fir...@li...
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Subject: [Firebird-checkins] SF.net SVN: firebird:[58596]
 firebird/branches/B2_5_Release/src/jrd/dyn_def .epp
X-BeenThere: fir...@li...
X-Mailman-Version: 2.1.9
Precedence: list
List-Id: <firebird-checkins.lists.sourceforge.net>
List-Unsubscribe: <https://lists.sourceforge.net/lists/listinfo/firebird-checkins>,
	<mailto:fir...@li...?subject=unsubscribe>
List-Archive: <http://sourceforge.net/mailarchive/forum.php?forum_name=firebird-checkins>
List-Post: <mailto:fir...@li...>
List-Help: <mailto:fir...@li...?subject=help>
List-Subscribe: <https://lists.sourceforge.net/lists/listinfo/firebird-checkins>,
	<mailto:fir...@li...?subject=subscribe>
X-List-Received-Date: Tue, 10 Sep 2013 14:35:53 -0000
Revision: 58596
          http://sourceforge.net/p/firebird/code/58596
Author:   hvlad
Date:     2013-09-10 14:35:50 +0000 (Tue, 10 Sep 2013)
Log Message:
-----------
Fixed bug CORE-4214 : GTT should not reference permanent relation
Modified Paths:
--------------
    firebird/branches/B2_5_Release/src/jrd/dyn_def.epp
Modified: firebird/branches/B2_5_Release/src/jrd/dyn_def.epp
===================================================================
--- firebird/branches/B2_5_Release/src/jrd/dyn_def.epp	2013-09-10 14:30:42 UTC (rev 58595)
+++ firebird/branches/B2_5_Release/src/jrd/dyn_def.epp	2013-09-10 14:35:50 UTC (rev 58596)
@@ -5052,6 +5052,9 @@
 
 			make_relation_scope_name(REL_M.RDB$RELATION_NAME, master_type, sMaster);
 			make_relation_scope_name(REL_C.RDB$RELATION_NAME, child_type, sChild);
+			
+			EXE_unwind(tdbb, request);
+			break;
 		}
 	END_FOR;
 
@@ -5121,6 +5124,9 @@
 
 			make_relation_scope_name(REL_M.RDB$RELATION_NAME, master_type, sMaster);
 			make_relation_scope_name(child_rel_name, child_type, sChild);
+
+			EXE_unwind(tdbb, request);
+			break;
 		}
 	END_FOR;
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <hv...@us...> - 2013-09-13 08:15:19
       
   | 
Revision: 58615
          http://sourceforge.net/p/firebird/code/58615
Author:   hvlad
Date:     2013-09-13 08:15:17 +0000 (Fri, 13 Sep 2013)
Log Message:
-----------
Fix to please GCC
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2013-09-13 08:12:28 UTC (rev 58614)
+++ firebird/trunk/src/jrd/vio.cpp	2013-09-13 08:15:17 UTC (rev 58615)
@@ -334,6 +334,9 @@
 	Record* old_data = NULL;
 	Record* gc_rec2 = NULL;
 
+	bool samePage;
+	bool deleted;
+
 	if ((temp.rpb_flags & rpb_deleted) && (!(temp.rpb_flags & rpb_delta)))
 		CCH_RELEASE(tdbb, &temp.getWindow(tdbb));
 	else
@@ -455,8 +458,8 @@
 
 	// If both record versions are on the same page, things are a little simpler
 
-	const bool samePage = (rpb->rpb_page == temp.rpb_page && !rpb->rpb_prior);
-	const bool deleted = (temp2.rpb_flags & rpb_deleted);
+	samePage = (rpb->rpb_page == temp.rpb_page && !rpb->rpb_prior);
+	deleted = (temp2.rpb_flags & rpb_deleted);
 
 	if (!deleted)
 	{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <di...@us...> - 2013-11-18 16:28:27
       
   | 
Revision: 58807
          http://sourceforge.net/p/firebird/code/58807
Author:   dimitr
Date:     2013-11-18 16:28:24 +0000 (Mon, 18 Nov 2013)
Log Message:
-----------
Attempted to fix a number of issues with badly working privileges after restore into ODS12.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2013-11-18 16:27:03 UTC (rev 58806)
+++ firebird/trunk/src/jrd/vio.cpp	2013-11-18 16:28:24 UTC (rev 58807)
@@ -163,7 +163,7 @@
 static void replace_record(thread_db*, record_param*, PageStack*, const jrd_tra*);
 static SSHORT set_metadata_id(thread_db*, Record*, USHORT, drq_type_t, const char*);
 static void set_owner_name(thread_db*, Record*, USHORT);
-static void set_security_class(thread_db*, Record*, USHORT);
+static bool set_security_class(thread_db*, Record*, USHORT);
 static void set_system_flag(thread_db*, Record*, USHORT);
 static void update_in_place(thread_db*, jrd_tra*, record_param*, record_param*);
 static void verb_post(thread_db*, jrd_tra*, record_param*, Record*, const bool, const bool);
@@ -2927,14 +2927,17 @@
 			DFW_post_work(transaction, dfw_create_relation, &desc, 0);
 			DFW_post_work(transaction, dfw_update_format, &desc, 0);
 			set_system_flag(tdbb, rpb->rpb_record, f_rel_sys_flag);
-			set_security_class(tdbb, rpb->rpb_record, f_rel_class);
 			set_owner_name(tdbb, rpb->rpb_record, f_rel_owner);
+			if (set_security_class(tdbb, rpb->rpb_record, f_rel_class))
+				DFW_post_work(transaction, dfw_grant, &desc, obj_relation);
 			break;
 
 		case rel_packages:
+			EVL_field(0, rpb->rpb_record, f_pkg_name, &desc);
 			set_system_flag(tdbb, rpb->rpb_record, f_pkg_sys_flag);
-			set_security_class(tdbb, rpb->rpb_record, f_pkg_class);
 			set_owner_name(tdbb, rpb->rpb_record, f_pkg_owner);
+			if (set_security_class(tdbb, rpb->rpb_record, f_pkg_class))
+				DFW_post_work(transaction, dfw_grant, &desc, obj_package_header);
 			break;
 
 		case rel_procedures:
@@ -2957,8 +2960,12 @@
 			} // scope
 
 			set_system_flag(tdbb, rpb->rpb_record, f_prc_sys_flag);
-			set_security_class(tdbb, rpb->rpb_record, f_prc_class);
-			set_owner_name(tdbb, rpb->rpb_record, f_prc_owner);
+			if (package_name.isEmpty())
+			{
+				set_owner_name(tdbb, rpb->rpb_record, f_prc_owner);
+				if (set_security_class(tdbb, rpb->rpb_record, f_prc_class))
+					DFW_post_work(transaction, dfw_grant, &desc, obj_procedure);
+			}
 			break;
 
 		case rel_funs:
@@ -2981,8 +2988,12 @@
 			} // scope
 
 			set_system_flag(tdbb, rpb->rpb_record, f_fun_sys_flag);
-			set_security_class(tdbb, rpb->rpb_record, f_fun_class);
-			set_owner_name(tdbb, rpb->rpb_record, f_fun_owner);
+			if (package_name.isEmpty())
+			{
+				set_owner_name(tdbb, rpb->rpb_record, f_fun_owner);
+				if (set_security_class(tdbb, rpb->rpb_record, f_fun_class))
+					DFW_post_work(transaction, dfw_grant, &desc, obj_udf);
+			}
 			break;
 
 		case rel_indices:
@@ -3016,8 +3027,9 @@
 			EVL_field(0, rpb->rpb_record, f_fld_name, &desc);
 			DFW_post_work(transaction, dfw_create_field, &desc, 0);
 			set_system_flag(tdbb, rpb->rpb_record, f_fld_sys_flag);
-			set_security_class(tdbb, rpb->rpb_record, f_fld_class);
 			set_owner_name(tdbb, rpb->rpb_record, f_fld_owner);
+			if (set_security_class(tdbb, rpb->rpb_record, f_fld_class))
+				DFW_post_work(transaction, dfw_grant, &desc, obj_field);
 			break;
 
 		case rel_files:
@@ -3104,28 +3116,35 @@
 			transaction->getGenIdCache()->put(object_id, 0);
 			DFW_post_work(transaction, dfw_set_generator, &desc, object_id);
 			set_system_flag(tdbb, rpb->rpb_record, f_gen_sys_flag);
-			set_security_class(tdbb, rpb->rpb_record, f_gen_class);
 			set_owner_name(tdbb, rpb->rpb_record, f_gen_owner);
+			if (set_security_class(tdbb, rpb->rpb_record, f_gen_class))
+				DFW_post_work(transaction, dfw_grant, &desc, obj_generator);
 			break;
 
 		case rel_charsets:
+			EVL_field(0, rpb->rpb_record, f_cs_cs_name, &desc);
 			set_system_flag(tdbb, rpb->rpb_record, f_cs_sys_flag);
-			set_security_class(tdbb, rpb->rpb_record, f_cs_class);
 			set_owner_name(tdbb, rpb->rpb_record, f_cs_owner);
+			if (set_security_class(tdbb, rpb->rpb_record, f_cs_class))
+				DFW_post_work(transaction, dfw_grant, &desc, obj_charset);
 			break;
 
 		case rel_collations:
+			EVL_field(0, rpb->rpb_record, f_coll_name, &desc);
 			set_system_flag(tdbb, rpb->rpb_record, f_coll_sys_flag);
-			set_security_class(tdbb, rpb->rpb_record, f_coll_class);
 			set_owner_name(tdbb, rpb->rpb_record, f_coll_owner);
+			if (set_security_class(tdbb, rpb->rpb_record, f_coll_class))
+				DFW_post_work(transaction, dfw_grant, &desc, obj_collation);
 			break;
 
 		case rel_exceptions:
+			EVL_field(0, rpb->rpb_record, f_xcp_name, &desc);
 			set_metadata_id(tdbb, rpb->rpb_record,
 							f_xcp_number, drq_g_nxt_xcp_id, "RDB$EXCEPTIONS");
 			set_system_flag(tdbb, rpb->rpb_record, f_xcp_sys_flag);
-			set_security_class(tdbb, rpb->rpb_record, f_xcp_class);
 			set_owner_name(tdbb, rpb->rpb_record, f_xcp_owner);
+			if (set_security_class(tdbb, rpb->rpb_record, f_xcp_class))
+				DFW_post_work(transaction, dfw_grant, &desc, obj_exception);
 			break;
 
 		default:    // Shut up compiler warnings
@@ -5496,7 +5515,7 @@
 }
 
 
-static void set_security_class(thread_db* tdbb, Record* record, USHORT field_id)
+static bool set_security_class(thread_db* tdbb, Record* record, USHORT field_id)
 {
 /**************************************
  *
@@ -5519,7 +5538,11 @@
 		desc2.makeText((USHORT) name.length(), CS_ASCII, (UCHAR*) name.c_str());
 		MOV_move(tdbb, &desc2, &desc1);
 		record->clearNull(field_id);
+
+		return true;
 	}
+
+	return false;
 }
 
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <ro...@us...> - 2014-03-11 07:40:45
       
   | 
Revision: 59252
          http://sourceforge.net/p/firebird/code/59252
Author:   robocop
Date:     2014-03-11 07:40:42 +0000 (Tue, 11 Mar 2014)
Log Message:
-----------
More restrictions on sys tables. Please report if you have problems with DDL or the utilities.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2014-03-11 06:22:52 UTC (rev 59251)
+++ firebird/trunk/src/jrd/vio.cpp	2014-03-11 07:40:42 UTC (rev 59252)
@@ -159,7 +159,8 @@
 static int prepare_update(thread_db*, jrd_tra*, TraNumber commit_tid_read, record_param*,
 	record_param*, record_param*, PageStack&, bool);
 
-static void protect_system_table(thread_db*, const jrd_rel*, const char*, bool = false);
+static void protect_system_table(thread_db* tdbb, const jrd_rel* relation, const char* operation,
+	bool force_flag = false);
 static void purge(thread_db*, record_param*);
 static Record* replace_gc_record(jrd_rel*, Record**, ULONG);
 static void replace_record(thread_db*, record_param*, PageStack*, const jrd_tra*);
@@ -2932,6 +2933,29 @@
 	{
 		switch ((RIDS) relation->rel_id)
 		{
+		case rel_pages:
+		case rel_database:
+		case rel_formats:
+		case rel_trans:
+		case rel_rcon:
+		case rel_refc:
+		case rel_ccon:
+		case rel_roles:
+		case rel_sec_users:
+		case rel_sec_user_attributes:
+			protect_system_table(tdbb, relation, "INSERT");
+			break;
+
+		case rel_types:
+		case rel_msgs:
+			if (!(tdbb->getDatabase()->dbb_flags & DBB_creating))
+				protect_system_table(tdbb, relation, "INSERT", true);
+			break;
+
+		case rel_log:
+			protect_system_table(tdbb, relation, "INSERT", true);
+			break;
+
 		case rel_relations:
 			EVL_field(0, rpb->rpb_record, f_rel_name, &desc);
 			DFW_post_work(transaction, dfw_create_relation, &desc, 0);
@@ -3229,7 +3253,7 @@
  *
  **************************************/
 	SET_TDBB(tdbb);
-	Database* dbb = tdbb->getDatabase();
+	Database* const dbb = tdbb->getDatabase();
 	Jrd::Attachment* attachment = tdbb->getAttachment();
 
 #ifdef VIO_DEBUG
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <asf...@us...> - 2014-03-14 16:45:12
       
   | 
Revision: 59264
          http://sourceforge.net/p/firebird/code/59264
Author:   asfernandes
Date:     2014-03-14 16:45:09 +0000 (Fri, 14 Mar 2014)
Log Message:
-----------
Fixed restore of sh_test.gbk in TCS.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2014-03-14 15:41:15 UTC (rev 59263)
+++ firebird/trunk/src/jrd/vio.cpp	2014-03-14 16:45:09 UTC (rev 59264)
@@ -2943,11 +2943,11 @@
 		case rel_roles:
 		case rel_sec_users:
 		case rel_sec_user_attributes:
+		case rel_msgs:
 			protect_system_table(tdbb, relation, "INSERT");
 			break;
 
 		case rel_types:
-		case rel_msgs:
 			if (!(tdbb->getDatabase()->dbb_flags & DBB_creating))
 				protect_system_table(tdbb, relation, "INSERT", true);
 			break;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <ro...@us...> - 2014-03-22 20:56:17
       
   | 
Revision: 59304
          http://sourceforge.net/p/firebird/code/59304
Author:   robocop
Date:     2014-03-22 20:56:13 +0000 (Sat, 22 Mar 2014)
Log Message:
-----------
Misc.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2014-03-22 20:51:24 UTC (rev 59303)
+++ firebird/trunk/src/jrd/vio.cpp	2014-03-22 20:56:13 UTC (rev 59304)
@@ -755,15 +755,16 @@
 				"    record's transaction (%"ULONGFORMAT") is dead (my TID - %"ULONGFORMAT")\n",
 				rpb->rpb_transaction_nr, transaction->tra_number);
 #endif
-			if (gcPolicyBackground && !(rpb->rpb_flags & rpb_chained) && attachment->att_flags & ATT_notify_gc)
+			if (gcPolicyBackground && !(rpb->rpb_flags & rpb_chained) &&
+				(attachment->att_flags & ATT_notify_gc))
 			{
 				notify_garbage_collector(tdbb, rpb);
 			}
 
 		case tra_precommitted:
 
-			if (attachment->att_flags & ATT_NO_CLEANUP ||
-				rpb->rpb_flags & (rpb_chained | rpb_gc_active))
+			if ((attachment->att_flags & ATT_NO_CLEANUP) ||
+				(rpb->rpb_flags & (rpb_chained | rpb_gc_active)))
 			{
 				if (rpb->rpb_b_page == 0)
 				{
@@ -1019,13 +1020,13 @@
 
 			const bool cannotGC =
 				rpb->rpb_transaction_nr >= oldest_snapshot || rpb->rpb_b_page == 0 ||
-				rpb->rpb_flags & rpb_chained || attachment->att_flags & ATT_no_cleanup;
+				(rpb->rpb_flags & rpb_chained) || (attachment->att_flags & ATT_no_cleanup);
 
 			if (cannotGC)
 			{
 				if (gcPolicyBackground &&
-					attachment->att_flags & (ATT_notify_gc | ATT_garbage_collector) &&
-					(rpb->rpb_b_page != 0 && !(rpb->rpb_flags & rpb_chained)) )
+					(attachment->att_flags & (ATT_notify_gc | ATT_garbage_collector)) &&
+					rpb->rpb_b_page != 0 && !(rpb->rpb_flags & rpb_chained) )
 				{
 					// VIO_chase_record_version
 					notify_garbage_collector(tdbb, rpb);
@@ -1058,7 +1059,7 @@
 		// system crashed. Clear the flag and set the state to tra_dead to
 		// reattempt the backout.
 
-		if (!(rpb->rpb_flags & rpb_chained) && rpb->rpb_flags & rpb_gc_active)
+		if (!(rpb->rpb_flags & rpb_chained) && (rpb->rpb_flags & rpb_gc_active))
 		{
 			if (!rpb->rpb_transaction_nr) {
 				state = tra_active;
@@ -1301,10 +1302,8 @@
 		rpb->rpb_stream_flags &= ~(RPB_s_refetch | RPB_s_refetch_no_undo);
 	}
 
-	bool same_tx = false;
-	if (rpb->rpb_transaction_nr == transaction->tra_number) {
-		same_tx = true;			// deleting tx has updated/inserted this record before
-	}
+	// deleting tx has updated/inserted this record before
+	const bool same_tx = (rpb->rpb_transaction_nr == transaction->tra_number);
 
 	// Special case system transaction
 
@@ -2231,7 +2230,7 @@
 	// notify the garbage collector to garbage collect. Every other
 	// attachment notifies the garbage collector to do their dirty work.
 
-	if (dbb->dbb_flags & DBB_garbage_collector &&
+	if ((dbb->dbb_flags & DBB_garbage_collector) &&
 		!(attachment->att_flags & (ATT_no_cleanup | ATT_gbak_attachment)))
 	{
 		attachment->att_flags |= ATT_notify_gc;
@@ -3531,7 +3530,7 @@
 									it was modified and deleted under our savepoint
 									we need to back it out to the state as it were
 									before our transaction started */
-									if (record->rec_length == 0 && record->rec_flags & REC_new_version)
+									if (record->rec_length == 0 && (record->rec_flags & REC_new_version))
 									{
 										if (!DPM_get(tdbb, &rpb, LCK_write)) {
 											BUGCHECK(186);	// msg 186 record disappeared
@@ -5316,6 +5315,7 @@
  *	Disallow modifications on system tables for everyone except
  *	the GBAK restore process and internal (system) requests used
  *	by the engine itself.
+ *	Here we can test a Database flag to bypass the exception for special purposes.
  *
  **************************************/
 	const Attachment* const attachment = tdbb->getAttachment();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <ro...@us...> - 2014-04-10 01:39:35
       
   | 
Revision: 59415
          http://sourceforge.net/p/firebird/code/59415
Author:   robocop
Date:     2014-04-10 01:39:32 +0000 (Thu, 10 Apr 2014)
Log Message:
-----------
Experimental way of stopping gbak impersonation in sys tables. Gbak only needs to write to sys tables when it's restoring and only in the first attachment. Second and third attachment are for bringing the DB online and setting the R/O flag. Please test.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2014-04-10 01:36:15 UTC (rev 59414)
+++ firebird/trunk/src/jrd/vio.cpp	2014-04-10 01:39:32 UTC (rev 59415)
@@ -171,6 +171,16 @@
 static void update_in_place(thread_db*, jrd_tra*, record_param*, record_param*);
 static void verb_post(thread_db*, jrd_tra*, record_param*, Record*, const bool, const bool);
 
+
+inline void check_gbak_cheating(thread_db* tdbb, const jrd_rel* relation, const char* op)
+{
+	const ULONG uflags = tdbb->getAttachment()->att_flags;
+	if ((uflags & ATT_gbak_attachment) && !(uflags & ATT_creator))
+		protect_system_table(tdbb, relation, op, true);
+}
+
+
+
 // Pick up relation ids
 #include "../jrd/ini.h"
 
@@ -1316,6 +1326,8 @@
 	transaction->tra_flags |= TRA_write;
 	jrd_rel* relation = rpb->rpb_relation;
 
+	check_gbak_cheating(tdbb, relation, "DELETE");
+
 	// If we're about to erase a system relation, check to make sure
 	// everything is completely kosher.
 
@@ -2355,6 +2367,8 @@
 		return;
 	}
 
+	check_gbak_cheating(tdbb, relation, "UPDATE");
+
 	// If we're about to modify a system relation, check to make sure
 	// everything is completely kosher.
 
@@ -2928,6 +2942,8 @@
 	jrd_rel* relation = rpb->rpb_relation;
 	DSC desc, desc2;
 
+	check_gbak_cheating(tdbb, relation, "INSERT");
+
 	if (needDfw(tdbb, transaction))
 	{
 		switch ((RIDS) relation->rel_id)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <ro...@us...> - 2014-05-01 05:55:19
       
   | 
Revision: 59515
          http://sourceforge.net/p/firebird/code/59515
Author:   robocop
Date:     2014-05-01 05:55:15 +0000 (Thu, 01 May 2014)
Log Message:
-----------
More sys tables protected.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2014-05-01 05:51:23 UTC (rev 59514)
+++ firebird/trunk/src/jrd/vio.cpp	2014-05-01 05:55:15 UTC (rev 59515)
@@ -1343,6 +1343,10 @@
 		switch ((RIDS) relation->rel_id)
 		{
 		case rel_database:
+		case rel_types:
+		case rel_log:
+		case rel_backup_history:
+		case rel_sec_global_map:
 			protect_system_table(tdbb, relation, "DELETE", true);
 			break;
 
@@ -2378,6 +2382,16 @@
 	{
 		switch ((RIDS) relation->rel_id)
 		{
+		case rel_pages:
+		case rel_formats:
+		case rel_types:
+		case rel_msgs:
+		case rel_log:
+		case rel_backup_history:
+		case rel_sec_global_map:
+			protect_system_table(tdbb, relation, "UPDATE", true);
+			break;
+
 		case rel_database:
 			check_class(tdbb, transaction, org_rpb, new_rpb, f_dat_class);
 			EVL_field(0, org_rpb->rpb_record, f_dat_linger, &desc1);
@@ -2968,6 +2982,7 @@
 			break;
 
 		case rel_log:
+		case rel_sec_global_map:
 			protect_system_table(tdbb, relation, "INSERT", true);
 			break;
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <ro...@us...> - 2014-05-02 03:01:41
       
   | 
Revision: 59524
          http://sourceforge.net/p/firebird/code/59524
Author:   robocop
Date:     2014-05-02 03:01:38 +0000 (Fri, 02 May 2014)
Log Message:
-----------
1.- Don't let gbak delete more than the only table it might clean. 2.- Special case for rdb$types: user can insert records, provided that's locksmith and the records contain non-system types.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2014-05-02 00:54:31 UTC (rev 59523)
+++ firebird/trunk/src/jrd/vio.cpp	2014-05-02 03:01:38 UTC (rev 59524)
@@ -172,6 +172,11 @@
 static void verb_post(thread_db*, jrd_tra*, record_param*, Record*, const bool, const bool);
 
 
+// Pick up relation ids
+#include "../jrd/ini.h"
+
+
+// General protection against gbak impersonators, to be used for VIO_modify and VIO_store.
 inline void check_gbak_cheating(thread_db* tdbb, const jrd_rel* relation, const char* op)
 {
 	const ULONG uflags = tdbb->getAttachment()->att_flags;
@@ -179,11 +184,16 @@
 		protect_system_table(tdbb, relation, op, true);
 }
 
+// The only table whose contents gbak might delete is RDB$INDEX_SEGMENTS if it detects
+// inconsistencies while restoring. Used in VIO_erase.
+inline void check_gbak_cheating_delete(thread_db* tdbb, const jrd_rel* relation)
+{
+	const ULONG uflags = tdbb->getAttachment()->att_flags;
+	if ((uflags & ATT_gbak_attachment) && relation->rel_id != rel_segments)
+		protect_system_table(tdbb, relation, "DELETE", true);
+}
 
 
-// Pick up relation ids
-#include "../jrd/ini.h"
-
 static const UCHAR gc_tpb[] =
 {
 	isc_tpb_version1, isc_tpb_read,
@@ -1326,7 +1336,7 @@
 	transaction->tra_flags |= TRA_write;
 	jrd_rel* relation = rpb->rpb_relation;
 
-	check_gbak_cheating(tdbb, relation, "DELETE");
+	check_gbak_cheating_delete(tdbb, relation);
 
 	// If we're about to erase a system relation, check to make sure
 	// everything is completely kosher.
@@ -1343,14 +1353,34 @@
 		switch ((RIDS) relation->rel_id)
 		{
 		case rel_database:
-		case rel_types:
 		case rel_log:
 		case rel_backup_history:
 		case rel_sec_global_map:
 			protect_system_table(tdbb, relation, "DELETE", true);
 			break;
 
+		case rel_types:
+		 	if (!tdbb->getAttachment()->locksmith())
+		 		protect_system_table(tdbb, relation, "DELETE", true);
+		 	if (EVL_field(0, rpb->rpb_record, f_typ_sys_flag, &desc) && MOV_get_long(&desc, 0))
+		 		protect_system_table(tdbb, relation, "DELETE", true);
+			break;
+
+		case rel_pages:
+		case rel_formats:
+		case rel_trans:
+		case rel_rcon:
+		case rel_refc:
+		case rel_ccon:
+		case rel_msgs:
+		case rel_roles:
+		case rel_sec_users:
+		case rel_sec_user_attributes:
+			protect_system_table(tdbb, relation, "DELETE");
+			break;
+
 		case rel_relations:
+			protect_system_table(tdbb, relation, "DELETE");
 			if (EVL_field(0, rpb->rpb_record, f_rel_name, &desc))
 			{
 				SCL_check_relation(tdbb, &desc, SCL_drop);
@@ -1370,11 +1400,13 @@
 			break;
 
 		case rel_packages:
+			protect_system_table(tdbb, relation, "DELETE");
 			if (EVL_field(0, rpb->rpb_record, f_pkg_name, &desc))
 				SCL_check_package(tdbb, &desc, SCL_drop);
 			break;
 
 		case rel_procedures:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_prc_id, &desc2);
 			id = MOV_get_long(&desc2, 0);
 
@@ -1392,12 +1424,14 @@
 			break;
 
 		case rel_charsets:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_cs_cs_name, &desc);
 			MOV_get_metaname(&desc, object_name);
 			SCL_check_charset(tdbb, object_name, SCL_drop);
 			break;
 
 		case rel_collations:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_coll_cs_id, &desc2);
 			id = MOV_get_long(&desc2, 0);
 
@@ -1411,6 +1445,7 @@
 			break;
 
 		case rel_exceptions:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_xcp_name, &desc);
 			MOV_get_metaname(&desc, object_name);
 			SCL_check_exception(tdbb, object_name, SCL_drop);
@@ -1418,6 +1453,7 @@
 			break;
 
 		case rel_gens:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_gen_name, &desc);
 			MOV_get_metaname(&desc, object_name);
 			SCL_check_generator(tdbb, object_name, SCL_drop);
@@ -1425,6 +1461,7 @@
 			break;
 
 		case rel_funs:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_fun_name, &desc);
 
 			if (EVL_field(0, rpb->rpb_record, f_fun_pkg_name, &desc2))
@@ -1445,6 +1482,7 @@
 			break;
 
 		case rel_indices:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_idx_relation, &desc);
 			SCL_check_relation(tdbb, &desc, SCL_control);
 			EVL_field(0, rpb->rpb_record, f_idx_id, &desc2);
@@ -1502,6 +1540,7 @@
 			break;
 
 		case rel_rfr:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_rfr_rname, &desc);
 			SCL_check_relation(tdbb, &desc, SCL_control);
 			DFW_post_work(transaction, dfw_update_format, &desc, 0);
@@ -1516,6 +1555,7 @@
 			break;
 
 		case rel_args:
+			protect_system_table(tdbb, relation, "DELETE");
 			if (EVL_field(0, rpb->rpb_record, f_arg_pkg_name, &desc2))
 			{
 				MOV_get_metaname(&desc2, package_name);
@@ -1529,6 +1569,7 @@
 			break;
 
 		case rel_prc_prms:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_prm_procedure, &desc);
 
 			if (EVL_field(0, rpb->rpb_record, f_prm_pkg_name, &desc2))
@@ -1558,6 +1599,7 @@
 			break;
 
 		case rel_fields:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_fld_name, &desc);
 			MOV_get_metaname(&desc, object_name);
 			SCL_check_domain(tdbb, object_name, SCL_drop);
@@ -1566,6 +1608,7 @@
 			break;
 
 		case rel_files:
+			protect_system_table(tdbb, relation, "DELETE");
 			{
 				const bool name_defined = EVL_field(0, rpb->rpb_record, f_file_name, &desc);
 				const USHORT file_flags = EVL_field(0, rpb->rpb_record, f_file_flags, &desc2) ?
@@ -1588,11 +1631,13 @@
 			break;
 
 		case rel_classes:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_cls_class, &desc);
 			DFW_post_work(transaction, dfw_compute_security, &desc, 0);
 			break;
 
 		case rel_triggers:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_trg_rname, &desc);
 
 			// check if this  request go through without checking permissions
@@ -1617,6 +1662,7 @@
 			break;
 
 		case rel_priv:
+			protect_system_table(tdbb, relation, "DELETE");
 			EVL_field(0, rpb->rpb_record, f_file_name, &desc);
 			if (!(tdbb->getRequest()->getStatement()->flags & JrdStatement::FLAG_INTERNAL))
 			{
@@ -2382,11 +2428,31 @@
 	{
 		switch ((RIDS) relation->rel_id)
 		{
+		case rel_segments:
+		case rel_vrel:
+		case rel_args:
+		case rel_filters:
+		case rel_trans:
+		case rel_dims:
+		case rel_prc_prms:
+			protect_system_table(tdbb, relation, "UPDATE");
+			break;
+
+		case rel_types:
+		 	if (!tdbb->getAttachment()->locksmith())
+		 		protect_system_table(tdbb, relation, "UPDATE", true);
+			if (EVL_field(0, org_rpb->rpb_record, f_typ_sys_flag, &desc1) && MOV_get_long(&desc1, 0))
+		 		protect_system_table(tdbb, relation, "UPDATE", true);
+			break;
+
 		case rel_pages:
 		case rel_formats:
-		case rel_types:
 		case rel_msgs:
 		case rel_log:
+		case rel_dpds:
+		case rel_rcon:
+		case rel_refc:
+		case rel_ccon:
 		case rel_backup_history:
 		case rel_sec_global_map:
 			protect_system_table(tdbb, relation, "UPDATE", true);
@@ -2403,6 +2469,7 @@
 			break;
 
 		case rel_relations:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, org_rpb->rpb_record, f_rel_name, &desc1);
 			SCL_check_relation(tdbb, &desc1, SCL_alter);
 			check_class(tdbb, transaction, org_rpb, new_rpb, f_rel_class);
@@ -2411,6 +2478,7 @@
 			break;
 
 		case rel_packages:
+			protect_system_table(tdbb, relation, "UPDATE");
 			if (EVL_field(0, org_rpb->rpb_record, f_pkg_name, &desc1))
 				SCL_check_package(tdbb, &desc1, SCL_alter);
 			check_class(tdbb, transaction, org_rpb, new_rpb, f_pkg_class);
@@ -2418,6 +2486,7 @@
 			break;
 
 		case rel_procedures:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, org_rpb->rpb_record, f_prc_name, &desc1);
 
 			if (EVL_field(0, org_rpb->rpb_record, f_prc_pkg_name, &desc2))
@@ -2442,6 +2511,7 @@
 			break;
 
 		case rel_funs:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, org_rpb->rpb_record, f_fun_name, &desc1);
 
 			if (EVL_field(0, org_rpb->rpb_record, f_fun_pkg_name, &desc2))
@@ -2466,6 +2536,7 @@
 			break;
 
 		case rel_gens:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, org_rpb->rpb_record, f_gen_name, &desc1);
 			MOV_get_metaname(&desc1, object_name);
 			SCL_check_generator(tdbb, object_name, SCL_alter);
@@ -2474,6 +2545,7 @@
 			break;
 
 		case rel_rfr:
+			protect_system_table(tdbb, relation, "UPDATE");
 			{
 				check_rel_field_class(tdbb, org_rpb, SCL_control, transaction);
 				check_rel_field_class(tdbb, new_rpb, SCL_control, transaction);
@@ -2495,6 +2567,7 @@
 			break;
 
 		case rel_fields:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, org_rpb->rpb_record, f_fld_name, &desc1);
 			MOV_get_metaname(&desc1, object_name);
 			SCL_check_domain(tdbb, object_name, SCL_alter);
@@ -2535,6 +2608,7 @@
 			break;
 
 		case rel_classes:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, org_rpb->rpb_record, f_cls_class, &desc1);
 			DFW_post_work(transaction, dfw_compute_security, &desc1, 0);
 			EVL_field(0, new_rpb->rpb_record, f_cls_class, &desc1);
@@ -2542,6 +2616,7 @@
 			break;
 
 		case rel_indices:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, new_rpb->rpb_record, f_idx_relation, &desc1);
 			SCL_check_relation(tdbb, &desc1, SCL_control);
 
@@ -2563,6 +2638,7 @@
 			break;
 
 		case rel_triggers:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, new_rpb->rpb_record, f_trg_rname, &desc1);
 			SCL_check_relation(tdbb, &desc1, SCL_control);
 
@@ -2587,6 +2663,7 @@
 			break;
 
 		case rel_files:
+			protect_system_table(tdbb, relation, "UPDATE");
 			{
 				SSHORT new_rel_flags, old_rel_flags;
 				EVL_field(0, new_rpb->rpb_record, f_file_name, &desc1);
@@ -2603,6 +2680,7 @@
 			break;
 
 		case rel_charsets:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, new_rpb->rpb_record, f_cs_cs_name, &desc1);
 			MOV_get_metaname(&desc1, object_name);
 			SCL_check_charset(tdbb, object_name, SCL_alter);
@@ -2611,6 +2689,7 @@
 			break;
 
 		case rel_collations:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, new_rpb->rpb_record, f_coll_name, &desc1);
 			MOV_get_metaname(&desc1, object_name);
 			SCL_check_collation(tdbb, object_name, SCL_alter);
@@ -2619,6 +2698,7 @@
 			break;
 
 		case rel_exceptions:
+			protect_system_table(tdbb, relation, "UPDATE");
 			EVL_field(0, new_rpb->rpb_record, f_xcp_name, &desc1);
 			MOV_get_metaname(&desc1, object_name);
 			SCL_check_exception(tdbb, object_name, SCL_alter);
@@ -2973,12 +3053,19 @@
 		case rel_sec_users:
 		case rel_sec_user_attributes:
 		case rel_msgs:
+		case rel_prc_prms:
+		case rel_args:
 			protect_system_table(tdbb, relation, "INSERT");
 			break;
 
 		case rel_types:
 			if (!(tdbb->getDatabase()->dbb_flags & DBB_creating))
-				protect_system_table(tdbb, relation, "INSERT", true);
+			{
+				if (!tdbb->getAttachment()->locksmith())
+					protect_system_table(tdbb, relation, "INSERT", true);
+				else if (EVL_field(0, rpb->rpb_record, f_typ_sys_flag, &desc) && MOV_get_long(&desc, 0))
+		 			protect_system_table(tdbb, relation, "INSERT", true);
+			}
 			break;
 
 		case rel_log:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <ro...@us...> - 2014-05-07 08:58:38
       
   | 
Revision: 59552
          http://sourceforge.net/p/firebird/code/59552
Author:   robocop
Date:     2014-05-07 08:58:36 +0000 (Wed, 07 May 2014)
Log Message:
-----------
Fix the problem with gbak restoring a db and lack of rights on sys tables that Philippe detected.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2014-05-07 03:42:55 UTC (rev 59551)
+++ firebird/trunk/src/jrd/vio.cpp	2014-05-07 08:58:36 UTC (rev 59552)
@@ -192,8 +192,10 @@
 // inconsistencies while restoring. Used in VIO_erase.
 inline void check_gbak_cheating_delete(thread_db* tdbb, const jrd_rel* relation)
 {
+	// For now, it will be left the same as the above, because I'm don't know
+	// how to check I'm inside DFW and DFW does deletions.
 	const ULONG uflags = tdbb->getAttachment()->att_flags;
-	if ((uflags & ATT_gbak_attachment) && relation->rel_id != rel_segments)
+	if ((uflags & ATT_gbak_attachment) && !(uflags & ATT_creator)) //relation->rel_id != rel_segments)
 		protect_system_table_delupd(tdbb, relation, "DELETE", true);
 }
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <ro...@us...> - 2014-05-09 20:26:03
       
   | 
Revision: 59568
          http://sourceforge.net/p/firebird/code/59568
Author:   robocop
Date:     2014-05-09 20:26:01 +0000 (Fri, 09 May 2014)
Log Message:
-----------
It seems it's possible to restrict gbak more on deletions. Thanks Vlad for hint on TDBB_dont_post_dfw.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2014-05-09 11:38:23 UTC (rev 59567)
+++ firebird/trunk/src/jrd/vio.cpp	2014-05-09 20:26:01 UTC (rev 59568)
@@ -192,11 +192,13 @@
 // inconsistencies while restoring. Used in VIO_erase.
 inline void check_gbak_cheating_delete(thread_db* tdbb, const jrd_rel* relation)
 {
-	// For now, it will be left the same as the above, because I don't know
-	// how to check I'm inside DFW and DFW does deletions.
+	// TDBB_dont_post_dfw signals that we are in DFW.
 	const ULONG uflags = tdbb->getAttachment()->att_flags;
-	if ((uflags & ATT_gbak_attachment) && !(uflags & ATT_creator)) //relation->rel_id != rel_segments)
+	if ((uflags & ATT_gbak_attachment) &&
+		(!(uflags & ATT_creator)) || relation->rel_id != rel_segments && !(tdbb->tdbb_flags & TDBB_dont_post_dfw))
+	{
 		protect_system_table_delupd(tdbb, relation, "DELETE", true);
+	}
 }
 
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
     
      
      
      From: <ro...@us...> - 2014-05-10 14:17:56
       
   | 
Revision: 59572
          http://sourceforge.net/p/firebird/code/59572
Author:   robocop
Date:     2014-05-10 14:17:53 +0000 (Sat, 10 May 2014)
Log Message:
-----------
Misplaced parentheses are unexpected invitees.
Modified Paths:
--------------
    firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp	2014-05-10 11:03:02 UTC (rev 59571)
+++ firebird/trunk/src/jrd/vio.cpp	2014-05-10 14:17:53 UTC (rev 59572)
@@ -195,7 +195,7 @@
 	// TDBB_dont_post_dfw signals that we are in DFW.
 	const ULONG uflags = tdbb->getAttachment()->att_flags;
 	if ((uflags & ATT_gbak_attachment) &&
-		(!(uflags & ATT_creator)) || relation->rel_id != rel_segments && !(tdbb->tdbb_flags & TDBB_dont_post_dfw))
+		(!(uflags & ATT_creator) || relation->rel_id != rel_segments && !(tdbb->tdbb_flags & TDBB_dont_post_dfw)))
 	{
 		protect_system_table_delupd(tdbb, relation, "DELETE", true);
 	}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |