从DELPHI7至XE一直都有的BUG,关于DBX中使用的IsMultiTableQuery函数
2012-03-22 23:14
525 查看
函数中的
存在着读越界的可能,当读到一个非法内存就会报指针错。
BUG修复:
重写该函数:
程序加载时修改函数头为长跳转
if (Start[0] = ',') or (Start[1] = ',') then exit;
存在着读越界的可能,当读到一个非法内存就会报指针错。
BUG修复:
重写该函数:
function IsMultiTableQueryFix(const SQL: WideString): Boolean; const SInnerJoin = 'inner join '; { do not localize } SOuterJoin = 'outer join '; { do not localize } var Start: PWideChar; SResult, Token: WideString; SQLToken, CurSection: TSQLToken; begin SResult := ''; Start := PWideChar(SQL); CurSection := stUnknown; Result := True; repeat SQLToken := NextSQLToken(Start, Token, CurSection); if SQLToken in SQLSections then CurSection := SQLToken; until SQLToken in [stEnd, stFrom]; if SQLToken = stFrom then begin repeat SQLToken := NextSQLToken(Start, Token, CurSection); if SQLToken in SQLSections then CurSection := SQLToken else // stValue is returned if TableNames contain quote chars. if (SQLToken = stTableName) or (SQLToken = stValue) then begin SResult := Token; while (Start[0] = '.') and not (SQLToken in [stEnd]) do begin SQLToken := NextSqlToken(Start, Token, CurSection); SResult := SResult + '.' + Token; end; if(SQLToken = stTableName) then begin while(Start[0] = ' ') do begin Inc(Start); end; end; if(Start[0] = #0) then begin Result := False; exit; end; if (Start[0] = ',') then exit; SQLToken := NextSqlToken(Start, Token, CurSection); if SQLToken in SQLSections then CurSection := SQLToken; if Assigned(WStrPos(Start, SInnerJoin)) or Assigned(WStrPos(Start, SOuterJoin)) then Exit; SQLToken := NextSqlToken(Start, Token, CurSection); if (SQLToken = stTableName) then Exit; Result := False; Exit; end; until (CurSection <> stFrom) or (SQLToken in [stEnd, stTableName]); end; end;
程序加载时修改函数头为长跳转
507272A0 >- E9 CBA0E8AF jmp xxx.xxxxx::IsMultiTableQueryFix>
相关文章推荐
- Delphi XE DBX 序列化Json的bug
- 通达OA--关于工作流强制使用电子签章中的一个BUG
- Delphi中使用汇编(关于POS函数的问题)
- 关于 arm-linux-gcc 使用 static关键字的一个 bug
- 关于在DELPHI中FOR循环语句的使用问题
- 关于Delphi中预编译指令的使用方法
- Delphi 完整的Bug决议工具EurekaLog的使用
- 通达OA--关于工作流强制使用电子签章中的一个BUG
- 关于Delphi内存表的使用说明
- 关于Mono使用linq查询的几个BUG
- 记一个使用中常见的关于ListView和Adapter的BUG
- 关于 IOS5 使用 position:fixed 与 scrollTo 共存的 bug
- 关于 Delphi 中流的使用(7) 压缩与解压缩(TCompressionStream、TDecompressionStream)
- 关于Opencv3在使用霍夫变换(houghlines)时一直出问题的解决
- 关于Delphi中预编译指令的使用方法
- Delphi 完整的Bug决议工具EurekaLog的使用
- 关于Delphi第三方面控DbGridEh的一些使用
- 关于delphi在DLL中使用TStyleManager加载皮肤ListView的问题
- 关于jquery.placeholder使用的一些小BUG
- 关于Delphi2010使用Indy发送邮件乱码问题的解决