From cbca315c7da077dc529b514d0688edade5d2b51f Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Mon, 1 Feb 2016 19:43:10 +0000 Subject: [PATCH] IPv4: Dont crash when there is no route to host. git-svn-id: svn://kolibrios.org@6122 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/kernel.asm | 8 ++++---- kernel/trunk/network/IPv4.inc | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 672849759d..e7ce3f9f04 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -1,6 +1,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. +;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; PROGRAMMING: ;; Ivan Poddubny ;; Marat Zakiyanov (Mario79) @@ -2177,7 +2177,7 @@ sys_end: @@: mov eax, [TASK_BASE] - mov [eax+TASKDATA.state], 3; terminate this program + mov [eax+TASKDATA.state], TSTATE_ZOMBIE call wakeup_osloop .waitterm: ; wait here for termination @@ -3746,7 +3746,7 @@ nobackgr: align 4 markz: push ecx edx - cmp [edx+TASKDATA.state], 9 + cmp [edx+TASKDATA.state], TSTATE_FREE jz .nokill lea edx, [(edx-(CURRENT_TASK and 1FFFFFFFh))*8+SLOT_BASE] cmp [edx+APPDATA.process], sys_proc @@ -3760,7 +3760,7 @@ markz: pop edx ecx test eax, eax jz @f - mov [edx+TASKDATA.state], byte 3 + mov [edx+TASKDATA.state], TSTATE_ZOMBIE @@: add edx, 0x20 loop markz diff --git a/kernel/trunk/network/IPv4.inc b/kernel/trunk/network/IPv4.inc index 61cfcd9753..2433d7ac63 100644 --- a/kernel/trunk/network/IPv4.inc +++ b/kernel/trunk/network/IPv4.inc @@ -1,6 +1,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; -;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; +;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; ;; IPv4.INC ;; @@ -634,6 +634,8 @@ ipv4_output: push ecx ax edi mov eax, edi call ipv4_route ; outputs device number in edi, dest ip in eax, source IP in edx + test eax, eax + jz .no_route push edx test edi, edi jz .loopback @@ -683,6 +685,12 @@ ipv4_output: xor eax, eax ret + .no_route: + DEBUGF DEBUG_NETWORK_ERROR, "IPv4_output: No route to host!\n" + add esp, 2*4+2 + xor eax, eax + ret + .arp_error: DEBUGF DEBUG_NETWORK_ERROR, "IPv4_output: ARP error=%x\n", eax add esp, 4 @@ -917,7 +925,7 @@ endp ; ebx = outgoing device / 0 ; ; edx = Source IP ; ; ; -; OUT: eax = Destination IP (or gateway IP) ; +; OUT: eax = Destination IP (may be gateway), 0 on error ; ; edx = Source IP ; ; edi = device number*4 ; ; ; @@ -926,7 +934,7 @@ endp ; ; ;-----------------------------------------------------------------; align 4 -ipv4_route: ; TODO: return error if no valid route found +ipv4_route: test ebx, ebx jnz .got_device @@ -979,6 +987,7 @@ ipv4_route: ; TODO: return error if no valid route found ret .fail: + xor eax, eax ret