aboutsummaryrefslogtreecommitdiffstats
path: root/src/xsettings.c
diff options
context:
space:
mode:
authorPaul Eggert2014-12-27 12:00:29 -0800
committerPaul Eggert2014-12-27 12:01:46 -0800
commit3d1afd119e3cdb96178dd838ef833414b894d8d8 (patch)
tree888ca707872d124f5257c7a41066fc2fd06ed66f /src/xsettings.c
parent0db7db3090df8d5afd5fda176511fea8656f1930 (diff)
downloademacs-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.c36
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.