aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Ewmh.cc21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/Ewmh.cc b/src/Ewmh.cc
index aacb2ed..14c74c6 100644
--- a/src/Ewmh.cc
+++ b/src/Ewmh.cc
@@ -109,10 +109,15 @@ void extractNetWmIcon(Atom net_wm_icon, WinClient& winclient) {
109 109
110 // read all the icons stored in _NET_WM_ICON 110 // read all the icons stored in _NET_WM_ICON
111 if (raw_data) 111 if (raw_data)
112 XFree(raw_data); 112 XFree(raw_data);
113 winclient.property(net_wm_icon, 0L, nr_icon_data, False, XA_CARDINAL, 113
114 // something went wrong
115 if (!winclient.property(net_wm_icon, 0L, nr_icon_data, False, XA_CARDINAL,
114 &rtype, &rfmt, &nr_read, &nr_bytes_left, 116 &rtype, &rfmt, &nr_read, &nr_bytes_left,
115 reinterpret_cast<unsigned char**>(&raw_data)); 117 reinterpret_cast<unsigned char**>(&raw_data))) {
118
119 return;
120 }
116 } 121 }
117 122
118 IconContainer icon_data; // stores all available data, sorted by size (width x height) 123 IconContainer icon_data; // stores all available data, sorted by size (width x height)
@@ -121,11 +126,19 @@ void extractNetWmIcon(Atom net_wm_icon, WinClient& winclient) {
121 126
122 // analyze the available icons 127 // analyze the available icons
123 long i; 128 long i;
124 for (i = 0; i < nr_icon_data; i += width * height ) { 129
130 for (i = 0; i + 2 < nr_icon_data; i += width * height ) {
125 131
126 width = raw_data[i++]; 132 width = raw_data[i++];
127 height = raw_data[i++]; 133 height = raw_data[i++];
128 134
135 // strange values stored in the NETWM_ICON
136 if (width <= 0 || height <= 0 || i + width * height > nr_icon_data) {
137 std::cerr << "Ewmh.cc extractNetWmIcon found strange _NET_WM_ICON dimensions for " << winclient.title() << "\n";
138 XFree(raw_data);
139 return;
140 }
141
129 icon_data[Size(width, height)] = &raw_data[i]; 142 icon_data[Size(width, height)] = &raw_data[i];
130 } 143 }
131 144