]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/memory-util: introduce mempcpy_typesafe
authorMike Yuan <me@yhndnzj.com>
Thu, 19 Sep 2024 21:08:42 +0000 (23:08 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 19 Sep 2024 23:29:35 +0000 (08:29 +0900)
src/basic/memory-util.h
src/coredump/coredump.c
src/journal/journald-audit.c
src/journal/journald-server.c
src/sysupdate/sysupdate-cache.c
src/timedate/timedated.c
src/tmpfiles/tmpfiles.c

index 294aed67dff30d1a020f00a55e602a6345af8990..2e10d33bb3f0b11efce4b08585f4832965863114 100644 (file)
@@ -20,7 +20,7 @@ size_t page_size(void) _pure_;
 #define PAGE_OFFSET_U64(l)     ALIGN_OFFSET_U64(l, page_size())
 
 /* Normal memcpy() requires src to be nonnull. We do nothing if n is 0. */
-static inline void *memcpy_safe(void *dst, const void *src, size_t n) {
+static inline voidmemcpy_safe(void *dst, const void *src, size_t n) {
         if (n == 0)
                 return dst;
         assert(src);
@@ -28,13 +28,15 @@ static inline void *memcpy_safe(void *dst, const void *src, size_t n) {
 }
 
 /* Normal mempcpy() requires src to be nonnull. We do nothing if n is 0. */
-static inline void *mempcpy_safe(void *dst, const void *src, size_t n) {
+static inline voidmempcpy_safe(void *dst, const void *src, size_t n) {
         if (n == 0)
                 return dst;
         assert(src);
         return mempcpy(dst, src, n);
 }
 
+#define mempcpy_typesafe(dst, src, n) (typeof((dst)[0])*) mempcpy_safe(dst, src, n)
+
 /* Normal memcmp() requires s1 and s2 to be nonnull. We do nothing if n is 0. */
 static inline int memcmp_safe(const void *s1, const void *s2, size_t n) {
         if (n == 0)
index fdf30a33f1a23a1d08e8ae6a921e9e198fb4dcff..4a01fea5f95383451d33ce7762a221294d8d6c0d 100644 (file)
@@ -1366,7 +1366,7 @@ static int gather_pid_metadata_from_procfs(struct iovec_wrapper *iovw, Context *
                 char *buf = malloc(strlen("COREDUMP_PROC_AUXV=") + size + 1);
                 if (buf) {
                         /* Add a dummy terminator to make save_context() happy. */
-                        *((uint8_t*) mempcpy(stpcpy(buf, "COREDUMP_PROC_AUXV="), t, size)) = '\0';
+                        *mempcpy_typesafe(stpcpy(buf, "COREDUMP_PROC_AUXV="), t, size) = '\0';
                         (void) iovw_consume(iovw, buf, size + strlen("COREDUMP_PROC_AUXV="));
                 }
 
index d49283d225cab52681fd3f15a3b554047c2d7193..55f8ce71402e6e22b6619e28cdbe66bd9654f31e 100644 (file)
@@ -87,7 +87,7 @@ static int map_string_field_internal(
                 if (!c)
                         return -ENOMEM;
 
-                *((char*) mempcpy(stpcpy(c, field), s, e - s)) = 0;
+                *mempcpy_typesafe(stpcpy(c, field), s, e - s) = 0;
 
                 e += 1;
 
index 859e5366d0d080ebc58f00cb43f1d8d4fa898fe4..9377ff8c7953850ffc82997eef15d98ba8596447 100644 (file)
@@ -1066,13 +1066,13 @@ static void server_write_to_journal(
                 iovec[n++] = IOVEC_MAKE_STRING(k);                      \
         }
 
-#define IOVEC_ADD_SIZED_FIELD(iovec, n, value, value_size, field)       \
-        if (value_size > 0) {                                           \
-                char *k;                                                \
-                k = newa(char, STRLEN(field "=") + value_size + 1);     \
-                *((char*) mempcpy(stpcpy(k, field "="), value, value_size)) = 0; \
-                iovec[n++] = IOVEC_MAKE_STRING(k);                      \
-        }                                                               \
+#define IOVEC_ADD_SIZED_FIELD(iovec, n, value, value_size, field)               \
+        if (value_size > 0) {                                                   \
+                char *k;                                                        \
+                k = newa(char, STRLEN(field "=") + value_size + 1);             \
+                *mempcpy_typesafe(stpcpy(k, field "="), value, value_size) = 0; \
+                iovec[n++] = IOVEC_MAKE_STRING(k);                              \
+        }
 
 static void server_dispatch_message_real(
                 Server *s,
index 8dad3ee479f72634ed76b567afd7344567e45dec..bc3a62bbb21ae6cc13d3f7eeffc0c00d4c780533 100644 (file)
@@ -62,7 +62,7 @@ int web_cache_add_item(
         };
 
         /* Just to be extra paranoid, let's NUL terminate the downloaded buffer */
-        *(uint8_t*) mempcpy(item->data, data, size) = 0;
+        *mempcpy_typesafe(item->data, data, size) = 0;
 
         web_cache_item_free(hashmap_remove(*web_cache, url));
 
index 58e8a0a0dfc3ee8e3ed8fe1baf7f7aaade5a240a..ea99a77c85f10362a27d223ecc7a435ee52171df 100644 (file)
@@ -380,7 +380,7 @@ static int context_write_data_local_rtc(Context *c) {
                 if (!w)
                         return -ENOMEM;
 
-                *(char*) mempcpy(stpcpy(stpcpy(mempcpy(w, s, a), prepend), c->local_rtc ? "LOCAL" : "UTC"), e, b) = 0;
+                *mempcpy_typesafe(stpcpy(stpcpy(mempcpy(w, s, a), prepend), c->local_rtc ? "LOCAL" : "UTC"), e, b) = 0;
 
                 if (streq(w, NULL_ADJTIME_UTC)) {
                         if (unlink("/etc/adjtime") < 0)
index 16f831bc2624550ab920716c82d29ef7173a2f33..12fb5f50f038aad00163613da9ab5738cab53ac5 100644 (file)
@@ -2756,7 +2756,7 @@ static int mkdir_parents_rm_if_wrong_type(mode_t child_mode, const char *path) {
                 e = s + strcspn(s, "/");
 
                 /* Copy the path component to t so it can be a null terminated string. */
-                *((char*) mempcpy(t, s, e - s)) = 0;
+                *mempcpy_typesafe(t, s, e - s) = 0;
 
                 /* Is this the last component? If so, then check the type */
                 if (*e == 0)