diff options
| author | Paul Eggert | 2014-12-27 12:00:29 -0800 |
|---|---|---|
| committer | Paul Eggert | 2014-12-27 12:01:46 -0800 |
| commit | 3d1afd119e3cdb96178dd838ef833414b894d8d8 (patch) | |
| tree | 888ca707872d124f5257c7a41066fc2fd06ed66f /src/xsettings.c | |
| parent | 0db7db3090df8d5afd5fda176511fea8656f1930 (diff) | |
| download | emacs-3d1afd119e3cdb96178dd838ef833414b894d8d8.tar.gz emacs-3d1afd119e3cdb96178dd838ef833414b894d8d8.zip | |
Fix parse_settings to match internal documentation
* xsettings.c (parse_settings): Return the number of settings seen.
Count the settings changes accurately.
(read_settings): Don't confuse number of settings changes with
the return code from XGetWindowProperty.
Diffstat (limited to 'src/xsettings.c')
| -rw-r--r-- | src/xsettings.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/src/xsettings.c b/src/xsettings.c index afdeab9f206..066f426d241 100644 --- a/src/xsettings.c +++ b/src/xsettings.c | |||
| @@ -404,7 +404,7 @@ parse_settings (unsigned char *prop, | |||
| 404 | 404 | ||
| 405 | /* First 4 bytes is a serial number, skip that. */ | 405 | /* First 4 bytes is a serial number, skip that. */ |
| 406 | 406 | ||
| 407 | if (bytes < 12) return BadLength; | 407 | if (bytes < 12) return settings_seen; |
| 408 | memcpy (&n_settings, prop+8, 4); | 408 | memcpy (&n_settings, prop+8, 4); |
| 409 | if (my_bo != that_bo) n_settings = bswap_32 (n_settings); | 409 | if (my_bo != that_bo) n_settings = bswap_32 (n_settings); |
| 410 | bytes_parsed = 12; | 410 | bytes_parsed = 12; |
| @@ -429,8 +429,8 @@ parse_settings (unsigned char *prop, | |||
| 429 | memcpy (&nlen, prop+bytes_parsed, 2); | 429 | memcpy (&nlen, prop+bytes_parsed, 2); |
| 430 | bytes_parsed += 2; | 430 | bytes_parsed += 2; |
| 431 | if (my_bo != that_bo) nlen = bswap_16 (nlen); | 431 | if (my_bo != that_bo) nlen = bswap_16 (nlen); |
| 432 | if (bytes_parsed+nlen > bytes) return BadLength; | 432 | if (bytes_parsed + nlen > bytes) return settings_seen; |
| 433 | to_cpy = nlen > 127 ? 127 : nlen; | 433 | to_cpy = min (nlen, sizeof name - 1); |
| 434 | memcpy (name, prop+bytes_parsed, to_cpy); | 434 | memcpy (name, prop+bytes_parsed, to_cpy); |
| 435 | name[to_cpy] = '\0'; | 435 | name[to_cpy] = '\0'; |
| 436 | 436 | ||
| @@ -438,20 +438,19 @@ parse_settings (unsigned char *prop, | |||
| 438 | bytes_parsed = PAD (bytes_parsed); | 438 | bytes_parsed = PAD (bytes_parsed); |
| 439 | 439 | ||
| 440 | bytes_parsed += 4; /* Skip serial for this value */ | 440 | bytes_parsed += 4; /* Skip serial for this value */ |
| 441 | if (bytes_parsed > bytes) return BadLength; | 441 | if (bytes_parsed > bytes) return settings_seen; |
| 442 | 442 | ||
| 443 | want_this = | 443 | want_this = strcmp (XSETTINGS_TOOL_BAR_STYLE, name) == 0; |
| 444 | #ifdef HAVE_XFT | 444 | #ifdef HAVE_XFT |
| 445 | (nlen > 6 && strncmp (name, "Xft/", 4) == 0) | 445 | if ((nlen > 6 && memcmp (name, "Xft/", 4) == 0) |
| 446 | || strcmp (XSETTINGS_FONT_NAME, name) == 0 | 446 | || strcmp (XSETTINGS_FONT_NAME, name) == 0) |
| 447 | || | 447 | want_this = true; |
| 448 | #endif | 448 | #endif |
| 449 | strcmp (XSETTINGS_TOOL_BAR_STYLE, name) == 0; | ||
| 450 | 449 | ||
| 451 | switch (type) | 450 | switch (type) |
| 452 | { | 451 | { |
| 453 | case 0: /* Integer */ | 452 | case 0: /* Integer */ |
| 454 | if (bytes_parsed+4 > bytes) return BadLength; | 453 | if (bytes_parsed + 4 > bytes) return settings_seen; |
| 455 | if (want_this) | 454 | if (want_this) |
| 456 | { | 455 | { |
| 457 | memcpy (&ival, prop+bytes_parsed, 4); | 456 | memcpy (&ival, prop+bytes_parsed, 4); |
| @@ -461,13 +460,13 @@ parse_settings (unsigned char *prop, | |||
| 461 | break; | 460 | break; |
| 462 | 461 | ||
| 463 | case 1: /* String */ | 462 | case 1: /* String */ |
| 464 | if (bytes_parsed+4 > bytes) return BadLength; | 463 | if (bytes_parsed + 4 > bytes) return settings_seen; |
| 465 | memcpy (&vlen, prop+bytes_parsed, 4); | 464 | memcpy (&vlen, prop+bytes_parsed, 4); |
| 466 | bytes_parsed += 4; | 465 | bytes_parsed += 4; |
| 467 | if (my_bo != that_bo) vlen = bswap_32 (vlen); | 466 | if (my_bo != that_bo) vlen = bswap_32 (vlen); |
| 468 | if (want_this) | 467 | if (want_this) |
| 469 | { | 468 | { |
| 470 | to_cpy = vlen > 127 ? 127 : vlen; | 469 | to_cpy = min (vlen, sizeof sval - 1); |
| 471 | memcpy (sval, prop+bytes_parsed, to_cpy); | 470 | memcpy (sval, prop+bytes_parsed, to_cpy); |
| 472 | sval[to_cpy] = '\0'; | 471 | sval[to_cpy] = '\0'; |
| 473 | } | 472 | } |
| @@ -477,17 +476,16 @@ parse_settings (unsigned char *prop, | |||
| 477 | 476 | ||
| 478 | case 2: /* RGB value */ | 477 | case 2: /* RGB value */ |
| 479 | /* No need to parse this */ | 478 | /* No need to parse this */ |
| 480 | if (bytes_parsed+8 > bytes) return BadLength; | 479 | if (bytes_parsed + 8 > bytes) return settings_seen; |
| 481 | bytes_parsed += 8; /* 4 values (r, b, g, alpha), 2 bytes each. */ | 480 | bytes_parsed += 8; /* 4 values (r, b, g, alpha), 2 bytes each. */ |
| 482 | break; | 481 | break; |
| 483 | 482 | ||
| 484 | default: /* Parse Error */ | 483 | default: /* Parse Error */ |
| 485 | return BadValue; | 484 | return settings_seen; |
| 486 | } | 485 | } |
| 487 | 486 | ||
| 488 | if (want_this) | 487 | if (want_this) |
| 489 | { | 488 | { |
| 490 | ++settings_seen; | ||
| 491 | if (strcmp (name, XSETTINGS_TOOL_BAR_STYLE) == 0) | 489 | if (strcmp (name, XSETTINGS_TOOL_BAR_STYLE) == 0) |
| 492 | { | 490 | { |
| 493 | dupstring (&settings->tb_style, sval); | 491 | dupstring (&settings->tb_style, sval); |
| @@ -557,6 +555,9 @@ parse_settings (unsigned char *prop, | |||
| 557 | settings->seen &= ~SEEN_LCDFILTER; | 555 | settings->seen &= ~SEEN_LCDFILTER; |
| 558 | } | 556 | } |
| 559 | #endif /* HAVE_XFT */ | 557 | #endif /* HAVE_XFT */ |
| 558 | else | ||
| 559 | want_this = false; | ||
| 560 | settings_seen += want_this; | ||
| 560 | } | 561 | } |
| 561 | } | 562 | } |
| 562 | 563 | ||
| @@ -576,6 +577,7 @@ read_settings (struct x_display_info *dpyinfo, struct xsettings *settings) | |||
| 576 | unsigned char *prop = NULL; | 577 | unsigned char *prop = NULL; |
| 577 | Display *dpy = dpyinfo->display; | 578 | Display *dpy = dpyinfo->display; |
| 578 | int rc; | 579 | int rc; |
| 580 | bool got_settings = false; | ||
| 579 | 581 | ||
| 580 | x_catch_errors (dpy); | 582 | x_catch_errors (dpy); |
| 581 | rc = XGetWindowProperty (dpy, | 583 | rc = XGetWindowProperty (dpy, |
| @@ -587,13 +589,13 @@ read_settings (struct x_display_info *dpyinfo, struct xsettings *settings) | |||
| 587 | 589 | ||
| 588 | if (rc == Success && prop != NULL && act_form == 8 && nitems > 0 | 590 | if (rc == Success && prop != NULL && act_form == 8 && nitems > 0 |
| 589 | && act_type == dpyinfo->Xatom_xsettings_prop) | 591 | && act_type == dpyinfo->Xatom_xsettings_prop) |
| 590 | rc = parse_settings (prop, nitems, settings); | 592 | got_settings = parse_settings (prop, nitems, settings) != 0; |
| 591 | 593 | ||
| 592 | XFree (prop); | 594 | XFree (prop); |
| 593 | 595 | ||
| 594 | x_uncatch_errors (); | 596 | x_uncatch_errors (); |
| 595 | 597 | ||
| 596 | return rc != 0; | 598 | return got_settings; |
| 597 | } | 599 | } |
| 598 | 600 | ||
| 599 | /* Apply Xft settings in SETTINGS to the Xft library. | 601 | /* Apply Xft settings in SETTINGS to the Xft library. |