0002-lib-colors-use-static-buffers-when-parse-scheme.patch 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. From 6508db29ded734ac4ff5e5e19486c143c9eb3d89 Mon Sep 17 00:00:00 2001
  2. From: Karel Zak <[email protected]>
  3. Date: Fri, 21 Nov 2014 12:23:47 +0100
  4. Subject: [PATCH] lib/colors: use static buffers when parse scheme
  5. * use static buffers when parse scheme colors
  6. * cleanup deallocation on error in sequence parser
  7. Signed-off-by: Karel Zak <[email protected]>
  8. ---
  9. This is modified upstream patch.
  10. --- a/lib/colors.c
  11. +++ b/lib/colors.c
  12. @@ -416,28 +416,31 @@ static int colors_add_scheme(struct ul_c
  13. char *name,
  14. char *seq0)
  15. {
  16. - struct ul_color_scheme *cs;
  17. - char *seq;
  18. + struct ul_color_scheme *cs = NULL;
  19. + char *seq = NULL;
  20. int rc;
  21. if (!cc || !name || !*name || !seq0 || !*seq0)
  22. return -EINVAL;
  23. rc = cn_sequence(seq0, &seq);
  24. - free(seq0);
  25. if (rc)
  26. return rc;
  27. + rc = -ENOMEM;
  28. +
  29. /* convert logical name (e.g. "red") to real ESC code */
  30. if (isalpha(*seq)) {
  31. const char *s = color_sequence_from_colorname(seq);
  32. char *p;
  33. - if (!s)
  34. - return -EINVAL;
  35. + if (!s) {
  36. + rc = -EINVAL;
  37. + goto err;
  38. + }
  39. p = strdup(s);
  40. if (!p)
  41. - return -ENOMEM;
  42. + goto err;
  43. free(seq);
  44. seq = p;
  45. }
  46. @@ -447,17 +450,28 @@ static int colors_add_scheme(struct ul_c
  47. void *tmp = realloc(cc->schemes, (cc->nschemes + 10)
  48. * sizeof(struct ul_color_scheme));
  49. if (!tmp)
  50. - return -ENOMEM;
  51. + goto err;
  52. cc->schemes = tmp;
  53. cc->schemes_sz = cc->nschemes + 10;
  54. }
  55. /* add a new item */
  56. - cs = &cc->schemes[cc->nschemes++];
  57. - cs->name = name;
  58. + cs = &cc->schemes[cc->nschemes];
  59. cs->seq = seq;
  60. + cs->name = strdup(name);
  61. + if (!cs->name)
  62. + goto err;
  63. + cc->nschemes++;
  64. return 0;
  65. +err:
  66. + if (cs) {
  67. + free(cs->seq);
  68. + free(cs->name);
  69. + cs->seq = cs->name = NULL;
  70. + } else
  71. + free(seq);
  72. + return rc;
  73. }
  74. /*
  75. @@ -543,7 +557,8 @@ static int colors_read_schemes(struct ul
  76. {
  77. int rc = 0;
  78. FILE *f = NULL;
  79. - char buf[BUFSIZ];
  80. + char buf[BUFSIZ],
  81. + cn[129], seq[129];
  82. if (!cc->configured)
  83. rc = colors_read_configuration(cc);
  84. @@ -560,7 +575,6 @@ static int colors_read_schemes(struct ul
  85. }
  86. while (fgets(buf, sizeof(buf), f)) {
  87. - char *cn = NULL, *seq = NULL;
  88. char *p = strchr(buf, '\n');
  89. if (!p) {
  90. @@ -576,17 +590,14 @@ static int colors_read_schemes(struct ul
  91. if (*p == '\0' || *p == '#')
  92. continue;
  93. - rc = sscanf(p, UL_SCNsA" " /* name */
  94. - UL_SCNsA, /* color */
  95. - &cn, &seq);
  96. - if (rc == 2 && cn && seq)
  97. + rc = sscanf(p, "%128[^ ] %128[^\n ]", cn, seq);
  98. + if (rc == 2 && *cn && *seq) {
  99. rc = colors_add_scheme(cc, cn, seq); /* set rc=0 on success */
  100. - if (rc) {
  101. - free(cn);
  102. - free(seq);
  103. + if (rc)
  104. + goto done;
  105. }
  106. - rc = 0;
  107. }
  108. + rc = 0;
  109. done:
  110. if (f)