[PATCH libXi 7/7] Refactor XGetExtensionVersion.

Michal Srb msrb at suse.com
Sat Nov 1 11:00:57 PDT 2014


_XiGetExtensionVersion was called from XGetExtensionVersion and from
_XiCheckExtInit. When called from _XiCheckExtInit, nothing accounted for the
fact that it can return ((XExtensionVersion *) NoSuchExtension) in case of
error. Also it recursively calls _XiCheckExtInit potentionally causing multiple
unlocks if _XiCheckExtInit fails.
-> Remove it and call directly _XiGetExtensionVersionRequest and only call
_XiCheckExtInit only from XGetExtensionVersion.

Signed-off-by: Michal Srb <msrb at suse.com>
---
 src/XExtInt.c  |  2 +-
 src/XGetVers.c | 28 +++++++++++-----------------
 src/XIint.h    |  1 -
 3 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/src/XExtInt.c b/src/XExtInt.c
index d3c6b7c..672d69a 100644
--- a/src/XExtInt.c
+++ b/src/XExtInt.c
@@ -380,7 +380,7 @@ _XiCheckExtInit(
 	    return (-1);
 	}
 	((XInputData *) info->data)->vers =
-	    _XiGetExtensionVersion(dpy, "XInputExtension", info);
+	    _XiGetExtensionVersionRequest(dpy, "XInputExtension", info->codes->major_opcode);
     }
 
     if (_XiCheckVersion(info, version_index) < 0) {
diff --git a/src/XGetVers.c b/src/XGetVers.c
index 0751b98..f7e22e6 100644
--- a/src/XGetVers.c
+++ b/src/XGetVers.c
@@ -68,12 +68,16 @@ XGetExtensionVersion(register Display * dpy, _Xconst char *name)
     XExtDisplayInfo *info = XInput_find_display(dpy);
 
     LockDisplay(dpy);
-    ext = _XiGetExtensionVersion(dpy, name, info);
-    if (ext != (XExtensionVersion *) NoSuchExtension) {
-	UnlockDisplay(dpy);
-	SyncHandle();
-    }
-    return (ext);
+
+    if (_XiCheckExtInit(dpy, Dont_Check, info) == -1)
+        return NULL;
+
+    ext = _XiGetExtensionVersionRequest(dpy, name, info->codes->major_opcode);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+
+    return ext;
 }
 
 _X_HIDDEN XExtensionVersion*
@@ -91,7 +95,7 @@ _XiGetExtensionVersionRequest(Display *dpy, _Xconst char *name, int xi_opcode)
     _XSend(dpy, name, (long)req->nbytes);
 
     if (!_XReply(dpy, (xReply *) & rep, 0, xTrue)) {
-	return (XExtensionVersion *) NULL;
+	return NULL;
     }
 
     ext = (XExtensionVersion *) Xmalloc(sizeof(XExtensionVersion));
@@ -105,13 +109,3 @@ _XiGetExtensionVersionRequest(Display *dpy, _Xconst char *name, int xi_opcode)
 
     return ext;
 }
-
-_X_HIDDEN XExtensionVersion *
-_XiGetExtensionVersion(register Display * dpy, _Xconst char *name,
-                       XExtDisplayInfo *info)
-{
-    if (_XiCheckExtInit(dpy, Dont_Check, info) == -1)
-	return ((XExtensionVersion *) NoSuchExtension);
-
-    return _XiGetExtensionVersionRequest(dpy, name, info->codes->major_opcode);
-}
diff --git a/src/XIint.h b/src/XIint.h
index 99f3652..9479a79 100644
--- a/src/XIint.h
+++ b/src/XIint.h
@@ -29,7 +29,6 @@ extern XExtDisplayInfo *XInput_find_display(Display *);
 extern int _XiCheckExtInit(Display *, int, XExtDisplayInfo *);
 extern int _XiCheckVersion(XExtDisplayInfo *info, int version_index);
 
-extern XExtensionVersion *_XiGetExtensionVersion(Display *, _Xconst char *, XExtDisplayInfo *);
 extern XExtensionVersion* _XiGetExtensionVersionRequest(Display *dpy, _Xconst char *name, int xi_opcode);
 extern Status _xiQueryVersion(Display *dpy, int*, int*, XExtDisplayInfo *);
 
-- 
1.8.4.5



More information about the xorg-devel mailing list