| File: | modules/im/ximcp/imExten.c |
| Location: | line 326, column 8 |
| Description: | String copy function overflows destination buffer |
| 1 | /****************************************************************** | |||||
| 2 | ||||||
| 3 | Copyright 1992, 1993, 1994 by FUJITSU LIMITED | |||||
| 4 | ||||||
| 5 | Permission to use, copy, modify, distribute, and sell this software | |||||
| 6 | and its documentation for any purpose is hereby granted without fee, | |||||
| 7 | provided that the above copyright notice appear in all copies and | |||||
| 8 | that both that copyright notice and this permission notice appear | |||||
| 9 | in supporting documentation, and that the name of FUJITSU LIMITED | |||||
| 10 | not be used in advertising or publicity pertaining to distribution | |||||
| 11 | of the software without specific, written prior permission. | |||||
| 12 | FUJITSU LIMITED makes no representations about the suitability of | |||||
| 13 | this software for any purpose. | |||||
| 14 | It is provided "as is" without express or implied warranty. | |||||
| 15 | ||||||
| 16 | FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | |||||
| 17 | INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO | |||||
| 18 | EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR | |||||
| 19 | CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | |||||
| 20 | USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | |||||
| 21 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | |||||
| 22 | PERFORMANCE OF THIS SOFTWARE. | |||||
| 23 | ||||||
| 24 | Author: Takashi Fujiwara FUJITSU LIMITED | |||||
| 25 | fujiwara@a80.tech.yk.fujitsu.co.jp | |||||
| 26 | ||||||
| 27 | ******************************************************************/ | |||||
| 28 | ||||||
| 29 | #ifdef HAVE_CONFIG_H1 | |||||
| 30 | #include <config.h> | |||||
| 31 | #endif | |||||
| 32 | #include <X11/Xatom.h> | |||||
| 33 | #include "Xlibint.h" | |||||
| 34 | #include "Xlcint.h" | |||||
| 35 | #include "Ximint.h" | |||||
| 36 | ||||||
| 37 | /* | |||||
| 38 | * index of extensions | |||||
| 39 | */ | |||||
| 40 | ||||||
| 41 | #define XIM_EXT_SET_EVENT_MASK_IDX0 0 | |||||
| 42 | #ifdef EXT_FORWARD | |||||
| 43 | #define XIM_EXT_FORWARD_KEYEVENT_IDX 1 | |||||
| 44 | #endif | |||||
| 45 | #ifdef EXT_MOVE | |||||
| 46 | #define XIM_EXT_MOVE_IDX 2 | |||||
| 47 | #endif | |||||
| 48 | ||||||
| 49 | typedef struct _XIM_QueryExtRec { | |||||
| 50 | Boolint is_support; | |||||
| 51 | const char *name; | |||||
| 52 | int name_len; | |||||
| 53 | CARD16 major_opcode; | |||||
| 54 | CARD16 minor_opcode; | |||||
| 55 | int idx; | |||||
| 56 | } XIM_QueryExtRec; | |||||
| 57 | ||||||
| 58 | static XIM_QueryExtRec extensions[] = { | |||||
| 59 | {False0, "XIM_EXT_SET_EVENT_MASK", 0, 0, 0, | |||||
| 60 | XIM_EXT_SET_EVENT_MASK_IDX0}, | |||||
| 61 | #ifdef EXT_FORWARD | |||||
| 62 | {False0, "XIM_EXT_FORWARD_KEYEVENT", 0, 0, 0, | |||||
| 63 | XIM_EXT_FORWARD_KEYEVENT_IDX}, | |||||
| 64 | #endif | |||||
| 65 | #ifdef EXT_MOVE | |||||
| 66 | {False0, "XIM_EXT_MOVE", 0, 0, 0, XIM_EXT_MOVE_IDX}, | |||||
| 67 | #endif | |||||
| 68 | {False0, NULL((void*)0), 0, 0, 0, 0} /* dummy */ | |||||
| 69 | }; | |||||
| 70 | ||||||
| 71 | static int | |||||
| 72 | _XimIsSupportExt( | |||||
| 73 | int idx) | |||||
| 74 | { | |||||
| 75 | register int i; | |||||
| 76 | int n = XIMNumber(extensions)((unsigned int) (sizeof(extensions) / sizeof(extensions[0]))) - 1; | |||||
| 77 | ||||||
| 78 | for (i = 0; i < n; i++) { | |||||
| 79 | if (extensions[i].idx == idx) { | |||||
| 80 | if (extensions[i].is_support) | |||||
| 81 | return i; | |||||
| 82 | else | |||||
| 83 | break; | |||||
| 84 | } | |||||
| 85 | } | |||||
| 86 | return -1; | |||||
| 87 | } | |||||
| 88 | ||||||
| 89 | static Boolint | |||||
| 90 | _XimProcExtSetEventMask( | |||||
| 91 | Xim im, | |||||
| 92 | Xic ic, | |||||
| 93 | XPointer buf) | |||||
| 94 | { | |||||
| 95 | EVENTMASK *buf_l = (EVENTMASK *)buf; | |||||
| 96 | EVENTMASK select_mask = _XimGetWindowEventmask(ic); | |||||
| 97 | ||||||
| 98 | ic->private.proto.filter_event_mask = buf_l[0]; | |||||
| 99 | ic->private.proto.intercept_event_mask = buf_l[1]; | |||||
| 100 | ic->private.proto.select_event_mask = buf_l[2]; | |||||
| 101 | ic->private.proto.forward_event_mask = buf_l[3]; | |||||
| 102 | ic->private.proto.synchronous_event_mask = buf_l[4]; | |||||
| 103 | ||||||
| 104 | select_mask &= ~ic->private.proto.intercept_event_mask; | |||||
| 105 | /* deselected event mask */ | |||||
| 106 | select_mask |= ic->private.proto.select_event_mask; | |||||
| 107 | /* selected event mask */ | |||||
| 108 | XSelectInput(im->core.display, ic->core.focus_window, select_mask); | |||||
| 109 | _XimReregisterFilter(ic); | |||||
| 110 | ||||||
| 111 | if (!(_XimProcSyncReply(im, ic))) | |||||
| 112 | return False0; | |||||
| 113 | return True1; | |||||
| 114 | } | |||||
| 115 | ||||||
| 116 | static Boolint | |||||
| 117 | _XimExtSetEventMaskCallback( | |||||
| 118 | Xim xim, | |||||
| 119 | INT16 len, | |||||
| 120 | XPointer data, | |||||
| 121 | XPointer call_data) | |||||
| 122 | { | |||||
| 123 | CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZEsizeof(CARD8) + sizeof(CARD8) + sizeof(INT16)); | |||||
| 124 | XIMID imid = buf_s[0]; | |||||
| 125 | XICID icid = buf_s[1]; | |||||
| 126 | Xim im = (Xim)call_data; | |||||
| 127 | Xic ic; | |||||
| 128 | ||||||
| 129 | if ((imid == im->private.proto.imid) | |||||
| 130 | && (ic = _XimICOfXICID(im, icid))) { | |||||
| 131 | (void)_XimProcExtSetEventMask(im, ic, (XPointer)&buf_s[2]); | |||||
| 132 | return True1; | |||||
| 133 | } | |||||
| 134 | return False0; | |||||
| 135 | } | |||||
| 136 | ||||||
| 137 | #ifdef EXT_FORWARD | |||||
| 138 | static Boolint | |||||
| 139 | _XimProcExtForwardKeyEvent( | |||||
| 140 | Xim im, | |||||
| 141 | Xic ic, | |||||
| 142 | XPointer buf) | |||||
| 143 | { | |||||
| 144 | CARD8 *buf_b = (CARD8 *)buf; | |||||
| 145 | CARD16 *buf_s = (CARD16 *)buf; | |||||
| 146 | CARD32 *buf_l = (CARD32 *)buf; | |||||
| 147 | XEvent ev; | |||||
| 148 | XKeyEvent *kev = (XKeyEvent *)&ev; | |||||
| 149 | ||||||
| 150 | bzero(&ev, sizeof(XEvent))__builtin___memset_chk (&ev, 0, sizeof(XEvent), __builtin_object_size (&ev, 0)); | |||||
| 151 | kev->send_event = False0; | |||||
| 152 | kev->display = im->core.display; | |||||
| 153 | kev->serial = buf_s[1]; /* sequence number */ | |||||
| 154 | kev->type = buf_b[4] & 0x7f; /* xEvent.u.u.type */ | |||||
| 155 | kev->keycode = buf_b[5]; /* Keycode */ | |||||
| 156 | kev->state = buf_s[3]; /* state */ | |||||
| 157 | kev->time = buf_l[2]; /* time */ | |||||
| 158 | ||||||
| 159 | XPutBackEvent(im->core.display, &ev); | |||||
| 160 | ||||||
| 161 | _XimRespSyncReply(ic, buf_s[0]); | |||||
| 162 | MARK_FABRICATED(im)(((Xim)im)->private.proto.flag |= (1L << 5)); | |||||
| 163 | ||||||
| 164 | return True1; | |||||
| 165 | } | |||||
| 166 | ||||||
| 167 | static Boolint | |||||
| 168 | _XimExtForwardKeyEventCallback( | |||||
| 169 | Xim xim, | |||||
| 170 | INT16 len, | |||||
| 171 | XPointer data, | |||||
| 172 | XPointer call_data) | |||||
| 173 | { | |||||
| 174 | CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZEsizeof(CARD8) + sizeof(CARD8) + sizeof(INT16)); | |||||
| 175 | XIMID imid = buf_s[0]; | |||||
| 176 | XICID icid = buf_s[1]; | |||||
| 177 | Xim im = (Xim)call_data; | |||||
| 178 | Xic ic; | |||||
| 179 | ||||||
| 180 | if ((imid == im->private.proto.imid) | |||||
| 181 | && (ic = _XimICOfXICID(im, icid))) { | |||||
| 182 | (void)_XimProcExtForwardKeyEvent(im, ic, (XPointer)&buf_s[2]); | |||||
| 183 | return True1; | |||||
| 184 | } | |||||
| 185 | return False0; | |||||
| 186 | } | |||||
| 187 | ||||||
| 188 | static Boolint | |||||
| 189 | _XimExtForwardKeyEventCheck( | |||||
| 190 | Xim im, | |||||
| 191 | INT16 len, | |||||
| 192 | XPointer data, | |||||
| 193 | XPointer arg) | |||||
| 194 | { | |||||
| 195 | Xic ic = (Xic)arg; | |||||
| 196 | CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZEsizeof(CARD8) + sizeof(CARD8) + sizeof(INT16)); | |||||
| 197 | CARD8 major_opcode = *((CARD8 *)data); | |||||
| 198 | CARD8 minor_opcode = *((CARD8 *)data + 1); | |||||
| 199 | XIMID imid = buf_s[0]; | |||||
| 200 | XICID icid = buf_s[1]; | |||||
| 201 | ||||||
| 202 | if ((major_opcode == XIM_SYNC_REPLY62) | |||||
| 203 | && (minor_opcode == 0) | |||||
| 204 | && (imid == im->private.proto.imid) | |||||
| 205 | && (icid == ic->private.proto.icid)) | |||||
| 206 | if ((major_opcode == XIM_ERROR20) | |||||
| 207 | && (minor_opcode == 0) | |||||
| 208 | && (buf_s[2] & XIM_IMID_VALID0x0001) | |||||
| 209 | && (imid == im->private.proto.imid) | |||||
| 210 | && (buf_s[2] & XIM_ICID_VALID0x0002) | |||||
| 211 | && (icid == ic->private.proto.icid)) | |||||
| 212 | return True1; | |||||
| 213 | return False0; | |||||
| 214 | } | |||||
| 215 | ||||||
| 216 | Boolint | |||||
| 217 | _XimExtForwardKeyEvent( | |||||
| 218 | Xic ic, | |||||
| 219 | XKeyEvent *ev, | |||||
| 220 | Boolint sync) | |||||
| 221 | { | |||||
| 222 | Xim im = (Xim) ic->core.im; | |||||
| 223 | CARD32 buf32[BUFSIZE2048/4]; | |||||
| 224 | CARD8 *buf = (CARD8 *)buf32; | |||||
| 225 | CARD8 *buf_b = &buf[XIM_HEADER_SIZEsizeof(CARD8) + sizeof(CARD8) + sizeof(INT16)]; | |||||
| 226 | CARD16 *buf_s = (CARD16 *)buf_b; | |||||
| 227 | CARD32 *buf_l = (CARD32 *)buf_b; | |||||
| 228 | CARD32 reply32[BUFSIZE2048/4]; | |||||
| 229 | char *reply = (char *)reply32; | |||||
| 230 | XPointer preply; | |||||
| 231 | int buf_size; | |||||
| 232 | int ret_code; | |||||
| 233 | INT16 len; | |||||
| 234 | int idx; | |||||
| 235 | ||||||
| 236 | if ((idx = _XimIsSupportExt(XIM_EXT_FORWARD_KEYEVENT_IDX)) < 0) | |||||
| 237 | return False0; | |||||
| 238 | ||||||
| 239 | buf_s[0] = im->private.proto.imid; /* imid */ | |||||
| 240 | buf_s[1] = ic->private.proto.icid; /* icid */ | |||||
| 241 | buf_s[2] = sync ? XimSYNCHRONUS0x0001 : 0; /* flag */ | |||||
| 242 | buf_s[3] = (CARD16)(((XAnyEvent *)ev)->serial & ((unsigned long) 0xffff)); | |||||
| 243 | /* sequence number */ | |||||
| 244 | buf_b[8] = ev->type; /* xEvent.u.u.type */ | |||||
| 245 | buf_b[9] = ev->keycode; /* keycode */ | |||||
| 246 | buf_s[5] = ev->state; /* state */ | |||||
| 247 | buf_l[3] = ev->time; /* time */ | |||||
| 248 | len = sizeof(CARD16) /* sizeof imid */ | |||||
| 249 | + sizeof(CARD16) /* sizeof icid */ | |||||
| 250 | + sizeof(BITMASK16) /* sizeof flag */ | |||||
| 251 | + sizeof(CARD16) /* sizeof sequence number */ | |||||
| 252 | + sizeof(BYTE) /* sizeof xEvent.u.u.type */ | |||||
| 253 | + sizeof(BYTE) /* sizeof keycode */ | |||||
| 254 | + sizeof(CARD16) /* sizeof state */ | |||||
| 255 | + sizeof(CARD32); /* sizeof time */ | |||||
| 256 | ||||||
| 257 | _XimSetHeader((XPointer)buf, | |||||
| 258 | extensions[idx].major_opcode, | |||||
| 259 | extensions[idx].minor_opcode, &len); | |||||
| 260 | if (!(_XimWrite(im, len, (XPointer)buf))) | |||||
| 261 | return False0; | |||||
| 262 | _XimFlush(im); | |||||
| 263 | if (sync) { | |||||
| 264 | buf_size = BUFSIZE2048; | |||||
| 265 | ret_code = _XimRead(im, &len, (XPointer)reply, buf_size, | |||||
| 266 | _XimExtForwardKeyEventCheck, (XPointer)ic); | |||||
| 267 | if(ret_code == XIM_TRUE1) { | |||||
| 268 | preply = reply; | |||||
| 269 | } else if(ret_code == XIM_OVERFLOW(-1)) { | |||||
| 270 | if(len <= 0) { | |||||
| 271 | preply = reply; | |||||
| 272 | } else { | |||||
| 273 | buf_sizex = len; | |||||
| 274 | preply = Xmalloc(buf_size)malloc(((buf_size) == 0 ? 1 : (buf_size))); | |||||
| 275 | ret_code = _XimRead(im, &len, preply, buf_size, | |||||
| 276 | _XimExtForwardKeyEventCheck, (XPointer)ic); | |||||
| 277 | if(ret_code != XIM_TRUE1) { | |||||
| 278 | Xfree(preply)free((preply)); | |||||
| 279 | return False0; | |||||
| 280 | } | |||||
| 281 | } | |||||
| 282 | } else | |||||
| 283 | return False0; | |||||
| 284 | buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZEsizeof(CARD8) + sizeof(CARD8) + sizeof(INT16)); | |||||
| 285 | if (*((CARD8 *)preply) == XIM_ERROR20) { | |||||
| 286 | _XimProcError(im, 0, (XPointer)&buf_s[3]); | |||||
| 287 | if(reply != preply) | |||||
| 288 | Xfree(preply)free((preply)); | |||||
| 289 | return False0; | |||||
| 290 | } | |||||
| 291 | if(reply != preply) | |||||
| 292 | Xfree(preply)free((preply)); | |||||
| 293 | } | |||||
| 294 | return True1; | |||||
| 295 | } | |||||
| 296 | #endif /* EXT_FORWARD */ | |||||
| 297 | ||||||
| 298 | static int | |||||
| 299 | _XimCheckExtensionListSize(void) | |||||
| 300 | { | |||||
| 301 | register int i; | |||||
| 302 | int len; | |||||
| 303 | int total = 0; | |||||
| 304 | int n = XIMNumber(extensions)((unsigned int) (sizeof(extensions) / sizeof(extensions[0]))) - 1; | |||||
| 305 | ||||||
| 306 | for (i = 0; i < n; i++) { | |||||
| 307 | len = strlen(extensions[i].name); | |||||
| 308 | extensions[i].name_len = len; | |||||
| 309 | len += sizeof(BYTE); | |||||
| 310 | total += len; | |||||
| 311 | } | |||||
| 312 | return total; | |||||
| 313 | } | |||||
| 314 | ||||||
| 315 | static void | |||||
| 316 | _XimSetExtensionList( | |||||
| 317 | CARD8 *buf) | |||||
| 318 | { | |||||
| 319 | register int i; | |||||
| 320 | int len; | |||||
| 321 | int n = XIMNumber(extensions)((unsigned int) (sizeof(extensions) / sizeof(extensions[0]))) - 1; | |||||
| 322 | ||||||
| 323 | for (i = 0; i < n; i++) { | |||||
| 324 | len = extensions[i].name_len; | |||||
| 325 | buf[0] = (BYTE)len; | |||||
| 326 | (void)strcpy((char *)&buf[1], extensions[i].name)__builtin___strcpy_chk ((char *)&buf[1], extensions[i].name , __builtin_object_size ((char *)&buf[1], 2 > 1 ? 1 : 0 )); | |||||
| ||||||
| 327 | len += sizeof(BYTE); | |||||
| 328 | buf += len; | |||||
| 329 | } | |||||
| 330 | return; | |||||
| 331 | } | |||||
| 332 | ||||||
| 333 | static unsigned int | |||||
| 334 | _XimCountNumberOfExtension( | |||||
| 335 | INT16 total, | |||||
| 336 | CARD8 *ext) | |||||
| 337 | { | |||||
| 338 | unsigned int n; | |||||
| 339 | INT16 len; | |||||
| 340 | INT16 min_len = sizeof(CARD8) | |||||
| 341 | + sizeof(CARD8) | |||||
| 342 | + sizeof(INT16); | |||||
| 343 | ||||||
| 344 | n = 0; | |||||
| 345 | while (total > min_len) { | |||||
| 346 | len = *((INT16 *)(&ext[2])); | |||||
| 347 | len += (min_len + XIM_PAD(len)((4 - ((len) % 4)) % 4)); | |||||
| 348 | total -= len; | |||||
| 349 | ext += len; | |||||
| 350 | n++; | |||||
| 351 | } | |||||
| 352 | return n; | |||||
| 353 | } | |||||
| 354 | ||||||
| 355 | static Boolint | |||||
| 356 | _XimParseExtensionList( | |||||
| 357 | Xim im, | |||||
| 358 | CARD16 *data) | |||||
| 359 | { | |||||
| 360 | int num = XIMNumber(extensions)((unsigned int) (sizeof(extensions) / sizeof(extensions[0]))) - 1; | |||||
| 361 | unsigned int n; | |||||
| 362 | CARD8 *buf; | |||||
| 363 | register int i; | |||||
| 364 | register int j; | |||||
| 365 | INT16 len; | |||||
| 366 | ||||||
| 367 | if (!(n = _XimCountNumberOfExtension(data[0], (CARD8 *)&data[1]))) | |||||
| 368 | return True1; | |||||
| 369 | ||||||
| 370 | buf = (CARD8 *)&data[1]; | |||||
| 371 | for (i = 0; i < n; i++) { | |||||
| 372 | len = *((INT16 *)(&buf[2])); | |||||
| 373 | for (j = 0; j < num; j++) { | |||||
| 374 | if (!(strncmp(extensions[j].name, (char *)&buf[4], len))) { | |||||
| 375 | extensions[j].major_opcode = buf[0]; | |||||
| 376 | extensions[j].minor_opcode = buf[1]; | |||||
| 377 | extensions[j].is_support = True1; | |||||
| 378 | break; | |||||
| 379 | } | |||||
| 380 | } | |||||
| 381 | len += sizeof(CARD8) /* sizeof major_opcode */ | |||||
| 382 | + sizeof(CARD8) /* sizeof minor_opcode */ | |||||
| 383 | + sizeof(INT16) /* sizeof length */ | |||||
| 384 | + XIM_PAD(len)((4 - ((len) % 4)) % 4); /* sizeof pad */ | |||||
| 385 | buf += len; | |||||
| 386 | } | |||||
| 387 | ||||||
| 388 | return True1; | |||||
| 389 | } | |||||
| 390 | ||||||
| 391 | static Boolint | |||||
| 392 | _XimQueryExtensionCheck( | |||||
| 393 | Xim im, | |||||
| 394 | INT16 len, | |||||
| 395 | XPointer data, | |||||
| 396 | XPointer arg) | |||||
| 397 | { | |||||
| 398 | CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZEsizeof(CARD8) + sizeof(CARD8) + sizeof(INT16)); | |||||
| 399 | CARD8 major_opcode = *((CARD8 *)data); | |||||
| 400 | CARD8 minor_opcode = *((CARD8 *)data + 1); | |||||
| 401 | XIMID imid = buf_s[0]; | |||||
| 402 | ||||||
| 403 | if ((major_opcode == XIM_QUERY_EXTENSION_REPLY41) | |||||
| 404 | && (minor_opcode == 0) | |||||
| 405 | && (imid == im->private.proto.imid)) | |||||
| 406 | return True1; | |||||
| 407 | if ((major_opcode == XIM_ERROR20) | |||||
| 408 | && (minor_opcode == 0) | |||||
| 409 | && (buf_s[2] & XIM_IMID_VALID0x0001) | |||||
| 410 | && (imid == im->private.proto.imid)) | |||||
| 411 | return True1; | |||||
| 412 | return False0; | |||||
| 413 | } | |||||
| 414 | ||||||
| 415 | Boolint | |||||
| 416 | _XimExtension( | |||||
| 417 | Xim im) | |||||
| 418 | { | |||||
| 419 | CARD8 *buf; | |||||
| 420 | CARD16 *buf_s; | |||||
| 421 | int buf_len; | |||||
| 422 | INT16 len; | |||||
| 423 | CARD32 reply32[BUFSIZE2048/4]; | |||||
| 424 | char *reply = (char *)reply32; | |||||
| 425 | XPointer preply; | |||||
| 426 | int buf_size; | |||||
| 427 | int ret_code; | |||||
| 428 | int idx; | |||||
| 429 | ||||||
| 430 | if (!(len = _XimCheckExtensionListSize())) | |||||
| ||||||
| 431 | return True1; | |||||
| 432 | ||||||
| 433 | buf_len = XIM_HEADER_SIZEsizeof(CARD8) + sizeof(CARD8) + sizeof(INT16) | |||||
| 434 | + sizeof(CARD16) | |||||
| 435 | + sizeof(INT16) | |||||
| 436 | + len | |||||
| 437 | + XIM_PAD(len)((4 - ((len) % 4)) % 4); | |||||
| 438 | ||||||
| 439 | if (!(buf = Xmalloc(buf_len)malloc(((buf_len) == 0 ? 1 : (buf_len))))) | |||||
| 440 | return False0; | |||||
| 441 | buf_s = (CARD16 *)&buf[XIM_HEADER_SIZEsizeof(CARD8) + sizeof(CARD8) + sizeof(INT16)]; | |||||
| 442 | ||||||
| 443 | buf_s[0] = im->private.proto.imid; /* imid */ | |||||
| 444 | buf_s[1] = len; /* length of Extensions */ | |||||
| 445 | _XimSetExtensionList((CARD8 *)&buf_s[2]); | |||||
| 446 | /* extensions supported */ | |||||
| 447 | XIM_SET_PAD(&buf_s[2], len){ register int Counter = ((4 - (((int)len) % 4)) % 4); if (Counter ) { register char *Ptr = (char *)(&buf_s[2]) + (len); len += Counter; for (; Counter; --Counter, ++Ptr) *Ptr = '\0'; } }; /* pad */ | |||||
| 448 | len += sizeof(CARD16) /* sizeof imid */ | |||||
| 449 | + sizeof(INT16); /* sizeof length of extensions */ | |||||
| 450 | ||||||
| 451 | _XimSetHeader((XPointer)buf, XIM_QUERY_EXTENSION40, 0, &len); | |||||
| 452 | if (!(_XimWrite(im, len, (XPointer)buf))) { | |||||
| 453 | XFree(buf); | |||||
| 454 | return False0; | |||||
| 455 | } | |||||
| 456 | XFree(buf); | |||||
| 457 | _XimFlush(im); | |||||
| 458 | buf_size = BUFSIZE2048; | |||||
| 459 | ret_code = _XimRead(im, &len, (XPointer)reply, buf_size, | |||||
| 460 | _XimQueryExtensionCheck, 0); | |||||
| 461 | if(ret_code == XIM_TRUE1) { | |||||
| 462 | preply = reply; | |||||
| 463 | } else if(ret_code == XIM_OVERFLOW(-1)) { | |||||
| 464 | if(len <= 0) { | |||||
| 465 | preply = reply; | |||||
| 466 | } else { | |||||
| 467 | buf_size = len; | |||||
| 468 | preply = Xmalloc(buf_size)malloc(((buf_size) == 0 ? 1 : (buf_size))); | |||||
| 469 | ret_code = _XimRead(im, &len, reply, buf_size, | |||||
| 470 | _XimQueryExtensionCheck, 0); | |||||
| 471 | if(ret_code != XIM_TRUE1) { | |||||
| 472 | Xfree(preply)free((preply)); | |||||
| 473 | return False0; | |||||
| 474 | } | |||||
| 475 | } | |||||
| 476 | } else | |||||
| 477 | return False0; | |||||
| 478 | buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZEsizeof(CARD8) + sizeof(CARD8) + sizeof(INT16)); | |||||
| 479 | if (*((CARD8 *)preply) == XIM_ERROR20) { | |||||
| 480 | _XimProcError(im, 0, (XPointer)&buf_s[3]); | |||||
| 481 | if(reply != preply) | |||||
| 482 | Xfree(preply)free((preply)); | |||||
| 483 | return False0; | |||||
| 484 | } | |||||
| 485 | ||||||
| 486 | if (!(_XimParseExtensionList(im, &buf_s[1]))) { | |||||
| 487 | if(reply != preply) | |||||
| 488 | Xfree(preply)free((preply)); | |||||
| 489 | return False0; | |||||
| 490 | } | |||||
| 491 | if(reply != preply) | |||||
| 492 | Xfree(preply)free((preply)); | |||||
| 493 | ||||||
| 494 | if ((idx = _XimIsSupportExt(XIM_EXT_SET_EVENT_MASK_IDX0)) >= 0) | |||||
| 495 | _XimRegProtoIntrCallback(im, | |||||
| 496 | extensions[idx].major_opcode, | |||||
| 497 | extensions[idx].minor_opcode, | |||||
| 498 | _XimExtSetEventMaskCallback, (XPointer)im); | |||||
| 499 | #ifdef EXT_FORWARD | |||||
| 500 | if ((idx = _XimIsSupportExt(XIM_EXT_FORWARD_KEYEVENT_IDX)) >= 0) | |||||
| 501 | _XimRegProtoIntrCallback(im, | |||||
| 502 | extensions[idx].major_opcode, | |||||
| 503 | extensions[idx].minor_opcode, | |||||
| 504 | _XimExtForwardKeyEventCallback, (XPointer)im); | |||||
| 505 | #endif | |||||
| 506 | ||||||
| 507 | return True1; | |||||
| 508 | } | |||||
| 509 | ||||||
| 510 | #ifdef EXT_MOVE | |||||
| 511 | /* flag of ExtenArgCheck */ | |||||
| 512 | #define EXT_XNSPOTLOCATION (1L<<0) | |||||
| 513 | ||||||
| 514 | /* macro for ExtenArgCheck */ | |||||
| 515 | #define SET_EXT_XNSPOTLOCATION(flag) (flag |= EXT_XNSPOTLOCATION) | |||||
| 516 | #define IS_EXT_XNSPOTLOCATION(flag) (flag & EXT_XNSPOTLOCATION) | |||||
| 517 | ||||||
| 518 | /* length of XPoint attribute */ | |||||
| 519 | #define XIM_Xpoint_length 12 | |||||
| 520 | ||||||
| 521 | static Boolint | |||||
| 522 | _XimExtMove( | |||||
| 523 | Xim im, | |||||
| 524 | Xic ic, | |||||
| 525 | CARD16 x, | |||||
| 526 | CARD16 y) | |||||
| 527 | { | |||||
| 528 | CARD32 buf32[BUFSIZE2048/4]; | |||||
| 529 | CARD8 *buf = (CARD8 *)buf32; | |||||
| 530 | CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZEsizeof(CARD8) + sizeof(CARD8) + sizeof(INT16)]; | |||||
| 531 | INT16 len; | |||||
| 532 | int idx; | |||||
| 533 | ||||||
| 534 | if ((idx = _XimIsSupportExt(XIM_EXT_MOVE_IDX)) < 0) | |||||
| 535 | return False0; | |||||
| 536 | ||||||
| 537 | buf_s[0] = im->private.proto.imid; /* imid */ | |||||
| 538 | buf_s[1] = ic->private.proto.icid; /* icid */ | |||||
| 539 | buf_s[2] = x; /* X */ | |||||
| 540 | buf_s[3] = y; /* Y */ | |||||
| 541 | len = sizeof(CARD16) /* sizeof imid */ | |||||
| 542 | + sizeof(CARD16) /* sizeof icid */ | |||||
| 543 | + sizeof(INT16) /* sizeof X */ | |||||
| 544 | + sizeof(INT16); /* sizeof Y */ | |||||
| 545 | ||||||
| 546 | _XimSetHeader((XPointer)buf, extensions[idx].major_opcode, | |||||
| 547 | extensions[idx].minor_opcode, &len); | |||||
| 548 | if (!(_XimWrite(im, len, (XPointer)buf))) | |||||
| 549 | return False0; | |||||
| 550 | _XimFlush(im); | |||||
| 551 | return True1; | |||||
| 552 | } | |||||
| 553 | ||||||
| 554 | BITMASK32 | |||||
| 555 | _XimExtenArgCheck( | |||||
| 556 | XIMArg *arg) | |||||
| 557 | { | |||||
| 558 | CARD32 flag = 0L; | |||||
| 559 | if (!strcmp(arg->name, XNSpotLocation"spotLocation")) | |||||
| 560 | SET_EXT_XNSPOTLOCATION(flag); | |||||
| 561 | return flag; | |||||
| 562 | } | |||||
| 563 | ||||||
| 564 | Boolint | |||||
| 565 | _XimExtenMove( | |||||
| 566 | Xim im, | |||||
| 567 | Xic ic, | |||||
| 568 | CARD32 flag, | |||||
| 569 | CARD16 *buf, | |||||
| 570 | INT16 length) | |||||
| 571 | { | |||||
| 572 | if ((IS_EXT_XNSPOTLOCATION(flag)) && (length == XIM_Xpoint_length)) | |||||
| 573 | return _XimExtMove(im, ic, buf[4], buf[5]); | |||||
| 574 | return False0; | |||||
| 575 | } | |||||
| 576 | #endif /* EXT_MOVE */ |