Issue Details (XML | Word | Printable)

Key: CORE-2219
Type: Bug Bug
Status: Closed Closed
Resolution: Won't Fix
Priority: Critical Critical
Assignee: Alexander Peshkov
Reporter: b0bik
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
Firebird Core

Server crash when libfbclient used in UDF

Created: 30/Nov/08 08:07 PM   Updated: 11/Dec/08 05:00 AM
Component/s: API / Client Library
Affects Version/s: 2.1.1
Fix Version/s: None

Time Tracking:
Not Specified

File Attachments: 1. File libtest.so (316 kB)

Environment: Linux Ubuntu 7.10

Planning Status: Unspecified


 Description  « Hide
Call to isc_decode_timestamp in UDF declared as:

procedure isc_decode_timestamp(ib_date : PISC_TIMESTAMP; tm_date : PTM); cdecl; external 'fbclient';

causes fbserver to terminate.

Firebrid.log:

/opt/fb21ss/bin/fbguard: /opt/fb21ss/bin/fbserver terminated abnormally (-1)

The same happens on 2.1.1, 2.1.2, 2.1.2-debug
(I have a 2.1.2 version from http://www.dqteam.com/fb2/)

 All   Comments   Work Log   Change History   Version Control   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Dmitry Yemanov added a comment - 05/Dec/08 04:20 AM
As you have a debug version, it's worth setting up your system to generate the core dumps and posting here the stack trace.

b0bik added a comment - 05/Dec/08 04:26 PM
Hello

Once again. After removing all fb* stuff from both machines (Windows and Linux) I downloaded two archives:

Firebird-2.1.1.17910-0_Win32.zip - for Windows and
FirebirdSS-2.1.1.17910-0.ntpl.i686.tar.gz.tar for Linux

After "instalation" I did following things:

1. aliases.conf - new line pointing to my fdb file
2. firebird.conf:
RemoteServicePort = 5005
UdfAccess = Restrict UDF
BugcheckAbort = 1
3. Restart firebird server

I created two version of library test. For Windows - Turbo Delphi, for Linux - Free Pascal Compiler:

test.dpr:

library test;

uses funcs in 'funcs.pas';

exports ftest;

begin
end.

funcs.pas:

unit funcs;

interface

uses Types;

type

  TM = record
    tm_sec: integer;
    tm_min: integer;
    tm_hour: integer;
    tm_mday: integer;
    tm_mon: integer;
    tm_year: integer;
    tm_wday: integer;
    tm_yday: integer;
    tm_isdst: integer;
  end;

  ISC_TIMESTAMP = record
    timestamp_data: LongInt;
    timestamp_time: DWord;
  end;

  PTM = ^TM;
  PISC_TIMESTAMP = ^ISC_TIMESTAMP;

procedure isc_decode_timestamp(ib_date: PISC_TIMESTAMP; tm_date: PTM); cdecl; external 'fbclient';
function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util';

function ftest(aDateTime : PISC_TIMESTAMP): Integer; cdecl;

implementation

function ftest(aDateTime: PISC_TIMESTAMP): Integer; cdecl;
var theTM: TM;
begin
  Result := 0;
  isc_decode_timestamp(aDateTime, @theTM); {*}
  Result := 1;
end;

end.

The only one difference between Windows and Linux is calling convention to fbclient (Windows stdcall, Linux cdecl). After building library I copied it into UDF directory (/opt/firebird/UDF/, c:\program files\firebird_211\UDF)

I declared external function using:

DECLARE EXTERNAL FUNCTION FTEST
TIMESTAMP NULL
RETURNS INTEGER BY VALUE
ENTRY_POINT 'ftest'
MODULE_NAME 'test'

After committing, I connected to my database using isql utility and run a query:

select ftest(current_timestamp) from rdb$database

Windows:

FTEST
=====
      1

Linux - nothing, query execution never ends. But neither fbserver nor fbguard process takes lot of CPU time. When I connect to Linux machine from Windows (using flamerobin) and execute the same query, flame writes:

"Starting transaction ..."

and nothing happens too.


When I comment line marked with {*} in my udf everything works OK.

Attached files:

libtest.so - compiled version of my simple udf.

b0bik added a comment - 05/Dec/08 04:28 PM
udf

Alexander Peshkov added a comment - 10/Dec/08 01:39 PM
Your pascal declaration of struct tm does not match one used in C++ in linux:
struct tm
{
  int tm_sec; /* Seconds. [0-60] (1 leap second) */
  int tm_min; /* Minutes. [0-59] */
  int tm_hour; /* Hours. [0-23] */
  int tm_mday; /* Day. [1-31] */
  int tm_mon; /* Month. [0-11] */
  int tm_year; /* Year - 1900. */
  int tm_wday; /* Day of week. [0-6] */
  int tm_yday; /* Days in year.[0-365] */
  int tm_isdst; /* DST. [-1/0/1]*/

#ifdef __USE_BSD
  long int tm_gmtoff; /* Seconds east of UTC. */
  __const char *tm_zone; /* Timezone abbreviation. */
#else
  long int __tm_gmtoff; /* Seconds east of UTC. */
  __const char *__tm_zone; /* Timezone abbreviation. */
#endif
};

Therefore return address on the stack is overwritten.