Procházet zdrojové kódy

X11_InitKeyboard: do not call XAutoRepeatOn unnecessarily
Use XGetKeyboardControl to initialize the current XKeyboardState, and
skip XAutoRepeatOn invocation if global_auto_repeat is AutoRepeatModeOn.

This fixes SDL2 when the X11 client is untrusted.

Dmitry V. Levin před 5 roky
rodič
revize
2b1edf4113
2 změnil soubory, kde provedl 5 přidání a 1 odebrání
  1. 4 1
      src/video/x11/SDL_x11keyboard.c
  2. 1 0
      src/video/x11/SDL_x11sym.h

+ 4 - 1
src/video/x11/SDL_x11keyboard.c

@@ -267,8 +267,11 @@ X11_InitKeyboard(_THIS)
     int best_index;
     int distance;
     Bool xkb_repeat = 0;
+    XKeyboardState values = { .global_auto_repeat = AutoRepeatModeOff };
     
-    X11_XAutoRepeatOn(data->display);
+    X11_XGetKeyboardControl(data->display, &values);
+    if (values.global_auto_repeat != AutoRepeatModeOn)
+        X11_XAutoRepeatOn(data->display);
 
 #if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM
     {

+ 1 - 0
src/video/x11/SDL_x11sym.h

@@ -72,6 +72,7 @@ SDL_X11_SYM(char*,XGetAtomName,(Display *a,Atom b),(a,b),return)
 SDL_X11_SYM(int,XGetInputFocus,(Display *a,Window *b,int *c),(a,b,c),return)
 SDL_X11_SYM(int,XGetErrorDatabaseText,(Display* a,_Xconst char* b,_Xconst char* c,_Xconst char* d,char* e,int f),(a,b,c,d,e,f),return)
 SDL_X11_SYM(XModifierKeymap*,XGetModifierMapping,(Display* a),(a),return)
+SDL_X11_SYM(int,XGetKeyboardControl,(Display* a, XKeyboardState* b),(a,b),return)
 SDL_X11_SYM(int,XGetPointerControl,(Display* a,int* b,int* c,int* d),(a,b,c,d),return)
 SDL_X11_SYM(Window,XGetSelectionOwner,(Display* a,Atom b),(a,b),return)
 SDL_X11_SYM(XVisualInfo*,XGetVisualInfo,(Display* a,long b,XVisualInfo* c,int* d),(a,b,c,d),return)