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