diff --git a/utils/utils.c b/utils/utils.c
index f6da457c98a78496434e71c965f52e32d76ec249..7a5acc1db0e4641f7e9b677f49ce19a65e59a0b9 100644
--- a/utils/utils.c
+++ b/utils/utils.c
@@ -214,6 +214,13 @@ int resolve_link(const char *prefix, char *path, char *dir)
 
     rv = readlinkat( dfd, path, rl, sizeof(rl) );
 
+    if( rv == sizeof(rl) )
+    {
+        // Either rl was truncated, or there is no longer space for '\0'
+        rv = -1;
+        goto out;
+    }
+
     if( rv >= 0 )
     {
         rl[ rv ] = '\0';
@@ -222,6 +229,12 @@ int resolve_link(const char *prefix, char *path, char *dir)
         {
             const int pl = strlen( prefix );
 
+            if( pl + rv > PATH_MAX )
+            {
+                rv = -1;
+                goto out;
+            }
+
             safe_strncpy( path, prefix, PATH_MAX );
             safe_strncpy( path + pl, rl, PATH_MAX - pl );
         }
@@ -229,12 +242,19 @@ int resolve_link(const char *prefix, char *path, char *dir)
         {
             const int pl = strlen( dir );
 
+            if( pl + rv + 1 > PATH_MAX )
+            {
+                rv = -1;
+                goto out;
+            }
+
             safe_strncpy( path, dir, PATH_MAX );
             path[ pl ] = '/';
             safe_strncpy( path + pl + 1, rl, PATH_MAX - pl - 1 );
         }
     }
 
+out:
     close( dfd );
 
     return rv != -1;