Amiga: bound BufferQueueChar; move CloseWindow out of Forbid()
Make the BufferQueueChar macro bounds-check KbdBuffered against KBDBUFFER internally so the RAWKEY and NEWSIZE 'R'-64 paths can no longer push past the 10-byte queue; widen KbdBuffered to int so the counter cannot wrap silently in the queue-scan loops. In amii_cleanup move kill_nhwindows()/DeleteMsgPort() outside the Forbid()/Permit() pair: CloseWindow can wait on layers.library semaphores on OS 3.x and that is unsafe under Forbid. Keep only the IDCMP-flush loop inside.
This commit is contained in:
+4
-3
@@ -19,7 +19,8 @@ static struct Message *GetFMsg(struct MsgPort *);
|
|||||||
static int BufferGetchar(void);
|
static int BufferGetchar(void);
|
||||||
void ProcessMessage(struct IntuiMessage *message);
|
void ProcessMessage(struct IntuiMessage *message);
|
||||||
|
|
||||||
#define BufferQueueChar(ch) (KbdBuffer[KbdBuffered++] = (ch))
|
#define BufferQueueChar(ch) \
|
||||||
|
do { if (KbdBuffered < KBDBUFFER) KbdBuffer[KbdBuffered++] = (ch); } while (0)
|
||||||
|
|
||||||
struct Device *ConsoleDevice = NULL;
|
struct Device *ConsoleDevice = NULL;
|
||||||
|
|
||||||
@@ -51,7 +52,7 @@ struct Library *DiskfontBase;
|
|||||||
|
|
||||||
#define KBDBUFFER 10
|
#define KBDBUFFER 10
|
||||||
static unsigned char KbdBuffer[KBDBUFFER];
|
static unsigned char KbdBuffer[KBDBUFFER];
|
||||||
unsigned char KbdBuffered;
|
int KbdBuffered;
|
||||||
|
|
||||||
#ifdef HACKFONT
|
#ifdef HACKFONT
|
||||||
|
|
||||||
@@ -609,10 +610,10 @@ amii_cleanup(void)
|
|||||||
Forbid();
|
Forbid();
|
||||||
while (msg = (struct IntuiMessage *) GetMsg(HackPort))
|
while (msg = (struct IntuiMessage *) GetMsg(HackPort))
|
||||||
ReplyMsg((struct Message *) msg);
|
ReplyMsg((struct Message *) msg);
|
||||||
|
Permit();
|
||||||
kill_nhwindows(1);
|
kill_nhwindows(1);
|
||||||
DeleteMsgPort(HackPort);
|
DeleteMsgPort(HackPort);
|
||||||
HackPort = NULL;
|
HackPort = NULL;
|
||||||
Permit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close the screen, under v37 or greater it is a pub screen and there may
|
/* Close the screen, under v37 or greater it is a pub screen and there may
|
||||||
|
|||||||
+1
-1
@@ -63,7 +63,7 @@ extern struct Menu HackMenu[];
|
|||||||
extern struct Menu *MenuStrip;
|
extern struct Menu *MenuStrip;
|
||||||
extern struct NewMenu GTHackMenu[];
|
extern struct NewMenu GTHackMenu[];
|
||||||
extern APTR *VisualInfo;
|
extern APTR *VisualInfo;
|
||||||
extern unsigned char KbdBuffered;
|
extern int KbdBuffered;
|
||||||
extern struct TextFont *TextsFont;
|
extern struct TextFont *TextsFont;
|
||||||
extern struct TextFont *HackFont;
|
extern struct TextFont *HackFont;
|
||||||
extern struct IOStdReq ConsoleIO;
|
extern struct IOStdReq ConsoleIO;
|
||||||
|
|||||||
Reference in New Issue
Block a user