From 34d6f8189f81a2479170343cb6a19e74473f683a Mon Sep 17 00:00:00 2001 From: Jurgen Date: Fri, 16 Feb 2024 18:07:13 +0000 Subject: [PATCH] 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 --- kernel/trunk/core/dll.inc | 2 +- kernel/trunk/core/sys32.inc | 48 +++++++++++++++++++++++++++++++++ kernel/trunk/docs/sysfuncr.txt | 9 +++++-- kernel/trunk/network/socket.inc | 23 +++++++--------- 4 files changed, 65 insertions(+), 17 deletions(-) diff --git a/kernel/trunk/core/dll.inc b/kernel/trunk/core/dll.inc index 4a142e44ca..dd9d8f303b 100644 --- a/kernel/trunk/core/dll.inc +++ b/kernel/trunk/core/dll.inc @@ -511,7 +511,7 @@ proc load_file_umode stdcall, file_name:dword jnz .err_1 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 ;it is very likely that the file is packed stdcall kernel_alloc, [file_size] ;with kpack, so allocate memory from kernel heap diff --git a/kernel/trunk/core/sys32.inc b/kernel/trunk/core/sys32.inc index e056116d58..b48650e757 100644 --- a/kernel/trunk/core/sys32.inc +++ b/kernel/trunk/core/sys32.inc @@ -201,11 +201,59 @@ exc_c: ; exceptions (all but 7th - #NM) iretd 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] sub dword[reg_esp3], 8 mov edi, [reg_esp3] stosd mov [edi], ebx +.end: restore_ring3_context ; simply return control to interrupted process unknown_interrupt: diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 7008695542..b2a5bf636b 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -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) diff --git a/kernel/trunk/network/socket.inc b/kernel/trunk/network/socket.inc index 33d82709e7..840bc5b434 100644 --- a/kernel/trunk/network/socket.inc +++ b/kernel/trunk/network/socket.inc @@ -757,22 +757,17 @@ socket_close: jne .free 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: call socket_free - ret - - .tcp: - test [eax + SOCKET.state], SS_ISCONNECTED - jz @f - test [eax + SOCKET.state], SS_ISDISCONNECTING - jnz @f - call tcp_disconnect - @@: -; TODO: -; ... -; call socket_free + .end: ret