* connect() and bind() now make sure that sockaddr::sa_len is set correctly.
* Renamed MAX_SOCKET_ADDRESS_LEN to MAX_SOCKET_ADDRESS_LENGTH. * Whitespace cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27865 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -23,7 +23,7 @@
|
|||||||
#include <net_stat.h>
|
#include <net_stat.h>
|
||||||
|
|
||||||
|
|
||||||
#define MAX_SOCKET_ADDRESS_LEN (sizeof(sockaddr_storage))
|
#define MAX_SOCKET_ADDRESS_LENGTH (sizeof(sockaddr_storage))
|
||||||
#define MAX_SOCKET_OPTION_LEN 128
|
#define MAX_SOCKET_OPTION_LEN 128
|
||||||
#define MAX_ANCILLARY_DATA_LEN 1024
|
#define MAX_ANCILLARY_DATA_LEN 1024
|
||||||
|
|
||||||
@@ -104,8 +104,8 @@ prepare_userland_address_result(struct sockaddr* userAddress,
|
|||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addressLength > MAX_SOCKET_ADDRESS_LEN)
|
if (addressLength > MAX_SOCKET_ADDRESS_LENGTH)
|
||||||
addressLength = MAX_SOCKET_ADDRESS_LEN;
|
addressLength = MAX_SOCKET_ADDRESS_LENGTH;
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -177,8 +177,8 @@ prepare_userland_msghdr(const msghdr* userMessage, msghdr& message,
|
|||||||
if (userAddress != NULL) {
|
if (userAddress != NULL) {
|
||||||
if (!IS_USER_ADDRESS(message.msg_name))
|
if (!IS_USER_ADDRESS(message.msg_name))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
if (message.msg_namelen > MAX_SOCKET_ADDRESS_LEN)
|
if (message.msg_namelen > MAX_SOCKET_ADDRESS_LENGTH)
|
||||||
message.msg_namelen = MAX_SOCKET_ADDRESS_LEN;
|
message.msg_namelen = MAX_SOCKET_ADDRESS_LENGTH;
|
||||||
|
|
||||||
message.msg_name = address;
|
message.msg_name = address;
|
||||||
}
|
}
|
||||||
@@ -800,17 +800,20 @@ _user_bind(int socket, const struct sockaddr *userAddress,
|
|||||||
socklen_t addressLength)
|
socklen_t addressLength)
|
||||||
{
|
{
|
||||||
// check parameters and copy address from userland
|
// check parameters and copy address from userland
|
||||||
if (userAddress == NULL || addressLength > MAX_SOCKET_ADDRESS_LEN)
|
if (userAddress == NULL || addressLength > MAX_SOCKET_ADDRESS_LENGTH)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
sockaddr_storage address;
|
||||||
if (!IS_USER_ADDRESS(userAddress)
|
if (!IS_USER_ADDRESS(userAddress)
|
||||||
|| user_memcpy(address, userAddress, addressLength) != B_OK) {
|
|| user_memcpy(&address, userAddress, addressLength) != B_OK) {
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
address.ss_len = addressLength;
|
||||||
|
// make sure the sa_len field is set correctly
|
||||||
|
|
||||||
SyscallRestartWrapper<status_t> error;
|
SyscallRestartWrapper<status_t> error;
|
||||||
return error = common_bind(socket, (sockaddr*)address, addressLength,
|
return error = common_bind(socket, (sockaddr*)&address, addressLength,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -828,18 +831,21 @@ _user_connect(int socket, const struct sockaddr *userAddress,
|
|||||||
socklen_t addressLength)
|
socklen_t addressLength)
|
||||||
{
|
{
|
||||||
// check parameters and copy address from userland
|
// check parameters and copy address from userland
|
||||||
if (userAddress == NULL || addressLength > MAX_SOCKET_ADDRESS_LEN)
|
if (userAddress == NULL || addressLength > MAX_SOCKET_ADDRESS_LENGTH)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
sockaddr_storage address;
|
||||||
if (!IS_USER_ADDRESS(userAddress)
|
if (!IS_USER_ADDRESS(userAddress)
|
||||||
|| user_memcpy(address, userAddress, addressLength) != B_OK) {
|
|| user_memcpy(&address, userAddress, addressLength) != B_OK) {
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
address.ss_len = addressLength;
|
||||||
|
// make sure the sa_len field is set correctly
|
||||||
|
|
||||||
SyscallRestartWrapper<status_t> error;
|
SyscallRestartWrapper<status_t> error;
|
||||||
|
|
||||||
return error = common_connect(socket, (sockaddr*)address, addressLength,
|
return error = common_connect(socket, (sockaddr*)&address, addressLength,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -866,7 +872,7 @@ _user_accept(int socket, struct sockaddr *userAddress,
|
|||||||
// accept()
|
// accept()
|
||||||
SyscallRestartWrapper<int> result;
|
SyscallRestartWrapper<int> result;
|
||||||
|
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
char address[MAX_SOCKET_ADDRESS_LENGTH];
|
||||||
socklen_t userAddressBufferSize = addressLength;
|
socklen_t userAddressBufferSize = addressLength;
|
||||||
result = common_accept(socket,
|
result = common_accept(socket,
|
||||||
userAddress != NULL ? (sockaddr*)address : NULL, &addressLength, false);
|
userAddress != NULL ? (sockaddr*)address : NULL, &addressLength, false);
|
||||||
@@ -904,7 +910,7 @@ _user_recvfrom(int socket, void *data, size_t length, int flags,
|
|||||||
// recvfrom()
|
// recvfrom()
|
||||||
SyscallRestartWrapper<ssize_t> result;
|
SyscallRestartWrapper<ssize_t> result;
|
||||||
|
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
char address[MAX_SOCKET_ADDRESS_LENGTH];
|
||||||
socklen_t userAddressBufferSize = addressLength;
|
socklen_t userAddressBufferSize = addressLength;
|
||||||
result = common_recvfrom(socket, data, length, flags,
|
result = common_recvfrom(socket, data, length, flags,
|
||||||
userAddress != NULL ? (sockaddr*)address : NULL, &addressLength, false);
|
userAddress != NULL ? (sockaddr*)address : NULL, &addressLength, false);
|
||||||
@@ -929,7 +935,7 @@ _user_recvmsg(int socket, struct msghdr *userMessage, int flags)
|
|||||||
iovec* userVecs;
|
iovec* userVecs;
|
||||||
MemoryDeleter vecsDeleter;
|
MemoryDeleter vecsDeleter;
|
||||||
void* userAddress;
|
void* userAddress;
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
char address[MAX_SOCKET_ADDRESS_LENGTH];
|
||||||
|
|
||||||
status_t error = prepare_userland_msghdr(userMessage, message, userVecs,
|
status_t error = prepare_userland_msghdr(userMessage, message, userVecs,
|
||||||
vecsDeleter, userAddress, address);
|
vecsDeleter, userAddress, address);
|
||||||
@@ -994,12 +1000,12 @@ _user_sendto(int socket, const void *data, size_t length, int flags,
|
|||||||
// TODO: If this is a connection-mode socket, the address parameter is
|
// TODO: If this is a connection-mode socket, the address parameter is
|
||||||
// supposed to be ignored.
|
// supposed to be ignored.
|
||||||
if (userAddress == NULL || addressLength <= 0
|
if (userAddress == NULL || addressLength <= 0
|
||||||
|| addressLength > MAX_SOCKET_ADDRESS_LEN) {
|
|| addressLength > MAX_SOCKET_ADDRESS_LENGTH) {
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy address from userland
|
// copy address from userland
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
char address[MAX_SOCKET_ADDRESS_LENGTH];
|
||||||
if (!IS_USER_ADDRESS(userAddress)
|
if (!IS_USER_ADDRESS(userAddress)
|
||||||
|| user_memcpy(address, userAddress, addressLength) != B_OK) {
|
|| user_memcpy(address, userAddress, addressLength) != B_OK) {
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
@@ -1021,7 +1027,7 @@ _user_sendmsg(int socket, const struct msghdr *userMessage, int flags)
|
|||||||
iovec* userVecs;
|
iovec* userVecs;
|
||||||
MemoryDeleter vecsDeleter;
|
MemoryDeleter vecsDeleter;
|
||||||
void* userAddress;
|
void* userAddress;
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
char address[MAX_SOCKET_ADDRESS_LENGTH];
|
||||||
|
|
||||||
status_t error = prepare_userland_msghdr(userMessage, message, userVecs,
|
status_t error = prepare_userland_msghdr(userMessage, message, userVecs,
|
||||||
vecsDeleter, userAddress, address);
|
vecsDeleter, userAddress, address);
|
||||||
@@ -1132,7 +1138,7 @@ _user_getpeername(int socket, struct sockaddr *userAddress,
|
|||||||
return error;
|
return error;
|
||||||
|
|
||||||
// getpeername()
|
// getpeername()
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
char address[MAX_SOCKET_ADDRESS_LENGTH];
|
||||||
socklen_t userAddressBufferSize = addressLength;
|
socklen_t userAddressBufferSize = addressLength;
|
||||||
error = common_getpeername(socket, (sockaddr*)address, &addressLength,
|
error = common_getpeername(socket, (sockaddr*)address, &addressLength,
|
||||||
false);
|
false);
|
||||||
@@ -1162,7 +1168,7 @@ _user_getsockname(int socket, struct sockaddr *userAddress,
|
|||||||
return error;
|
return error;
|
||||||
|
|
||||||
// getsockname()
|
// getsockname()
|
||||||
char address[MAX_SOCKET_ADDRESS_LEN];
|
char address[MAX_SOCKET_ADDRESS_LENGTH];
|
||||||
socklen_t userAddressBufferSize = addressLength;
|
socklen_t userAddressBufferSize = addressLength;
|
||||||
error = common_getsockname(socket, (sockaddr*)address, &addressLength,
|
error = common_getsockname(socket, (sockaddr*)address, &addressLength,
|
||||||
false);
|
false);
|
||||||
|
|||||||
Reference in New Issue
Block a user