1
0
Fork 0

soc_u: Prevent undefined behavior with CTRPollFD

This class is memcpy-ed and memcpy has the requirement that data passed
to it must be trivially copyable, otherwise the behavior is undefined.

This is trivial to resolve as BitField was made trivially copyable a
while ago, so this explicit copy assignment operator isn't necessary.
This commit is contained in:
Lioncash 2020-05-01 22:27:08 -04:00
parent 2476532f21
commit a32ad7f1f2
1 changed files with 3 additions and 5 deletions

View File

@ -4,6 +4,7 @@
#include <algorithm> #include <algorithm>
#include <cstring> #include <cstring>
#include <type_traits>
#include <vector> #include <vector>
#include "common/archives.h" #include "common/archives.h"
#include "common/assert.h" #include "common/assert.h"
@ -199,11 +200,6 @@ struct CTRPollFD {
BitField<4, 1, u32> pollout; BitField<4, 1, u32> pollout;
BitField<5, 1, u32> pollnval; BitField<5, 1, u32> pollnval;
Events& operator=(const Events& other) {
hex = other.hex;
return *this;
}
/// Translates the resulting events of a Poll operation from platform-specific to 3ds /// Translates the resulting events of a Poll operation from platform-specific to 3ds
/// specific /// specific
static Events TranslateTo3DS(u32 input_event) { static Events TranslateTo3DS(u32 input_event) {
@ -263,6 +259,8 @@ struct CTRPollFD {
return result; return result;
} }
}; };
static_assert(std::is_trivially_copyable_v<CTRPollFD>,
"CTRPollFD is used with std::memcpy and must be trivially copyable");
/// Union to represent the 3ds' sockaddr structure /// Union to represent the 3ds' sockaddr structure
union CTRSockAddr { union CTRSockAddr {