[fpc-devel] fpc 2.0.4 rc2 and mse
Martin Schreiber
fpmse at bluewin.ch
Wed Aug 2 21:58:33 CEST 2006
On Wednesday 02 August 2006 16.51, Joost van der Sluis wrote:
> On Wed, 2006-08-02 at 06:57 +0200, Martin Schreiber wrote:
> > > > Did you fix Mantis 6898 in the meantime?
> > >
> > > You said that TBufDataset can use invalid pointers, even if there
> > > wasn't any exception, if a dataset is opened and closed more then once.
> >
> > No, the problem is if here was a db exception on open. Without any
> > exception it is OK.
>
> Well, then that exception should be handled correctly. If you don't call
> InternalClose, you'll have a mem-leak.
>
> I don't think that any exception (except out-of-memory) can occur in
> InternalConnect. So I think you mean an exceptions like 'transaction not
> set', or 'invalid password'? Which problem do you have in particular?
>
Edit TSQLQuery.SQL with the SQL editor in MSEide.
Enter a valid query ("select * from table1").
Press the 'Test' button -> the dataset will be opened, data fetched,
tbufdataset.ffirstrecbuf and fcurrentrecbuf are set, dataset is closed,
ffirstrecbuf is now invalid.
Enter a invalid query ("select sdf%&/we$$ from table1").
Press the 'Test' button.
Exception in TSQLQuery.internalopen, dointernalclose calls internalclose which
uses the
invalid ffirstrecbuf -> AV or freeing of wrong memory (that hapend in MSEide,
I needed 20 hours to find the cause).
procedure TBufDataset.InternalClose;
var pc : pchar;
begin
FOpen:=False;
FCurrentRecBuf := FFirstRecBuf; <<<<<<<<<<<<<------!!!!!
SetLength(FUpdateBuffer,0);
while assigned(FCurrentRecBuf) do
begin
pc := pointer(FCurrentRecBuf);
FCurrentRecBuf := FCurrentRecBuf^.next;
FreeRecordBuffer(pc); <<<<<<<<<<<<<<<<-------!!!!
end;
SetLength(FFieldBufPositions,0);
end;
Possibly it is enough to set ffirstrecbuf to nil in internalclose (untested!).
Martin
More information about the fpc-devel
mailing list