diff --git a/test/ipc/unixsocket.cpp b/test/ipc/unixsocket.cpp
index 5348f35..7bc6a89 100644
--- a/test/ipc/unixsocket.cpp
+++ b/test/ipc/unixsocket.cpp
@@ -16,6 +16,7 @@
 #include <unistd.h>
 
 #include <libcamera/event_dispatcher.h>
+#include <libcamera/file_descriptor.h>
 #include <libcamera/timer.h>
 
 #include "ipc_unixsocket.h"
@@ -467,18 +468,22 @@ private:
 		if (fd < 0)
 			return fd;
 
+		FileDescriptor file_desc = FileDescriptor(fd);
+		close(fd);
+		if (file_desc.fd() < 0)
+			return file_desc.fd();
+
 		int size = 0;
 		for (unsigned int i = 0; i < num; i++) {
-			int clone = dup(fd);
-			if (clone < 0)
-				return clone;
+			FileDescriptor *clone = new FileDescriptor(file_desc.fd());
+			int clone_int = clone->fd();
+			if (clone_int < 0)
+				return clone_int;
 
-			size += calculateLength(clone);
-			message->fds.push_back(clone);
+			size += calculateLength(clone_int);
+			message->fds.push_back(clone_int);
 		}
 
-		close(fd);
-
 		return size;
 	}
 
