diff options
| author | Paul Eggert | 2014-09-07 12:47:28 -0700 |
|---|---|---|
| committer | Paul Eggert | 2014-09-07 12:47:28 -0700 |
| commit | bee407185922627a073b5fb57daae56043e689b0 (patch) | |
| tree | fd2058485b8633e7698d84e0aeaa1ba63ec556ac /src | |
| parent | eee8ec84426af080d82f37ab0280bd96ae6091bd (diff) | |
| download | emacs-bee407185922627a073b5fb57daae56043e689b0.tar.gz emacs-bee407185922627a073b5fb57daae56043e689b0.zip | |
Adjust drag-and-drop fix when window is above top.
* xselect.c (x_fill_property_data): Don't let sign bit of negative
XCDR bleed into XCAR's encoded value. Improve checks for
out-of-range data while we're at it.
Fixes: debbugs:18383
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 7 | ||||
| -rw-r--r-- | src/xselect.c | 20 |
2 files changed, 16 insertions, 11 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index ef130f8217e..777dcd81af2 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,10 @@ | |||
| 1 | 2014-09-07 Paul Eggert <eggert@cs.ucla.edu> | ||
| 2 | |||
| 3 | Adjust drag-and-drop fix when window is above top (Bug#18303). | ||
| 4 | * xselect.c (x_fill_property_data): Don't let sign bit of negative | ||
| 5 | XCDR bleed into XCAR's encoded value. Improve checks for | ||
| 6 | out-of-range data while we're at it. | ||
| 7 | |||
| 1 | 2014-09-07 Jan Djärv <jan.h.d@swipnet.se> | 8 | 2014-09-07 Jan Djärv <jan.h.d@swipnet.se> |
| 2 | 9 | ||
| 3 | * xselect.c (x_fill_property_data): Handle negative XCDR when data | 10 | * xselect.c (x_fill_property_data): Handle negative XCDR when data |
diff --git a/src/xselect.c b/src/xselect.c index ed359849be4..6a54b397626 100644 --- a/src/xselect.c +++ b/src/xselect.c | |||
| @@ -2300,22 +2300,20 @@ x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, int format) | |||
| 2300 | 2300 | ||
| 2301 | if (INTEGERP (o) || FLOATP (o) || CONSP (o)) | 2301 | if (INTEGERP (o) || FLOATP (o) || CONSP (o)) |
| 2302 | { | 2302 | { |
| 2303 | if (CONSP (o) && INTEGERP (XCAR (o)) && INTEGERP (XCDR (o))) | 2303 | if (CONSP (o) |
| 2304 | && RANGED_INTEGERP (X_LONG_MIN >> 16, XCAR (o), X_LONG_MAX >> 16) | ||
| 2305 | && RANGED_INTEGERP (- (1 << 15), XCDR (o), -1)) | ||
| 2304 | { | 2306 | { |
| 2305 | intmax_t v1 = XINT (XCAR (o)); | 2307 | long v1 = XINT (XCAR (o)); |
| 2306 | intmax_t v2 = XINT (XCDR (o)); | 2308 | long v2 = XINT (XCDR (o)); |
| 2307 | /* cons_to_signed does not handle negative values for v2. | 2309 | /* cons_to_signed does not handle negative values for v2. |
| 2308 | For XDnd, v2 might be y of a window, and can be negative. | 2310 | For XDnd, v2 might be y of a window, and can be negative. |
| 2309 | The XDnd spec. is not explicit about negative values, | 2311 | The XDnd spec. is not explicit about negative values, |
| 2310 | but lets do what it says. | 2312 | but let's assume negative v2 is sent modulo 2**16. */ |
| 2311 | */ | 2313 | val = (v1 << 16) | (v2 & 0xffff); |
| 2312 | if (v1 < 0 || v2 < 0) | ||
| 2313 | val = (v1 << 16) | v2; | ||
| 2314 | else | ||
| 2315 | val = cons_to_signed (o, LONG_MIN, LONG_MAX); | ||
| 2316 | } | 2314 | } |
| 2317 | else | 2315 | else |
| 2318 | val = cons_to_signed (o, LONG_MIN, LONG_MAX); | 2316 | val = cons_to_signed (o, X_LONG_MIN, X_LONG_MAX); |
| 2319 | } | 2317 | } |
| 2320 | else if (STRINGP (o)) | 2318 | else if (STRINGP (o)) |
| 2321 | { | 2319 | { |
| @@ -2335,7 +2333,7 @@ x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, int format) | |||
| 2335 | } | 2333 | } |
| 2336 | else if (format == 16) | 2334 | else if (format == 16) |
| 2337 | { | 2335 | { |
| 2338 | if (SHRT_MIN <= val && val <= SHRT_MAX) | 2336 | if (X_SHRT_MIN <= val && val <= X_SHRT_MAX) |
| 2339 | *d16++ = val; | 2337 | *d16++ = val; |
| 2340 | else | 2338 | else |
| 2341 | error ("Out of 'short' range"); | 2339 | error ("Out of 'short' range"); |