From 54a5669fadeb6a181f652e3931635e0c8c28be9f Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Fri, 9 Sep 2016 17:42:59 +0200 Subject: [PATCH] Fixes memory issues with network interface When the vector grows, it invalidates the network interface pointers --- kernel/include/drivers/loopback.hpp | 1 + kernel/include/drivers/rtl8139.hpp | 1 + kernel/src/drivers/loopback.cpp | 10 ++++++---- kernel/src/drivers/rtl8139.cpp | 6 +++++- kernel/src/net/network.cpp | 10 ++++++++++ 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/kernel/include/drivers/loopback.hpp b/kernel/include/drivers/loopback.hpp index 0c5a075a..40c9182f 100644 --- a/kernel/include/drivers/loopback.hpp +++ b/kernel/include/drivers/loopback.hpp @@ -15,6 +15,7 @@ namespace loopback { void init_driver(network::interface_descriptor& interface); +void finalize_driver(network::interface_descriptor& interface); } //end of namespace loopback diff --git a/kernel/include/drivers/rtl8139.hpp b/kernel/include/drivers/rtl8139.hpp index dedb6d1f..8d1382f3 100644 --- a/kernel/include/drivers/rtl8139.hpp +++ b/kernel/include/drivers/rtl8139.hpp @@ -17,6 +17,7 @@ namespace rtl8139 { void init_driver(network::interface_descriptor& interface, pci::device_descriptor& pci_device); +void finalize_driver(network::interface_descriptor& interface); } //end of namespace rtl8139 diff --git a/kernel/src/drivers/loopback.cpp b/kernel/src/drivers/loopback.cpp index ee645343..d9faf7a9 100644 --- a/kernel/src/drivers/loopback.cpp +++ b/kernel/src/drivers/loopback.cpp @@ -45,12 +45,14 @@ void send_packet(network::interface_descriptor& interface, network::ethernet::pa void loopback::init_driver(network::interface_descriptor& interface){ logging::logf(logging::log_level::TRACE, "loopback: Initialize loopback driver\n"); - loopback_t* desc = new loopback_t(); - desc->interface = &interface; - - interface.driver_data = desc; + interface.driver_data = new loopback_t(); interface.hw_send = send_packet; interface.ip_address = network::ip::make_address(127, 0, 0, 1); //TODO interface.mac_address = mac; } + +void loopback::finalize_driver(network::interface_descriptor& interface){ + auto* desc = static_cast(interface.driver_data); + desc->interface = &interface; +} diff --git a/kernel/src/drivers/rtl8139.cpp b/kernel/src/drivers/rtl8139.cpp index e99c8127..9eed4b94 100644 --- a/kernel/src/drivers/rtl8139.cpp +++ b/kernel/src/drivers/rtl8139.cpp @@ -229,7 +229,6 @@ void rtl8139::init_driver(network::interface_descriptor& interface, pci::device_ logging::logf(logging::log_level::TRACE, "rtl8139: Initialize RTL8139 driver on pci:%u:%u:%u\n", uint64_t(pci_device.bus), uint64_t(pci_device.device), uint64_t(pci_device.function)); rtl8139_t* desc = new rtl8139_t(); - desc->interface = &interface; interface.driver_data = desc; interface.hw_send = send_packet; @@ -327,3 +326,8 @@ void rtl8139::init_driver(network::interface_descriptor& interface, pci::device_ logging::logf(logging::log_level::TRACE, "rtl8139: MAC Address %h \n", mac); } + +void rtl8139::finalize_driver(network::interface_descriptor& interface){ + auto* desc = static_cast(interface.driver_data); + desc->interface = &interface; +} diff --git a/kernel/src/net/network.cpp b/kernel/src/net/network.cpp index 99b44072..8970bbdd 100644 --- a/kernel/src/net/network.cpp +++ b/kernel/src/net/network.cpp @@ -162,6 +162,16 @@ void network::init(){ loopback::init_driver(interface); sysfs_publish(interface); + + for(auto& interface : interfaces){ + if(interface.enabled){ + if(interface.driver == "loopback"){ + loopback::finalize_driver(interface); + } else if(interface.driver == "rtl8139"){ + rtl8139::finalize_driver(interface); + } + } + } } void network::finalize(){