Нашел серйозный глюк в библиотеке libio
При вызове функции file.close с нулевым указателем не делается проверка на то что он нулевой и в результате затирается системная память.
Глюк может проявлятся в случаях когда программа использует библиотеку
libini, но при этом самого файла ini на диске нет. В таком случае идет попытка закрыть нулевой указатель на файл, что приводит к последующему вылету приложения, которое пыталось считать настройки из несуществующего файла.
Предлагаю такой вариант функции file.close :
Code:
;;================================================================================================;;
proc file.close _filed ;//////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Close file ;;
;;------------------------------------------------------------------------------------------------;;
;> _filed = file descriptor (see `file.open`) <InternalFileInfo*> ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = -1 (error) / file pointer position <dword> ;;
;;------------------------------------------------------------------------------------------------;;
;# call `file.err` to obtain extended error information ;;
;;================================================================================================;;
cmp eax,32
jb .exit_error
mov eax, [_filed]
mov [eax + InternalFileInfo.Mode], 0
mov [eax + InternalFileInfo.FileName], 0
invoke mem.free, eax
xor eax, eax
jmp @f
.exit_error:
or eax, -1
@@:
ret
endp
Если никто не против, то обновлю файл libio.asm . У меня просто вызывает сомнение коментарий:
Quote:
eax = -1 (error) / file pointer position
Т. е. судя по коментарию в случае ошибки должно вернуться -1, но я не знаю стоит ли это значение возвращать ? Просто судя по всему оно вообще нигде не использовалось, нужно ли оно ?
Т. е. строка в моем коде:
Code:
or eax, -1
вроди бы и не нужна ...