From 607783d7414735d1dc54afb0c7346ed8e13303a2 Mon Sep 17 00:00:00 2001 From: zhaoyao73 Date: Sun, 3 Sep 2023 01:36:02 -0400 Subject: [PATCH] fix pci_irq.c - memory leak - wrong irq_name allocated length (#367) add function declaration to avoid compiling warning add extra packages need for build Co-authored-by: Yao Zhao --- kernel/src/driver/pci/pci_irq.c | 19 +++++++++++-------- kernel/src/driver/timers/HPET/HPET.c | 1 + tools/build_gcc_toolchain.sh | 4 +++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/kernel/src/driver/pci/pci_irq.c b/kernel/src/driver/pci/pci_irq.c index ae3dffd6..a21ae344 100644 --- a/kernel/src/driver/pci/pci_irq.c +++ b/kernel/src/driver/pci/pci_irq.c @@ -42,14 +42,17 @@ uint16_t c_irq_install(ul irq_num,void (*pci_irq_handler)(ul irq_num, ul paramet { return EAGAIN; } + hardware_intr_controller* pci_interrupt_controller = kmalloc(sizeof(hardware_intr_controller),0); - pci_interrupt_controller->enable = pci_irq_enable; - pci_interrupt_controller->disable = pci_irq_disable; - pci_interrupt_controller->install= pci_irq_install; - pci_interrupt_controller->uninstall= pci_irq_uninstall; - if(pci_irq_ack) + if (pci_interrupt_controller) { + pci_interrupt_controller->enable = pci_irq_enable; + pci_interrupt_controller->disable = pci_irq_disable; + pci_interrupt_controller->install = pci_irq_install; + pci_interrupt_controller->uninstall = pci_irq_uninstall; pci_interrupt_controller->ack = pci_irq_ack; - int namelen = sizeof(strlen(irq_name) + 1); + p->controller = pci_interrupt_controller; + } + size_t namelen = strlen(irq_name) + 1; p->irq_name = (char *)kmalloc(namelen, 0); memset(p->irq_name, 0, namelen); strncpy(p->irq_name, irq_name, namelen); @@ -73,12 +76,12 @@ void c_irq_uninstall(ul irq_num) { kerror("irq install for pci irq: invalid irq num: %ld.", irq_num); } - if(p->irq_name!=NULL) + if(p->irq_name != NULL) { kfree(p->irq_name); p->irq_name = NULL; } - if(p->controller!=NULL) + if(p->controller != NULL) { kfree(p->controller); p->controller = NULL; diff --git a/kernel/src/driver/timers/HPET/HPET.c b/kernel/src/driver/timers/HPET/HPET.c index 7cb090f4..0dd76500 100644 --- a/kernel/src/driver/timers/HPET/HPET.c +++ b/kernel/src/driver/timers/HPET/HPET.c @@ -27,6 +27,7 @@ static uint64_t test_tsc_end = 0; extern uint64_t Cpu_tsc_freq; // 导出自cpu.c extern struct rtc_time_t rtc_now; // 导出全局墙上时钟 +extern uint64_t rs_update_timer_jiffies(uint64_t); enum { diff --git a/tools/build_gcc_toolchain.sh b/tools/build_gcc_toolchain.sh index 8aa74208..c0f187fe 100644 --- a/tools/build_gcc_toolchain.sh +++ b/tools/build_gcc_toolchain.sh @@ -89,7 +89,9 @@ case `cat /etc/os-release | grep '^NAME=' | cut -d'"' -f2` in wget ;; "Arch"*) - sudo pacman -S --needed --noconfirm gcc make flex wget texinfo libmpc gmp mpfr + sudo pacman -S --needed --noconfirm \ + gcc make flex wget texinfo libmpc gmp mpfr \ + diffutils pkgconf which unzip ;; *) ;;