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.
This commit is contained in:
@@ -550,17 +550,18 @@ socket_control(net_socket* socket, int32 op, void* data, size_t length)
|
|||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
ssize_t available = socket_read_avail(socket);
|
int available = (int)socket_read_avail(socket);
|
||||||
if (available < B_OK)
|
if (available < 0)
|
||||||
return available;
|
return available;
|
||||||
|
|
||||||
if (is_syscall()) {
|
if (is_syscall()) {
|
||||||
if (!IS_USER_ADDRESS(data)
|
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;
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
*(ssize_t *)data = available;
|
*(int*)data = available;
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -315,9 +315,10 @@ getsockopt(int socket, int level, int option, void *value, socklen_t *_length)
|
|||||||
{
|
{
|
||||||
if (check_r5_compatibility()) {
|
if (check_r5_compatibility()) {
|
||||||
if (option == R5_SO_FIONREAD) {
|
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);
|
*_length = sizeof(int);
|
||||||
return ioctl(socket, FIONREAD, &value);
|
return ioctl(socket, FIONREAD, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
convert_from_r5_sockopt(level, option);
|
convert_from_r5_sockopt(level, option);
|
||||||
|
|||||||
@@ -419,7 +419,7 @@ el_gets(EditLine *el, int *nread)
|
|||||||
|
|
||||||
#ifdef FIONREAD
|
#ifdef FIONREAD
|
||||||
if (el->el_tty.t_mode == EX_IO && ma->level < 0) {
|
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);
|
(void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs);
|
||||||
if (chrs == 0) {
|
if (chrs == 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user