summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Wilck <mwilck@suse.com>2017-08-14 22:12:38 +0200
committerAlexander Grund <flamefire89@gmail.com>2024-03-07 18:16:35 +0100
commit02205a347c40cfbcc5ce34e4ecd63ea821221237 (patch)
tree54bacd8a6ecec295837c5babad40c58195fa74b9
parent730045698af7aca1b622d9147d6ac66eb615c2ee (diff)
BACKPORT: string.h: add memcpy_and_pad()
commit 01f33c336e2d298ea5d4ce5d6e5bcd12865cc30f upstream. This helper function is useful for the nvme subsystem, and maybe others. Note: the warnings reported by the kbuild test robot for this patch are actually generated by the use of CONFIG_PROFILE_ALL_BRANCHES together with __FORTIFY_INLINE. Change-Id: I5f7e1e9143ce9df88af0afd02aef971d5172bd3e Signed-off-by: Martin Wilck <mwilck@suse.com> Reviewed-by: Sagi Grimberg <sagi@grimbeg.me> Signed-off-by: Christoph Hellwig <hch@lst.de> [AG: Backported to 4.4] Signed-off-by: Alexander Grund <theflamefire89@gmail.com>
-rw-r--r--include/linux/string.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/include/linux/string.h b/include/linux/string.h
index 1a9589a5ace6..84af888924e1 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -204,4 +204,33 @@ static inline const char *kbasename(const char *path)
return tail ? tail + 1 : path;
}
+/**
+ * memcpy_and_pad - Copy one buffer to another with padding
+ * @dest: Where to copy to
+ * @dest_len: The destination buffer size
+ * @src: Where to copy from
+ * @count: The number of bytes to copy
+ * @pad: Character to use for padding if space is left in destination.
+ */
+__FORTIFY_INLINE void memcpy_and_pad(void *dest, size_t dest_len,
+ const void *src, size_t count, int pad)
+{
+ size_t dest_size = __builtin_object_size(dest, 0);
+ size_t src_size = __builtin_object_size(src, 0);
+
+ if (__builtin_constant_p(dest_len) && __builtin_constant_p(count)) {
+ if (dest_size < dest_len && dest_size < count)
+ __write_overflow();
+ else if (src_size < dest_len && src_size < count)
+ __read_overflow3();
+ }
+ if (dest_size < dest_len)
+ fortify_panic(__func__);
+ if (dest_len > count) {
+ memcpy(dest, src, count);
+ memset(dest + count, pad, dest_len - count);
+ } else
+ memcpy(dest, src, dest_len);
+}
+
#endif /* _LINUX_STRING_H_ */