From c1a38ce8f4f12ac3bad315318adcda5ea40ba197 Mon Sep 17 00:00:00 2001 From: cuz Date: Sun, 4 Jun 2006 09:48:14 +0000 Subject: [PATCH] Fixed a problem in mouse_load_driver: The driver was not removed from memory when the load failed. git-svn-id: svn://svn.cc65.org/cc65/trunk@3748 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- asminc/mouse-kernel.inc | 4 +++- include/mouse/mouse-kernel.h | 19 +++++++++++++++---- libsrc/mouse/mouse-kernel.s | 3 ++- libsrc/mouse/mouse_load.c | 17 +++++++++++++++-- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/asminc/mouse-kernel.inc b/asminc/mouse-kernel.inc index 61eae0b4e..9e8662895 100644 --- a/asminc/mouse-kernel.inc +++ b/asminc/mouse-kernel.inc @@ -151,8 +151,10 @@ MOUSE_BTN_RIGHT = $01 .global _mouse_info .global _mouse_ioctl + .global _mouse_clear_ptr + ;------------------------------------------------------------------------------ -; Driver entry points +; Driver entry points (asm callable) .global mouse_install .global mouse_uninstall diff --git a/include/mouse/mouse-kernel.h b/include/mouse/mouse-kernel.h index 9455f7949..1bcac64d5 100644 --- a/include/mouse/mouse-kernel.h +++ b/include/mouse/mouse-kernel.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2003 Ullrich von Bassewitz */ -/* Römerstraße 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2003-2006, Ullrich von Bassewitz */ +/* Römerstraße 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -49,6 +49,17 @@ extern void* mouse_drv; /* Pointer to driver */ +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +void mouse_clear_ptr (void); +/* Clear the mouse_drv pointer */ + + + /* End of mouse-kernel.h */ #endif diff --git a/libsrc/mouse/mouse-kernel.s b/libsrc/mouse/mouse-kernel.s index 9a1fdf1f1..bd0e15356 100644 --- a/libsrc/mouse/mouse-kernel.s +++ b/libsrc/mouse/mouse-kernel.s @@ -162,7 +162,7 @@ _mouse_uninstall: jsr uninstall_irq ; Disable driver interrupts jsr mouse_uninstall ; Call driver routine -mouse_clear_ptr: ; External entry point +_mouse_clear_ptr: ; External entry point lda #0 sta _mouse_drv sta _mouse_drv+1 ; Clear the driver pointer @@ -170,3 +170,4 @@ mouse_clear_ptr: ; External entry point tax rts ; Return zero + diff --git a/libsrc/mouse/mouse_load.c b/libsrc/mouse/mouse_load.c index cbb7cecba..a04a8eaad 100644 --- a/libsrc/mouse/mouse_load.c +++ b/libsrc/mouse/mouse_load.c @@ -75,9 +75,22 @@ unsigned char __fastcall__ mouse_load_driver (const struct mouse_callbacks* c, if (Res == MLOAD_OK) { /* Check the driver signature, install the driver */ - return mouse_install (c, ctrl.module); - + Res = mouse_install (c, ctrl.module); + + /* If the driver did not install correctly, remove it from + * memory again. + */ + if (Res != MLOAD_OK) { + /* Do not call mouse_uninstall here, since the driver is not + * correctly installed. + */ + mod_free (mouse_drv); + mouse_clear_ptr (); + } } + + /* Return the error code */ + return Res; } /* Error loading the driver */ -- 2.39.5