[Bf-blender-cvs] [53a1b48] master: GHOST/X11: Incorrect WM_STATE access

Campbell Barton noreply at git.blender.org
Sat Nov 19 22:48:30 CET 2016


Commit: 53a1b48321b73b7b6dd3e8fde5f1b58decbf20d7
Author: Campbell Barton
Date:   Sun Nov 20 08:58:41 2016 +1100
Branches: master
https://developer.blender.org/rB53a1b48321b73b7b6dd3e8fde5f1b58decbf20d7

GHOST/X11: Incorrect WM_STATE access

This worked by accident because of struct padding,
treat state as a CARD32 as documented.

Matches wine-x11 usage.

===================================================================

M	intern/ghost/intern/GHOST_WindowX11.cpp

===================================================================

diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp
index ec2b65e..47fbe12 100644
--- a/intern/ghost/intern/GHOST_WindowX11.cpp
+++ b/intern/ghost/intern/GHOST_WindowX11.cpp
@@ -861,24 +861,32 @@ void GHOST_WindowX11::icccmSetState(int state)
 
 int GHOST_WindowX11::icccmGetState(void) const
 {
-	Atom *prop_ret;
+	struct {
+		CARD32 state;
+		XID    icon;
+	} *prop_ret;
 	unsigned long bytes_after, num_ret;
 	Atom type_ret;
-	int format_ret, st;
+	int ret, format_ret;
+	CARD32 st;
 
 	prop_ret = NULL;
-	st = XGetWindowProperty(
+	ret = XGetWindowProperty(
 	        m_display, m_window, m_system->m_atom.WM_STATE, 0, 2,
 	        False, m_system->m_atom.WM_STATE, &type_ret,
 	        &format_ret, &num_ret, &bytes_after, ((unsigned char **)&prop_ret));
-	if ((st == Success) && (prop_ret) && (num_ret == 2))
-		st = prop_ret[0];
-	else
+	if ((ret == Success) && (prop_ret != NULL) && (num_ret == 2)) {
+		st = prop_ret->state;
+	}
+	else {
 		st = NormalState;
+	}
 
-	if (prop_ret)
+	if (prop_ret) {
 		XFree(prop_ret);
-	return (st);
+	}
+
+	return st;
 }
 
 void GHOST_WindowX11::netwmMaximized(bool set)




More information about the Bf-blender-cvs mailing list