0001-sparc64-avoid-stringop-overread-warning-to-access-Ma.patch 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. From 82d91965519c20639c24aadd022b2859461562bc Mon Sep 17 00:00:00 2001
  2. From: Romain Naour <romain.naour@gmail.com>
  3. Date: Tue, 27 Apr 2021 14:54:28 +0200
  4. Subject: [PATCH] sparc64: avoid stringop-overread warning to access Machine
  5. description datas
  6. gcc-11 warns about what appears to be an out-of-range array access but
  7. stop the build due to -Werror added to cflags:
  8. arch/sparc/kernel/mdesc.c: In function 'mdesc_node_by_name':
  9. arch/sparc/kernel/mdesc.c:647:22: error: 'strcmp' reading 1 or more bytes from a region of size 0 [-Werror=stringop-overread]
  10. 647 | if (!strcmp(names + ep[ret].name_offset, name))
  11. | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  12. arch/sparc/kernel/mdesc.c:77:33: note: at offset 16 into source object 'mdesc' of size 16
  13. 77 | struct mdesc_hdr mdesc;
  14. | ^~~~~
  15. arch/sparc/kernel/mdesc.c: In function 'mdesc_get_property':
  16. arch/sparc/kernel/mdesc.c:692:22: error: 'strcmp' reading 1 or more bytes from a region of size 0 [-Werror=stringop-overread]
  17. 692 | if (!strcmp(names + ep->name_offset, name)) {
  18. | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  19. arch/sparc/kernel/mdesc.c:77:33: note: at offset 16 into source object 'mdesc' of size 16
  20. 77 | struct mdesc_hdr mdesc;
  21. | ^~~~~
  22. arch/sparc/kernel/mdesc.c: In function 'mdesc_next_arc':
  23. arch/sparc/kernel/mdesc.c:719:21: error: 'strcmp' reading 1 or more bytes from a region of size 0 [-Werror=stringop-overread]
  24. 719 | if (strcmp(names + ep->name_offset, arc_type))
  25. | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  26. arch/sparc/kernel/mdesc.c:77:33: note: at offset 16 into source object 'mdesc' of size 16
  27. 77 | struct mdesc_hdr mdesc;
  28. | ^~~~~
  29. cc1: all warnings being treated as errors
  30. The issue was initially reported to gcc [1] where it was analized.
  31. As suggested, change the struct mdesc_elem * accesses from the end
  32. of mdesc to those from the beginning of the data array.
  33. Update the prototype of node_block(), name_block() and data_block()
  34. since the code really seems to want to do is to compute the address
  35. somewhere into the chunk pointed to by hp.
  36. [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100262
  37. Upstream status: Pending
  38. https://www.spinics.net/lists/sparclinux/msg26385.html
  39. Signed-off-by: Romain Naour <romain.naour@gmail.com>
  40. ---
  41. arch/sparc/kernel/mdesc.c | 37 +++++++++++++++++++++----------------
  42. 1 file changed, 21 insertions(+), 16 deletions(-)
  43. diff --git a/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c
  44. index 8e645ddac58e..3403555aa1e2 100644
  45. --- a/arch/sparc/kernel/mdesc.c
  46. +++ b/arch/sparc/kernel/mdesc.c
  47. @@ -75,6 +75,7 @@ struct mdesc_handle {
  48. refcount_t refcnt;
  49. unsigned int handle_size;
  50. struct mdesc_hdr mdesc;
  51. + char data[];
  52. };
  53. typedef int (*mdesc_node_info_get_f)(struct mdesc_handle *, u64,
  54. @@ -610,26 +611,30 @@ int mdesc_get_node_info(struct mdesc_handle *hp, u64 node,
  55. }
  56. EXPORT_SYMBOL(mdesc_get_node_info);
  57. -static struct mdesc_elem *node_block(struct mdesc_hdr *mdesc)
  58. +static struct mdesc_elem *node_block(struct mdesc_handle *hp)
  59. {
  60. - return (struct mdesc_elem *) (mdesc + 1);
  61. + return (struct mdesc_elem *) hp + offsetof(struct mdesc_handle, data);
  62. }
  63. -static void *name_block(struct mdesc_hdr *mdesc)
  64. +static void *name_block(struct mdesc_handle *hp)
  65. {
  66. - return ((void *) node_block(mdesc)) + mdesc->node_sz;
  67. + struct mdesc_hdr *mdesc = &hp->mdesc;
  68. +
  69. + return ((void *) node_block(hp)) + mdesc->node_sz;
  70. }
  71. -static void *data_block(struct mdesc_hdr *mdesc)
  72. +static void *data_block(struct mdesc_handle *hp)
  73. {
  74. - return ((void *) name_block(mdesc)) + mdesc->name_sz;
  75. + struct mdesc_hdr *mdesc = &hp->mdesc;
  76. +
  77. + return ((void *) name_block(hp)) + mdesc->name_sz;
  78. }
  79. u64 mdesc_node_by_name(struct mdesc_handle *hp,
  80. u64 from_node, const char *name)
  81. {
  82. - struct mdesc_elem *ep = node_block(&hp->mdesc);
  83. - const char *names = name_block(&hp->mdesc);
  84. + struct mdesc_elem *ep = node_block(hp);
  85. + const char *names = name_block(hp);
  86. u64 last_node = hp->mdesc.node_sz / 16;
  87. u64 ret;
  88. @@ -657,15 +662,15 @@ EXPORT_SYMBOL(mdesc_node_by_name);
  89. const void *mdesc_get_property(struct mdesc_handle *hp, u64 node,
  90. const char *name, int *lenp)
  91. {
  92. - const char *names = name_block(&hp->mdesc);
  93. + const char *names = name_block(hp);
  94. u64 last_node = hp->mdesc.node_sz / 16;
  95. - void *data = data_block(&hp->mdesc);
  96. + void *data = data_block(hp);
  97. struct mdesc_elem *ep;
  98. if (node == MDESC_NODE_NULL || node >= last_node)
  99. return NULL;
  100. - ep = node_block(&hp->mdesc) + node;
  101. + ep = node_block(hp) + node;
  102. ep++;
  103. for (; ep->tag != MD_NODE_END; ep++) {
  104. void *val = NULL;
  105. @@ -702,8 +707,8 @@ EXPORT_SYMBOL(mdesc_get_property);
  106. u64 mdesc_next_arc(struct mdesc_handle *hp, u64 from, const char *arc_type)
  107. {
  108. - struct mdesc_elem *ep, *base = node_block(&hp->mdesc);
  109. - const char *names = name_block(&hp->mdesc);
  110. + struct mdesc_elem *ep, *base = node_block(hp);
  111. + const char *names = name_block(hp);
  112. u64 last_node = hp->mdesc.node_sz / 16;
  113. if (from == MDESC_NODE_NULL || from >= last_node)
  114. @@ -728,7 +733,7 @@ EXPORT_SYMBOL(mdesc_next_arc);
  115. u64 mdesc_arc_target(struct mdesc_handle *hp, u64 arc)
  116. {
  117. - struct mdesc_elem *ep, *base = node_block(&hp->mdesc);
  118. + struct mdesc_elem *ep, *base = node_block(hp);
  119. ep = base + arc;
  120. @@ -738,8 +743,8 @@ EXPORT_SYMBOL(mdesc_arc_target);
  121. const char *mdesc_node_name(struct mdesc_handle *hp, u64 node)
  122. {
  123. - struct mdesc_elem *ep, *base = node_block(&hp->mdesc);
  124. - const char *names = name_block(&hp->mdesc);
  125. + struct mdesc_elem *ep, *base = node_block(hp);
  126. + const char *names = name_block(hp);
  127. u64 last_node = hp->mdesc.node_sz / 16;
  128. if (node == MDESC_NODE_NULL || node >= last_node)
  129. --
  130. 2.30.2