Despite the name, GCC objects at the strncpy use in safe_strncpy on
safety grounds.  While that seems to be a false positive, we could
just be using memcpy instead and side step this altogether.

Signed-off-by: Ahmad Fatoum <a.fat...@pengutronix.de>
---
 src/dt/common.h | 34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)

diff --git a/src/dt/common.h b/src/dt/common.h
index c3c4f53fc216..69a264cfc1a9 100644
--- a/src/dt/common.h
+++ b/src/dt/common.h
@@ -36,6 +36,12 @@ typedef uint64_t u64;
 #undef offsetof
 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 
+#define min(x, y) ({                           \
+       typeof(x) _min1 = (x);                  \
+       typeof(y) _min2 = (y);                  \
+       (void) (&_min1 == &_min2);              \
+       _min1 < _min2 ? _min1 : _min2; })
+
 struct device_d;
 
 void pr_level_set(int level);
@@ -199,14 +205,6 @@ static inline size_t DT_strlcpy(char *dest, const char 
*src, size_t size)
        return ret;
 }
 
-/* Like strncpy but make sure the resulting string is always 0 terminated. */
-static inline char * safe_strncpy(char *dst, const char *src, size_t size)
-{
-       if (!size) return dst;
-       dst[--size] = '\0';
-       return strncpy(dst, src, size);
-}
-
 static inline char *xstrdup(const char *s)
 {
        char *p = strdup(s);
@@ -415,21 +413,23 @@ static inline int dev_set_name(struct device_d *dev, 
const char *fmt, ...)
 {
        char newname[MAX_DRIVER_NAME];
        va_list vargs;
-       int err;
+       int ret;
 
        va_start(vargs, fmt);
-       err = vsnprintf(newname, MAX_DRIVER_NAME, fmt, vargs);
+       ret = vsnprintf(newname, MAX_DRIVER_NAME, fmt, vargs);
        va_end(vargs);
 
+       if (WARN_ON(ret < 0))
+               return ret;
+
        /*
         * Copy new name into dev structure, we do this after vsnprintf call in
         * case old device name was in one of vargs
         */
-       safe_strncpy(dev->name, newname, MAX_DRIVER_NAME);
+       memcpy(dev->name, newname, min(MAX_DRIVER_NAME - 1, ret));
+       dev->name[MAX_DRIVER_NAME - 1] = '\0';
 
-       WARN_ON(err < 0);
-
-       return err;
+       return 0;
 }
 
 struct driver_d;
@@ -577,12 +577,6 @@ static inline __u32 ror32(__u32 word, unsigned int shift)
        return (word >> shift) | (word << (32 - shift));
 }
 
-#define min(x, y) ({                           \
-       typeof(x) _min1 = (x);                  \
-       typeof(y) _min2 = (y);                  \
-       (void) (&_min1 == &_min2);              \
-       _min1 < _min2 ? _min1 : _min2; })
-
 /*
  * Helper macros to use CONFIG_ options in C expressions. Note that
  * these only work with boolean and tristate options.
-- 
2.39.2


Reply via email to