1.Add procedure check exception 12 (overflow stack) 2.Add info in reference of function 68,24 (rus) 3.Change max limit size of the load file to 1G, for load big WinApp files. 4.Fix procedure close tcp socket:

When WinApp create/close socket in loop =>  crash core Kolibri

git-svn-id: svn://kolibrios.org@9976 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Jurgen 2024-02-16 18:07:13 +00:00
parent a0d93dfb0c
commit 34d6f8189f
4 changed files with 65 additions and 17 deletions

View File

@ -511,7 +511,7 @@ proc load_file_umode stdcall, file_name:dword
jnz .err_1 jnz .err_1
mov eax, [file_size] mov eax, [file_size]
cmp eax, 1024*1024*16 ;to be enough for anybody (c) cmp eax, 1024*1024*1024 ;to be enough for anybody 1Gbt(c)
ja .err_1 ja .err_1
;it is very likely that the file is packed ;it is very likely that the file is packed
stdcall kernel_alloc, [file_size] ;with kpack, so allocate memory from kernel heap stdcall kernel_alloc, [file_size] ;with kpack, so allocate memory from kernel heap

View File

@ -201,11 +201,59 @@ exc_c: ; exceptions (all but 7th - #NM)
iretd iretd
IRetToUserHook: IRetToUserHook:
cmp ebx, 12
je .ex_stack
cmp ebx, 14
jne .nostack
mov ecx, cr2
sub ecx, [reg_esp3]
jg .nostack
add ecx, 1000h
jl .nostack
.ex_stack:
xor ecx, ecx
mov ecx, [ecx+APP_HEADER_01_.except_stack_top]
test ecx, ecx
jle .nostack
xchg edi, eax
sub ecx, sizeof.EXCEPT_STACK
push ebx
push 1
pop ebx
.lock:
lock bts [ecx+EXCEPT_STACK.LockAccess], 0
jnc .lock1
call delay_hs_unprotected
jmp .lock
.lock1:
pop ebx
cmp ebx, 14
jne .ex12
btr [esi+APPDATA.except_mask], 12
jc .ex_stack1
xchg eax, edi
jmp .nostack
.ex_stack1:
bts [esi+APPDATA.except_mask], ebx
dec ebx
dec ebx
.ex12:
mov [ecx+EXCEPT_STACK.ExcCode], ebx
mov eax, ecx
xchg [reg_esp3], eax
mov [ecx+EXCEPT_STACK.OldESP], eax
mov eax, cr2
mov [ecx+EXCEPT_STACK.RegCR2], eax
xchg edi, [reg_eip]
mov [ecx+EXCEPT_STACK.RegEIP], edi
jmp .end
.nostack:
xchg eax, [reg_eip] xchg eax, [reg_eip]
sub dword[reg_esp3], 8 sub dword[reg_esp3], 8
mov edi, [reg_esp3] mov edi, [reg_esp3]
stosd stosd
mov [edi], ebx mov [edi], ebx
.end:
restore_ring3_context restore_ring3_context
; simply return control to interrupted process ; simply return control to interrupted process
unknown_interrupt: unknown_interrupt:

View File

@ -3608,8 +3608,13 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
приостановка с уведомлением отлаживающего приложения иначе. приостановка с уведомлением отлаживающего приложения иначе.
* После завершения критических действий в обработчике пользователя * После завершения критических действий в обработчике пользователя
восстановление бита маски данного исключения можно сделать восстановление бита маски данного исключения можно сделать
подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.
возлагается на обработчик пользователя.
Внимание:
Если пользовательский обработчик обрабатывает исключение переполнения стека (#SS), то должен быть установлен адрес резервного стека в заголовке программы (см. структуру APP_HEADER_01_ taskman.inc).
В этот резервный стек будут записаны дополнительные данные (см. структуру EXCEPT_STACK sys32.inc).
Пользовательский бработчик,при завершении обработки этого исключения, должен дополнительно обнулить бит занятости (бит номер 0) резервного стека в поле LockAccess структуры EXCEPT_STACK.
---------------------- Константы для регистров: ---------------------- ---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68) eax - SF_SYS_MISC (68)

View File

@ -757,22 +757,17 @@ socket_close:
jne .free jne .free
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
je .tcp jne .free
test [eax + SOCKET.state], SS_ISCONNECTED
jz .free
test [eax + SOCKET.state], SS_ISDISCONNECTING
jnz .free
call tcp_disconnect
test eax, eax
jz .end
.free: .free:
call socket_free call socket_free
ret .end:
.tcp:
test [eax + SOCKET.state], SS_ISCONNECTED
jz @f
test [eax + SOCKET.state], SS_ISDISCONNECTING
jnz @f
call tcp_disconnect
@@:
; TODO:
; ...
; call socket_free
ret ret