diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index cea9ad7bcf..a6eb3127e2 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -978,19 +978,18 @@ std::variant BSD_USA::DuplicateSocketImpl(s32 fd) { if (!IsFileDescriptorValid(fd)) { return Network::Errno::E_BADF; } - - const s32 new_fd = FindFreeFileDescriptorHandle(); - if (!IsFileDescriptorValid(new_fd)) { + // Don't use IsFileDescriptorValid as new_fd isn't a proper handle yet + if (s32 const new_fd = FindFreeFileDescriptorHandle(); new_fd >= 0) { + file_descriptors[new_fd] = FileDescriptor{ + .socket = file_descriptors[fd]->socket, + .flags = file_descriptors[fd]->flags, + .is_connection_based = file_descriptors[fd]->is_connection_based, + }; + return new_fd; + } else { LOG_ERROR(Service, "No more file descriptors available"); return Network::Errno::E_MFILE; } - - file_descriptors[new_fd] = FileDescriptor{ - .socket = file_descriptors[fd]->socket, - .flags = file_descriptors[fd]->flags, - .is_connection_based = file_descriptors[fd]->is_connection_based, - }; - return new_fd; } std::optional> BSD_USA::GetSocket(s32 fd) {