diff options
-rw-r--r-- | src/Ewmh.cc | 21 |
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 | ||