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