From: Dmitry Y. <di...@us...> - 2008-03-03 06:31:03
|
Build Version : T2.5.0.18643 Firebird 2.5 Unstable (writeBuildNum.sh,v 1.18803 2008/03/03 06:31:04 dimitr Exp ) Update of /cvsroot/firebird/firebird2/src/dsql In directory sc8-pr-cvs17.sourceforge.net:/tmp/cvs-serv23098 Modified Files: metd.epp Log Message: Fixed the NULL transaction handle crash reported by Dmitry Kovalenko in fb-devel. Index: metd.epp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/dsql/metd.epp,v retrieving revision 1.117 retrieving revision 1.118 diff -b -U3 -r1.117 -r1.118 --- metd.epp 3 Mar 2008 00:46:59 -0000 1.117 +++ metd.epp 3 Mar 2008 06:31:00 -0000 1.118 @@ -39,6 +39,7 @@ #include "../jrd/align.h" #include "../jrd/intl.h" #include "../jrd/irq.h" +#include "../jrd/tra.h" #include "../dsql/ddl_proto.h" #include "../dsql/metd_proto.h" #include "../dsql/hsh_proto.h" @@ -92,6 +93,14 @@ MutexHolder(const MutexHolder&); MutexHolder& operator=(const MutexHolder&); }; + + inline void validateTransaction(const dsql_req* request) + { + if (!request->req_transaction->checkHandle()) + { + ERRD_post(isc_bad_trans_handle, 0); + } + } } @@ -270,6 +279,8 @@ // Now see if it is in the database + validateTransaction(request); + dsql_dbb* dbb = request->req_dbb; dsql_intlsym* iname = NULL; @@ -343,11 +354,12 @@ **************************************************************/ thread_db* tdbb = JRD_get_thread_data(); + validateTransaction(request); + dsql_dbb* dbb = request->req_dbb; bid* blob_id; - ISC_STATUS stat; USHORT length, result = 0; blb* blob_handle = 0; @@ -466,6 +478,8 @@ // Now see if it is in the database + validateTransaction(request); + dsql_dbb* dbb = request->req_dbb; dsql_intlsym* iname = NULL; @@ -588,6 +602,8 @@ return dbb->dbb_charsets_by_id[pos]->intlsym_name; } + validateTransaction(request); + jrd_req* handle = CMP_find_request(tdbb, irq_cs_name, IRQ_REQUESTS); FOR (REQUEST_HANDLE handle TRANSACTION_HANDLE request->req_transaction) @@ -634,6 +650,8 @@ // Now see if it is in the database + validateTransaction(request); + jrd_req* handle = CMP_find_request(tdbb, irq_default_cs, IRQ_REQUESTS); FOR(REQUEST_HANDLE handle TRANSACTION_HANDLE request->req_transaction) @@ -680,6 +698,8 @@ **************************************/ thread_db* tdbb = JRD_get_thread_data(); + validateTransaction(request); + bool found = false; dsql_dbb* dbb = request->req_dbb; @@ -746,6 +766,8 @@ **************************************************************/ thread_db* tdbb = JRD_get_thread_data(); + validateTransaction(request); + *has_default = false; dsql_dbb* dbb = request->req_dbb; @@ -844,6 +866,8 @@ **************************************/ thread_db* tdbb = JRD_get_thread_data(); + validateTransaction(request); + dsql_dbb* dbb = request->req_dbb; bool found = false; @@ -892,6 +916,8 @@ // Now see if it is in the database + validateTransaction(request); + dsql_dbb* dbb = request->req_dbb; dsql_udf* userFunc = NULL; USHORT return_arg; @@ -1064,6 +1090,8 @@ **************************************/ thread_db* tdbb = JRD_get_thread_data(); + validateTransaction(request); + dsql_dbb* dbb = request->req_dbb; DsqlNodStack stack; @@ -1134,6 +1162,8 @@ // now see if it is in the database + validateTransaction(request); + dsql_prc* procedure = NULL; jrd_req* handle1 = CMP_find_request(tdbb, irq_procedure, IRQ_REQUESTS); @@ -1357,6 +1387,8 @@ // and this is a type of request which does not use ids, prepare a // temporary relation block to provide information without caching it + validateTransaction(request); + bool permanent = true; jrd_req* handle1 = CMP_find_request(tdbb, irq_rel_ids, IRQ_REQUESTS); @@ -1562,6 +1594,8 @@ **************************************/ thread_db* tdbb = JRD_get_thread_data(); + validateTransaction(request); + dsql_dbb* dbb = request->req_dbb; bool found = false; @@ -1612,6 +1646,8 @@ **************************************/ thread_db* tdbb = JRD_get_thread_data(); + validateTransaction(request); + dsql_dbb* dbb = request->req_dbb; bool found = false; @@ -1657,6 +1693,8 @@ **************************************/ thread_db* tdbb = JRD_get_thread_data(); + validateTransaction(request); + dsql_rel* relation = NULL; dsql_dbb* dbb = request->req_dbb; @@ -1796,6 +1834,8 @@ **************************************/ thread_db* tdbb = JRD_get_thread_data(); + validateTransaction(request); + dsql_rel* relation = NULL; dsql_dbb* dbb = request->req_dbb; |