Проверка размера структур

Разработка Far.
Post Reply
User avatar
ctapmex
Posts: 1146
Joined: Fri 11 Apr, 2008 07:53
Been thanked: 34 times

Проверка размера структур

Post by ctapmex »

в far размер принятых через api структур проверяется как

Code: Select all

bool CheckStructSize(const T* s) {return s && (s->StructSize >= sizeof(T));}
.
для чего используется >= , а не просто = ?

защита от новый плагин (новое апи) на старом фаре есть в виде MinFarVersion. но если она некорретна, то проверку CheckStructSize проходим. далее по коду не заполняем все поля структуры (ведь появились новые). плагин не знает об этом , получает ошибочные данные в незаполненных фаром полях.


второй вариант, если просто забыли заполнить StructSize. он не инициализирован , имеет очень большое значение (у меня 3435973836), проверку проходит. и все как бы работает. но в релизной версии значение StructSize уже имеет другое значение (какое ? что то я туплю и не могу понять как отладить релизную версию, кроме как лог писать), и не проходит проверку. плагин не работает.

в итоге из-за этого > ошибка не всплывает во время отладки.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 5 times

Re: Проверка размера структур

Post by Skirda »

"А вы так не делайте", ибо заполнение StructSize обязательно
We are the Borg. You will be assimilated.
So Say We All!
2useven10
Posts: 4224
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 6 times
Been thanked: 209 times

Re: Проверка размера структур

Post by 2useven10 »

Делать так конечно нехорошо, но в дебаге вполне можно добавить assert на неинициализованное значение.
User avatar
ctapmex
Posts: 1146
Joined: Fri 11 Apr, 2008 07:53
Been thanked: 34 times

Re: Проверка размера структур

Post by ctapmex »

Skirda wrote:"А вы так не делайте", ибо заполнение StructSize обязательно
так оно понятно. но когда ломают api найти все места где нужно что то исправить сложновато.
я в общем то все заполнил. но вопрос остался - нафига так сделано? больше в образовательных целях интересно.
User avatar
ctapmex
Posts: 1146
Joined: Fri 11 Apr, 2008 07:53
Been thanked: 34 times

Re: Проверка размера структур

Post by ctapmex »

еще тогда непонятна такая проверка. защита от запуска на новом фаре старых плагинов? так опять же для этого есть MinFarVersion.
т.е. по моему для полноценной защиты нужно именно равенство, а не >=
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 5 times

Re: Проверка размера структур

Post by Skirda »

Ты в своем плагине не сделал MinFarVersion, А ФАР тебе заполнил избыток инфы и когда ты получил управление... что будет?
We are the Borg. You will be assimilated.
So Say We All!
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Re: Проверка размера структур

Post by Max Rusov »

По моему тоже, сравнение должно быть на равенство. В будущих версиях, если размер структуры увеличится - должно быть сравнение со всем предыдущими известными размерами. А так - бессмыслица какая-то.
User avatar
ctapmex
Posts: 1146
Joined: Fri 11 Apr, 2008 07:53
Been thanked: 34 times

Re: Проверка размера структур

Post by ctapmex »

Skirda wrote:Ты в своем плагине не сделал MinFarVersion, А ФАР тебе заполнил избыток инфы и когда ты получил управление... что будет?
если я не заполнил MinFarVersion, или некорректно заполнил то
1. плагин старее фара, размер структуры у плагина меньше чем у фара - фар возвращает "ошибку" после проверки CheckStructSize
2. плагин новее фара, размер стуктуры у плагина больше чем у фара - фар заполнил часть структуры (по мнению фара все что нужно). плагин читает данные из незаполненных полей фаром и получает некорректную информацию. Т.е. приводит к неработоспособности плагина. а зачем это надо? пусть "роняет" сразу. ибо нефиг.


эти проверки прекрасно работает и с = . >= избыток . зачем новому плагину, рассчитанному под новое api работать на старом фаре?
User avatar
DrKnS
Posts: 5804
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 10 times
Been thanked: 343 times

Re: Проверка размера структур

Post by DrKnS »

StructSize нужен для для случая "у получателя размер структуры больше, чем у отправителя".
Чтобы получатель не навернулся, работая с несуществующими полями, надо проверять размер.

Но не по >=, и тем более не по ==, а по structsize >= offsetof(поле_структуры) + sizeof(поле_структуры).

З.Ы. В Far 2 так и было сделано для DM_GETDIALOGINFO, но кто-то зачем-то переделал в checkstructsize.
Post Reply

Return to “Development”