From ed9f4719f7f22477353f0c09c4ed4db8857c6d57 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 25 Nov 2013 15:47:26 +0100 Subject: [PATCH] Fix FIONREAD related issues * Network stack socket module: socket_control(): The FIONREAD argument is int, not ssize_t. * Net kit: getsockopt(): R5_SO_FIONREAD: Fix ioctl() argument. Was taking a pointer of what already was a pointer to the buffer. * libedit: el_gets(): The FIONREAD argument is int, not long. --- src/add-ons/kernel/network/stack/net_socket.cpp | 9 +++++---- src/kits/network/socket.cpp | 5 +++-- src/libs/edit/read.c | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/add-ons/kernel/network/stack/net_socket.cpp b/src/add-ons/kernel/network/stack/net_socket.cpp index 9d5cfc9200..bc7b8deb52 100644 --- a/src/add-ons/kernel/network/stack/net_socket.cpp +++ b/src/add-ons/kernel/network/stack/net_socket.cpp @@ -550,17 +550,18 @@ socket_control(net_socket* socket, int32 op, void* data, size_t length) if (data == NULL) return B_BAD_VALUE; - ssize_t available = socket_read_avail(socket); - if (available < B_OK) + int available = (int)socket_read_avail(socket); + if (available < 0) return available; if (is_syscall()) { if (!IS_USER_ADDRESS(data) - || user_memcpy(data, &available, sizeof(ssize_t)) != B_OK) { + || user_memcpy(data, &available, sizeof(available)) + != B_OK) { return B_BAD_ADDRESS; } } else - *(ssize_t *)data = available; + *(int*)data = available; return B_OK; } diff --git a/src/kits/network/socket.cpp b/src/kits/network/socket.cpp index 9daf8ec2cb..7829f20507 100644 --- a/src/kits/network/socket.cpp +++ b/src/kits/network/socket.cpp @@ -315,9 +315,10 @@ getsockopt(int socket, int level, int option, void *value, socklen_t *_length) { if (check_r5_compatibility()) { if (option == R5_SO_FIONREAD) { - // there is no SO_FIONREAD in our stack; we're using FIONREAD instead + // there is no SO_FIONREAD in our stack; we're using FIONREAD + // instead *_length = sizeof(int); - return ioctl(socket, FIONREAD, &value); + return ioctl(socket, FIONREAD, value); } convert_from_r5_sockopt(level, option); diff --git a/src/libs/edit/read.c b/src/libs/edit/read.c index cfc5cbf897..8ce16670b0 100644 --- a/src/libs/edit/read.c +++ b/src/libs/edit/read.c @@ -419,7 +419,7 @@ el_gets(EditLine *el, int *nread) #ifdef FIONREAD if (el->el_tty.t_mode == EX_IO && ma->level < 0) { - long chrs = 0; + int chrs = 0; (void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs); if (chrs == 0) {