0002-tools-i2cbusses-Check-the-return-value-of-snprintf.patch 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. From d062793e7aebde3ffee796dfd4180716632ae444 Mon Sep 17 00:00:00 2001
  2. From: Jean Delvare <jdelvare@suse.de>
  3. Date: Wed, 8 Nov 2017 22:17:43 +0100
  4. Subject: [PATCH 2/3] tools: i2cbusses: Check the return value of snprintf
  5. MIME-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. It's very unlikely that these paths will ever be truncated, but
  9. better safe than sorry.
  10. Suggested by Uwe Kleine-König.
  11. ---
  12. tools/i2cbusses.c | 34 ++++++++++++++++++++++++++++------
  13. 1 file changed, 28 insertions(+), 6 deletions(-)
  14. diff --git a/tools/i2cbusses.c b/tools/i2cbusses.c
  15. index cb78cc7..41f5b6b 100644
  16. --- a/tools/i2cbusses.c
  17. +++ b/tools/i2cbusses.c
  18. @@ -137,7 +137,7 @@ struct i2c_adap *gather_i2c_busses(void)
  19. FILE *f;
  20. char fstype[NAME_MAX], sysfs[NAME_MAX], n[NAME_MAX];
  21. int foundsysfs = 0;
  22. - int count=0;
  23. + int len, count = 0;
  24. struct i2c_adap *adapters;
  25. adapters = calloc(BUNCH, sizeof(struct i2c_adap));
  26. @@ -220,18 +220,32 @@ struct i2c_adap *gather_i2c_busses(void)
  27. /* this should work for kernels 2.6.5 or higher and */
  28. /* is preferred because is unambiguous */
  29. - snprintf(n, NAME_MAX, "%s/%s/name", sysfs, de->d_name);
  30. + len = snprintf(n, NAME_MAX, "%s/%s/name", sysfs, de->d_name);
  31. + if (len >= NAME_MAX) {
  32. + fprintf(stderr, "%s: path truncated\n", n);
  33. + continue;
  34. + }
  35. f = fopen(n, "r");
  36. /* this seems to work for ISA */
  37. if(f == NULL) {
  38. - snprintf(n, NAME_MAX, "%s/%s/device/name", sysfs, de->d_name);
  39. + len = snprintf(n, NAME_MAX, "%s/%s/device/name", sysfs,
  40. + de->d_name);
  41. + if (len >= NAME_MAX) {
  42. + fprintf(stderr, "%s: path truncated\n", n);
  43. + continue;
  44. + }
  45. f = fopen(n, "r");
  46. }
  47. /* non-ISA is much harder */
  48. /* and this won't find the correct bus name if a driver
  49. has more than one bus */
  50. if(f == NULL) {
  51. - snprintf(n, NAME_MAX, "%s/%s/device", sysfs, de->d_name);
  52. + len = snprintf(n, NAME_MAX, "%s/%s/device", sysfs,
  53. + de->d_name);
  54. + if (len >= NAME_MAX) {
  55. + fprintf(stderr, "%s: path truncated\n", n);
  56. + continue;
  57. + }
  58. if(!(ddir = opendir(n)))
  59. continue;
  60. while ((dde = readdir(ddir)) != NULL) {
  61. @@ -240,8 +254,16 @@ struct i2c_adap *gather_i2c_busses(void)
  62. if (!strcmp(dde->d_name, ".."))
  63. continue;
  64. if ((!strncmp(dde->d_name, "i2c-", 4))) {
  65. - snprintf(n, NAME_MAX, "%s/%s/device/%s/name",
  66. - sysfs, de->d_name, dde->d_name);
  67. + len = snprintf(n, NAME_MAX,
  68. + "%s/%s/device/%s/name",
  69. + sysfs, de->d_name,
  70. + dde->d_name);
  71. + if (len >= NAME_MAX) {
  72. + fprintf(stderr,
  73. + "%s: path truncated\n",
  74. + n);
  75. + continue;
  76. + }
  77. if((f = fopen(n, "r")))
  78. goto found;
  79. }
  80. --
  81. 2.14.3