c_static_assert(GetHostErrorCodes_NO_ADDRESS == NO_ADDRESS);
c_static_assert(sizeof(uint8_t) == sizeof(char)); // We make casts from uint8_t to char so make sure it's legal
+// sizeof_member(struct foo, bar) is not valid C++.
+// The fix is to remove struct. That is not valid C.
+// Use typedefs to make it valid C -- which are redundant but valid C++.
+typedef struct iovec iovec;
+typedef struct sockaddr sockaddr;
+typedef struct xsocket xsocket;
+typedef struct linger linger;
+
// We require that IOVector have the same layout as iovec.
-c_static_assert(sizeof(IOVector) == sizeof(struct iovec));
-c_static_assert(sizeof_member(IOVector, Base) == sizeof_member(struct iovec, iov_base));
-c_static_assert(offsetof(IOVector, Base) == offsetof(struct iovec, iov_base));
-c_static_assert(sizeof_member(IOVector, Count) == sizeof_member(struct iovec, iov_len));
-c_static_assert(offsetof(IOVector, Count) == offsetof(struct iovec, iov_len));
+c_static_assert(sizeof(IOVector) == sizeof(iovec));
+c_static_assert(sizeof_member(IOVector, Base) == sizeof_member(iovec, iov_base));
+c_static_assert(offsetof(IOVector, Base) == offsetof(iovec, iov_base));
+c_static_assert(sizeof_member(IOVector, Count) == sizeof_member(iovec, iov_len));
+c_static_assert(offsetof(IOVector, Count) == offsetof(iovec, iov_len));
#define Min(left,right) (((left) < (right)) ? (left) : (right))
return gethostname((char*)name, unsignedSize);
}
-static bool IsInBounds(const uint8_t* baseAddr, size_t len, const uint8_t* valueAddr, size_t valueSize)
+static bool IsInBounds(const void* void_baseAddr, size_t len, const void* void_valueAddr, size_t valueSize)
{
+ const uint8_t* baseAddr = (const uint8_t*)void_baseAddr;
+ const uint8_t* valueAddr = (const uint8_t*)void_valueAddr;
+
return valueAddr >= baseAddr && (valueAddr + valueSize) <= (baseAddr + len);
}
}
const struct sockaddr* sockAddr = (const struct sockaddr*)socketAddress;
- if (!IsInBounds((const uint8_t*)sockAddr, (size_t)socketAddressLen, (const uint8_t*)&sockAddr->sa_family, sizeof_member(struct sockaddr, sa_family)))
+ if (!IsInBounds(sockAddr, (size_t)socketAddressLen, &sockAddr->sa_family, sizeof_member(sockaddr, sa_family)))
{
return Error_EFAULT;
}
{
struct sockaddr* sockAddr = (struct sockaddr*)socketAddress;
if (sockAddr == NULL || socketAddressLen < 0 ||
- !IsInBounds((const uint8_t*)sockAddr, (size_t)socketAddressLen, (const uint8_t*)&sockAddr->sa_family, sizeof_member(struct sockaddr, sa_family)))
+ !IsInBounds(sockAddr, (size_t)socketAddressLen, &sockAddr->sa_family, sizeof_member(sockaddr, sa_family)))
{
return Error_EFAULT;
}
}
const struct sockaddr* sockAddr = (const struct sockaddr*)socketAddress;
- if (!IsInBounds((const uint8_t*)sockAddr, (size_t)socketAddressLen, (const uint8_t*)&sockAddr->sa_family, sizeof_member(struct sockaddr, sa_family)))
+ if (!IsInBounds(sockAddr, (size_t)socketAddressLen, &sockAddr->sa_family, sizeof_member(sockaddr, sa_family)))
{
return Error_EFAULT;
}
}
const struct sockaddr* sockAddr = (const struct sockaddr*)socketAddress;
- if (!IsInBounds((const uint8_t*)sockAddr, (size_t)socketAddressLen, (const uint8_t*)&sockAddr->sa_family, sizeof_member(struct sockaddr, sa_family)))
+ if (!IsInBounds(sockAddr, (size_t)socketAddressLen, &sockAddr->sa_family, sizeof_member(sockaddr, sa_family)))
{
return Error_EFAULT;
}
}
const struct sockaddr* sockAddr = (const struct sockaddr*)socketAddress;
- if (!IsInBounds((const uint8_t*)sockAddr, (size_t)socketAddressLen, (const uint8_t*)&sockAddr->sa_family, sizeof_member(struct sockaddr, sa_family)))
+ if (!IsInBounds(sockAddr, (size_t)socketAddressLen, &sockAddr->sa_family, sizeof_member(sockaddr, sa_family)))
{
return Error_EFAULT;
}
}
struct sockaddr* sockAddr = (struct sockaddr*)socketAddress;
- if (!IsInBounds((const uint8_t*)sockAddr, (size_t)socketAddressLen, (const uint8_t*)&sockAddr->sa_family, sizeof_member(struct sockaddr, sa_family)))
+ if (!IsInBounds(sockAddr, (size_t)socketAddressLen, &sockAddr->sa_family, sizeof_member(sockaddr, sa_family)))
{
return Error_EFAULT;
}
}
const struct sockaddr* sockAddr = (const struct sockaddr*)socketAddress;
- if (!IsInBounds((const uint8_t*)sockAddr, (size_t)socketAddressLen, (const uint8_t*)&sockAddr->sa_family, sizeof_member(struct sockaddr, sa_family)))
+ if (!IsInBounds(sockAddr, (size_t)socketAddressLen, &sockAddr->sa_family, sizeof_member(sockaddr, sa_family)))
{
return Error_EFAULT;
}
}
struct sockaddr* sockAddr = (struct sockaddr*)socketAddress;
- if (!IsInBounds((const uint8_t*)sockAddr, (size_t)socketAddressLen, (const uint8_t*)&sockAddr->sa_family, sizeof_member(struct sockaddr, sa_family)))
+ if (!IsInBounds(sockAddr, (size_t)socketAddressLen, &sockAddr->sa_family, sizeof_member(sockaddr, sa_family)))
{
return Error_EFAULT;
}
static int32_t GetMaxLingerTime()
{
static volatile int32_t MaxLingerTime = -1;
- c_static_assert(sizeof_member(struct xsocket, so_linger) == 2);
+ c_static_assert(sizeof_member(xsocket, so_linger) == 2);
// OS X does not define the linger time in seconds by default, but in ticks.
// Furthermore, when SO_LINGER_SEC is used, the value is simply scaled by
// 65535 (the maximum time for winsock) and the maximum signed value that
// will fit in linger::l_linger.
- return Min(65535U, (1U << (sizeof_member(struct linger, l_linger) * 8 - 1)) - 1);
+ return Min(65535U, (1U << (sizeof_member(linger, l_linger) * 8 - 1)) - 1);
}
#endif