git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 1/3] do full type check in COPY_ARRAY and MOVE_ARRAY

From
René Scharfe <l.s.r@web.de>
Date
Dec 30, 2022, 21:56 UTC
Message-ID
<f3b9e9be-06ef-3773-a496-da5e479f9d49@web.de>
In-Reply-To
<efe7ec20-201e-a1c1-8e16-2f714a0aee8e@web.de>

Extend the element size comparison between source and destination with a full type check using an assignment. It is not actually evaluated and even optimized out, but compilers check the types before getting to that point, and report mismatches.

The stricter check improves safety, as it catches attempts to copy between different types that happen to have the same size. The size check is still needed to avoid allowing copies from a array with a smaller element type to a bigger one, e.g. from a char array to an int array, which would be allowed by the assignment check alone.

Signed-off-by: René Scharfe <l.s.r@web.de>
---
 git-compat-util.h | 2 ++
 1 file changed, 2 insertions(+)
diff --git a/git-compat-util.h b/git-compat-util.h
index 76e4b11131..8d04832988 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -1094,6 +1094,7 @@ int xstrncmpz(const char *s, const char *t, size_t len);
 #define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc)))

 #define COPY_ARRAY(dst, src, n) copy_array((dst), (src), (n), sizeof(*(dst)) + \
+	(0 ? (*(dst) = *(src), 0) : 0) + \
 	BUILD_ASSERT_OR_ZERO(sizeof(*(dst)) == sizeof(*(src))))
 static inline void copy_array(void *dst, const void *src, size_t n, size_t size)
 {
@@ -1102,6 +1103,7 @@ static inline void copy_array(void *dst, const void *src, size_t n, size_t size)
 }

 #define MOVE_ARRAY(dst, src, n) move_array((dst), (src), (n), sizeof(*(dst)) + \
+	(0 ? (*(dst) = *(src), 0) : 0) + \
 	BUILD_ASSERT_OR_ZERO(sizeof(*(dst)) == sizeof(*(src))))
 static inline void move_array(void *dst, const void *src, size_t n, size_t size)
 {
--
2.39.0
Previous: René ScharfeNext: Junio C Hamano
Message 2 of 20 in “COPY_ARRAY, MOVE_ARRAY, DUP_ARRAY”
  1. 0/3 COPY_ARRAY, MOVE_ARRAY, DUP_ARRAYRené Scharfe, Dec 30, 2022
  2. 1/3 do full type check in COPY_ARRAY and MOVE_ARRAYRené Scharfe, Dec 30, 2022
  3. Junio C HamanoJan 1, 2023
  4. Junio C HamanoJan 1, 2023
  5. René ScharfeJan 1, 2023
  6. René ScharfeJan 1, 2023
  7. Junio C HamanoJan 1, 2023
  8. René ScharfeJan 1, 2023
  9. Junio C HamanoJan 1, 2023
  10. 2/3 add DUP_ARRAYRené Scharfe, Dec 30, 2022
  11. 3/3 use DUP_ARRAYRené Scharfe, Dec 30, 2022
  12. 0/4 COPY_ARRAY, MOVE_ARRAY, DUP_ARRAYRené Scharfe, Jan 1, 2023
  13. 1/4 factor out BARF_UNLESS_COPYABLERené Scharfe, Jan 1, 2023
  14. 2/4 do full type check in BARF_UNLESS_COPYABLERené Scharfe, Jan 1, 2023
  15. Junio C HamanoJan 8, 2023
  16. René ScharfeJan 8, 2023
  17. Junio C HamanoJan 9, 2023
  18. Jeff HostetlerJan 9, 2023
  19. 3/4 add DUP_ARRAYRené Scharfe, Jan 1, 2023
  20. 4/4 use DUP_ARRAYRené Scharfe, Jan 1, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.