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. |