hdr->msg_hdr.msg_namelen = sizeof (msg->name);
hdr->msg_hdr.msg_iov = &msg->iov;
hdr->msg_hdr.msg_iovlen = 1;
- hdr->msg_hdr.msg_control = &msg->cmsg_buf;
+ hdr->msg_hdr.msg_control = msg->cmsg_buf;
hdr->msg_hdr.msg_controllen = sizeof (msg->cmsg_buf);
hdr->msg_hdr.msg_flags = 0;
hdr->msg_len = 0;
static int
set_socket_nonblock(int sock_fd)
{
- if (fcntl(sock_fd, F_SETFL, O_NONBLOCK)) {
+ if (fcntl(sock_fd, F_SETFL, O_NONBLOCK) < 0) {
DEBUG_LOG("Could not set O_NONBLOCK : %s", strerror(errno));
return 0;
}
case SCK_ADDR_IP:
if (message->remote_addr.ip.ip_addr.family != IPADDR_UNSPEC)
remote_addr = UTI_IPSockAddrToString(&message->remote_addr.ip);
- if (message->local_addr.ip.family != IPADDR_UNSPEC) {
+ if (message->local_addr.ip.family != IPADDR_UNSPEC)
local_addr = UTI_IPToString(&message->local_addr.ip);
- }
break;
case SCK_ADDR_UNIX:
remote_addr = message->remote_addr.path;
snprintf(tslen, sizeof (tslen), " tslen=%d", message->timestamp.l2_length);
}
- DEBUG_LOG("%s message%s%s%s%s fd=%d len=%u%s%s%s%s%s%s",
+ DEBUG_LOG("%s message%s%s%s%s fd=%d len=%d%s%s%s%s%s%s",
prefix,
remote_addr ? (direction > 0 ? " from " : " to ") : "",
remote_addr ? remote_addr : "",
/* ================================================== */
static int
-process_header(struct msghdr *msg, unsigned int msg_length, int sock_fd, int flags,
+process_header(struct msghdr *msg, int msg_length, int sock_fd, int flags,
SCK_Message *message)
{
struct cmsghdr *cmsg;
hdr = ARR_GetElements(recv_headers);
n = ARR_GetSize(recv_headers);
n = MIN(n, max_messages);
- assert(n >= 1);
+
+ if (n < 1 || n > MAX_RECV_MESSAGES ||
+ n > ARR_GetSize(recv_messages) || n > ARR_GetSize(recv_sck_messages))
+ assert(0);
recv_flags = get_recv_flags(flags);
msg.msg_namelen = 0;
}
+ if (message->length < 0) {
+ DEBUG_LOG("Invalid length %d", message->length);
+ return 0;
+ }
+
iov.iov_base = message->data;
iov.iov_len = message->length;
msg.msg_iov = &iov;
/* ================================================== */
int
-SCK_Receive(int sock_fd, void *buffer, unsigned int length, int flags)
+SCK_Receive(int sock_fd, void *buffer, int length, int flags)
{
int r;
+ if (length < 0) {
+ DEBUG_LOG("Invalid length %d", length);
+ return -1;
+ }
+
r = recv(sock_fd, buffer, length, get_recv_flags(flags));
if (r < 0) {
/* ================================================== */
int
-SCK_Send(int sock_fd, const void *buffer, unsigned int length, int flags)
+SCK_Send(int sock_fd, const void *buffer, int length, int flags)
{
int r;
assert(flags == 0);
+ if (length < 0) {
+ DEBUG_LOG("Invalid length %d", length);
+ return -1;
+ }
+
r = send(sock_fd, buffer, length, 0);
if (r < 0) {
- DEBUG_LOG("Could not send data fd=%d len=%u : %s", sock_fd, length, strerror(errno));
+ DEBUG_LOG("Could not send data fd=%d len=%d : %s", sock_fd, length, strerror(errno));
return r;
}
typedef struct {
void *data;
- unsigned int length;
+ int length;
SCK_AddressType addr_type;
int if_index;
extern int SCK_ShutdownConnection(int sock_fd);
/* Receive and send data on connected sockets - recv()/send() wrappers */
-extern int SCK_Receive(int sock_fd, void *buffer, unsigned int length, int flags);
-extern int SCK_Send(int sock_fd, const void *buffer, unsigned int length, int flags);
+extern int SCK_Receive(int sock_fd, void *buffer, int length, int flags);
+extern int SCK_Send(int sock_fd, const void *buffer, int length, int flags);
/* Receive a single message or multiple messages. The functions return
a pointer to static buffers, or NULL on error. The buffers are valid until