[MPlayer-users] fix for mplayer input bugs: shooting to memory+lost events

Mikulas Patocka mikulas at artax.karlin.mff.cuni.cz
Wed Jun 30 02:42:03 CEST 2004


This patch fixes two problems in mplayer input key system:

1. shooting to stack when only partial data are read from pipe (note that
when adding number to pointer, the number is multiplied by size of pointer

2. delayed events on svgalib:

The problem is caused by getch2, getch2 does buffering of handle 0,
however getch2 is called only when handle 0 is reported as readable by

It manifests like this:
- User holds key so that key repeat rate is higher than frame rate
	(key presses are put into buffer in getch2)
- User releases key
	(handle 0 is no longer reported as readable, however there are
	 still charactes in getch2 buffer, but getch2 is not called
- User presses another key --- few keypresses of previous key are still
	(getch2 is called and previous content of getch2 buffer is

The patch changes it so that getch2 is always called regardless of select
state of handle 0 --- it makes sense because getch2 calls select itself.


--- input/input.c_	2004-06-30 02:04:43.000000000 +0100
+++ input/input.c	2004-06-30 02:25:50.000000000 +0100
@@ -656,7 +656,7 @@
   unsigned int l;
   l = 0;
   while(l < sizeof(int)) {
-    r = read(fd,(&code)+l,sizeof(int)-l);
+    r = read(fd,((char *)&code)+l,sizeof(int)-l);
     if(r <= 0)
     l +=r;
@@ -902,7 +902,7 @@
     // No input from this fd
-    if(! (key_fds[i].flags & MP_FD_NO_SELECT) && ! FD_ISSET(key_fds[i].fd,&fds))
+    if(! (key_fds[i].flags & MP_FD_NO_SELECT) && ! FD_ISSET(key_fds[i].fd,&fds) && key_fds[i].fd != 0)
     if(key_fds[i].fd == 0) { // stdin is handled by getch2

More information about the MPlayer-users mailing list