|
From: Claudio V. C. <ro...@us...> - 2009-06-09 13:02:46
|
Build Version : T2.5.0.24197 Firebird 2.5 Beta 1 (writeBuildNum.sh,v 1.24361 2009/06/09 13:02:41 robocop Exp ) Update of /cvsroot/firebird/firebird2/src/jrd In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv17040/src/jrd Modified Files: SysFunction.cpp Log Message: Fix CORE-2501: bin_shl and bin_shr shouldn't accept negative shifts. Index: SysFunction.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/jrd/SysFunction.cpp,v retrieving revision 1.75 retrieving revision 1.76 diff -b -U3 -r1.75 -r1.76 --- SysFunction.cpp 27 May 2009 01:35:54 -0000 1.75 +++ SysFunction.cpp 9 Jun 2009 13:02:40 -0000 1.76 @@ -1145,14 +1145,21 @@ if (request->req_flags & req_null) // return NULL if value2 is NULL return NULL; + const SINT64 shift = MOV_get_int64(value2, 0); + if (shift < 0) + { + status_exception::raise(Arg::Gds(isc_expression_eval_err) << + Arg::Gds(isc_sysf_argmustbe_nonneg) << Arg::Str(function->name)); + } + switch ((Function)(IPTR) function->misc) { case funBinShl: - impure->vlu_misc.vlu_int64 = MOV_get_int64(value1, 0) << MOV_get_int64(value2, 0); + impure->vlu_misc.vlu_int64 = MOV_get_int64(value1, 0) << shift; break; case funBinShr: - impure->vlu_misc.vlu_int64 = MOV_get_int64(value1, 0) >> MOV_get_int64(value2, 0); + impure->vlu_misc.vlu_int64 = MOV_get_int64(value1, 0) >> shift; break; default: @@ -2638,7 +2645,6 @@ MoveBuffer buffers[3]; UCHAR* addresses[3]; ULONG lengths[3]; - Firebird::HalfStaticArray<UCHAR, BUFFER_SMALL> canonicals[2]; // searched, find for (i = 0; i < 3; ++i) { @@ -2658,6 +2664,7 @@ if (lengths[1] == 0) return values[0]; + Firebird::HalfStaticArray<UCHAR, BUFFER_SMALL> canonicals[2]; // searched, find for (i = 0; i < 2; ++i) { canonicals[i].getBuffer(lengths[i] / cs->minBytesPerChar() * canonicalWidth); @@ -2991,8 +2998,7 @@ if (impure->vlu_misc.vlu_double < 0) { status_exception::raise(Arg::Gds(isc_expression_eval_err) << - Arg::Gds(isc_sysf_argmustbe_nonneg) << - Arg::Str(function->name)); + Arg::Gds(isc_sysf_argmustbe_nonneg) << Arg::Str(function->name)); } impure->vlu_misc.vlu_double = sqrt(impure->vlu_misc.vlu_double); |