Ошибка записи/считывания в полях dtExtString dtExtWideString

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Закрыто
sjone
Сообщения: 1
Зарегистрирован: Пн 18 июн 2012 12:51

Ошибка записи/считывания в полях dtExtString dtExtWideString

Сообщение sjone » Пн 18 июн 2012 13:08

При записи данных в такое поле - не проверяется превышает ли размер входяших данных размер поля.

Код: Выделить всё

unit MemData;
procedure TData.PutFieldData(Field: TFieldDesc; FieldBuf: IntPtr; Source: IntPtr; IsDatabaseValue: boolean = False);
...
    dtExtString: begin
      StringHeap.DisposeBuf(Marshal.ReadIntPtr(FieldBuf));
      Marshal.WriteIntPtr(FieldBuf, StringHeap.AllocStr(Source)); //тут тоже ошибка
    end;
    dtExtWideString: begin
      StringHeap.DisposeBuf(Marshal.ReadIntPtr(FieldBuf));
      //так было 
      //Marshal.WriteIntPtr(FieldBuf, StringHeap.AllocWideStr(Source));
      //а где то так должно быть
      Marshal.WriteIntPtr(FieldBuf, StringHeap.AllocWideStr(Source, False, Min(StrLenW(Source), Field.Length)));
    end;
Это приводит к тому, что потом при попытке считать значение с этого поля в буфер скопируется строка длиннее чем размер буфера(который выделяется с ориентацией на размер поля)

Код: Выделить всё

unit MemData;
procedure TData.GetFieldData(Field: TFieldDesc; FieldBuf: IntPtr; Dest: IntPtr);
...
    dtExtString: begin
      ...
        StrCopy(PAChar(Dest), Marshal.ReadIntPtr(FieldBuf));
    end;
    dtExtWideString: begin
      ...
        StrCopyW(Dest, Marshal.ReadIntPtr(FieldBuf));
    end;

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Ошибка записи/считывания в полях dtExtString dtExtWideString

Сообщение AndreyZ » Вт 19 июн 2012 08:57

Мы уже исправили данную проблему. Данное исправление войдет в следующую версию MyDAC.

Закрыто