summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-02-25 21:19:57 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-02-25 21:21:12 +0100
commitbeda4788216509fdf846e5bb6f6000b8b542ca11 (patch)
treeb7ed890f13d5c1629b434fa202b4f1ca9a232c50
parent5af4e622b94a194e3feaea1b3b09229d7a93578b (diff)
downloadserenity-beda4788216509fdf846e5bb6f6000b8b542ca11.zip
Kernel: Make syscalls that take a buffer size use ssize_t instead of size_t.
Dealing with the unsigned overflow propagation here just seems unreasonably error prone. Let's limit ourselves to 2GB buffer sizes instead.
-rw-r--r--Kernel/BXVGADevice.cpp4
-rw-r--r--Kernel/BXVGADevice.h4
-rw-r--r--Kernel/Console.cpp6
-rw-r--r--Kernel/Console.h4
-rw-r--r--Kernel/Device.h4
-rw-r--r--Kernel/DoubleBuffer.cpp10
-rw-r--r--Kernel/DoubleBuffer.h8
-rw-r--r--Kernel/FIFO.cpp6
-rw-r--r--Kernel/FIFO.h4
-rw-r--r--Kernel/FileDescriptor.cpp7
-rw-r--r--Kernel/FileDescriptor.h6
-rw-r--r--Kernel/FullDevice.cpp10
-rw-r--r--Kernel/FullDevice.h4
-rw-r--r--Kernel/KeyboardDevice.cpp8
-rw-r--r--Kernel/KeyboardDevice.h4
-rw-r--r--Kernel/Limits.h2
-rw-r--r--Kernel/LocalSocket.cpp4
-rw-r--r--Kernel/LocalSocket.h4
-rw-r--r--Kernel/MasterPTY.cpp6
-rw-r--r--Kernel/MasterPTY.h6
-rw-r--r--Kernel/MemoryManager.cpp2
-rw-r--r--Kernel/NullDevice.cpp6
-rw-r--r--Kernel/NullDevice.h4
-rw-r--r--Kernel/PS2MouseDevice.cpp6
-rw-r--r--Kernel/PS2MouseDevice.h4
-rw-r--r--Kernel/PTYMultiplexer.h4
-rw-r--r--Kernel/Process.cpp57
-rw-r--r--Kernel/Process.h20
-rw-r--r--Kernel/RandomDevice.cpp10
-rw-r--r--Kernel/RandomDevice.h4
-rw-r--r--Kernel/SlavePTY.cpp8
-rw-r--r--Kernel/SlavePTY.h6
-rw-r--r--Kernel/Socket.h4
-rw-r--r--Kernel/Syscall.cpp4
-rw-r--r--Kernel/TTY.cpp4
-rw-r--r--Kernel/TTY.h6
-rw-r--r--Kernel/VirtualConsole.cpp4
-rw-r--r--Kernel/VirtualConsole.h2
-rw-r--r--Kernel/ZeroDevice.cpp10
-rw-r--r--Kernel/ZeroDevice.h4
40 files changed, 144 insertions, 136 deletions
diff --git a/Kernel/BXVGADevice.cpp b/Kernel/BXVGADevice.cpp
index c37ff59707..dbdc224268 100644
--- a/Kernel/BXVGADevice.cpp
+++ b/Kernel/BXVGADevice.cpp
@@ -132,12 +132,12 @@ bool BXVGADevice::can_write(Process&) const
ASSERT_NOT_REACHED();
}
-ssize_t BXVGADevice::read(Process&, byte*, size_t)
+ssize_t BXVGADevice::read(Process&, byte*, ssize_t)
{
ASSERT_NOT_REACHED();
}
-ssize_t BXVGADevice::write(Process&, const byte*, size_t)
+ssize_t BXVGADevice::write(Process&, const byte*, ssize_t)
{
ASSERT_NOT_REACHED();
}
diff --git a/Kernel/BXVGADevice.h b/Kernel/BXVGADevice.h
index a1d9375d38..212ce6a963 100644
--- a/Kernel/BXVGADevice.h
+++ b/Kernel/BXVGADevice.h
@@ -27,8 +27,8 @@ private:
virtual const char* class_name() const override { return "BXVGA"; }
virtual bool can_read(Process&) const override;
virtual bool can_write(Process&) const override;
- virtual ssize_t read(Process&, byte*, size_t) override;
- virtual ssize_t write(Process&, const byte*, size_t) override;
+ virtual ssize_t read(Process&, byte*, ssize_t) override;
+ virtual ssize_t write(Process&, const byte*, ssize_t) override;
void set_register(word index, word value);
dword find_framebuffer_address();
diff --git a/Kernel/Console.cpp b/Kernel/Console.cpp
index 08b5e19a77..74e6c19c88 100644
--- a/Kernel/Console.cpp
+++ b/Kernel/Console.cpp
@@ -28,20 +28,20 @@ bool Console::can_read(Process&) const
return false;
}
-ssize_t Console::read(Process&, byte*, size_t)
+ssize_t Console::read(Process&, byte*, ssize_t)
{
// FIXME: Implement reading from the console.
// Maybe we could use a ring buffer for this device?
return 0;
}
-ssize_t Console::write(Process&, const byte* data, size_t size)
+ssize_t Console::write(Process&, const byte* data, ssize_t size)
{
if (!size)
return 0;
if (!m_implementation)
return 0;
- for (size_t i = 0; i < size; ++i)
+ for (ssize_t i = 0; i < size; ++i)
put_char(data[i]);
return size;
}
diff --git a/Kernel/Console.h b/Kernel/Console.h
index 2d3cc77009..c670d8640b 100644
--- a/Kernel/Console.h
+++ b/Kernel/Console.h
@@ -21,8 +21,8 @@ public:
// ^CharacterDevice
virtual bool can_read(Process&) const override;
virtual bool can_write(Process&) const override { return true; }
- virtual ssize_t read(Process&, byte* buffer, size_t size) override;
- virtual ssize_t write(Process&, const byte* data, size_t size) override;
+ virtual ssize_t read(Process&, byte*, ssize_t) override;
+ virtual ssize_t write(Process&, const byte*, ssize_t) override;
virtual const char* class_name() const override { return "Console"; }
void set_implementation(ConsoleImplementation* implementation) { m_implementation = implementation; }
diff --git a/Kernel/Device.h b/Kernel/Device.h
index 9c68d5602c..19bf9d8ed4 100644
--- a/Kernel/Device.h
+++ b/Kernel/Device.h
@@ -19,8 +19,8 @@ public:
virtual bool can_read(Process&) const = 0;
virtual bool can_write(Process&) const = 0;
- virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) = 0;
- virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) = 0;
+ virtual ssize_t read(Process&, byte*, ssize_t) = 0;
+ virtual ssize_t write(Process&, const byte*, ssize_t) = 0;
unsigned major() const { return m_major; }
unsigned minor() const { return m_minor; }
diff --git a/Kernel/DoubleBuffer.cpp b/Kernel/DoubleBuffer.cpp
index 8e038e2a52..60b11f05d3 100644
--- a/Kernel/DoubleBuffer.cpp
+++ b/Kernel/DoubleBuffer.cpp
@@ -1,4 +1,4 @@
-#include "DoubleBuffer.h"
+#include <Kernel/DoubleBuffer.h>
inline void DoubleBuffer::compute_emptiness()
{
@@ -17,24 +17,22 @@ void DoubleBuffer::flip()
compute_emptiness();
}
-ssize_t DoubleBuffer::write(const byte* data, size_t size)
+ssize_t DoubleBuffer::write(const byte* data, ssize_t size)
{
- ASSERT_INTERRUPTS_ENABLED();
LOCKER(m_lock);
m_write_buffer->append(data, size);
compute_emptiness();
return size;
}
-ssize_t DoubleBuffer::read(byte* data, size_t size)
+ssize_t DoubleBuffer::read(byte* data, ssize_t size)
{
- ASSERT_INTERRUPTS_ENABLED();
LOCKER(m_lock);
if (m_read_buffer_index >= m_read_buffer->size() && !m_write_buffer->is_empty())
flip();
if (m_read_buffer_index >= m_read_buffer->size())
return 0;
- ssize_t nread = min(m_read_buffer->size() - m_read_buffer_index, size);
+ ssize_t nread = min((ssize_t)m_read_buffer->size() - m_read_buffer_index, size);
memcpy(data, m_read_buffer->data() + m_read_buffer_index, nread);
m_read_buffer_index += nread;
compute_emptiness();
diff --git a/Kernel/DoubleBuffer.h b/Kernel/DoubleBuffer.h
index e7212a5f8a..fc351a65c8 100644
--- a/Kernel/DoubleBuffer.h
+++ b/Kernel/DoubleBuffer.h
@@ -13,13 +13,13 @@ public:
{
}
- ssize_t write(const byte*, size_t);
- ssize_t read(byte*, size_t);
+ ssize_t write(const byte*, ssize_t);
+ ssize_t read(byte*, ssize_t);
bool is_empty() const { return m_empty; }
// FIXME: Isn't this racy? What if we get interrupted between getting the buffer pointer and dereferencing it?
- size_t bytes_in_write_buffer() const { return m_write_buffer->size(); }
+ ssize_t bytes_in_write_buffer() const { return (ssize_t)m_write_buffer->size(); }
private:
void flip();
@@ -29,7 +29,7 @@ private:
Vector<byte>* m_read_buffer { nullptr };
Vector<byte> m_buffer1;
Vector<byte> m_buffer2;
- size_t m_read_buffer_index { 0 };
+ ssize_t m_read_buffer_index { 0 };
bool m_empty { true };
Lock m_lock;
};
diff --git a/Kernel/FIFO.cpp b/Kernel/FIFO.cpp
index dfb991b001..ed4d6503e4 100644
--- a/Kernel/FIFO.cpp
+++ b/Kernel/FIFO.cpp
@@ -54,21 +54,21 @@ bool FIFO::can_write() const
return m_buffer.bytes_in_write_buffer() < 4096;
}
-ssize_t FIFO::read(byte* buffer, size_t size)
+ssize_t FIFO::read(byte* buffer, ssize_t size)
{
if (!m_writers && m_buffer.is_empty())
return 0;
#ifdef FIFO_DEBUG
dbgprintf("fifo: read(%u)\n",size);
#endif
- size_t nread = m_buffer.read(buffer, size);
+ ssize_t nread = m_buffer.read(buffer, size);
#ifdef FIFO_DEBUG
dbgprintf(" -> read (%c) %u\n", buffer[0], nread);
#endif
return nread;
}
-ssize_t FIFO::write(const byte* buffer, size_t size)
+ssize_t FIFO::write(const byte* buffer, ssize_t size)
{
if (!m_readers)
return 0;
diff --git a/Kernel/FIFO.h b/Kernel/FIFO.h
index 77a802afb3..cef704a397 100644
--- a/Kernel/FIFO.h
+++ b/Kernel/FIFO.h
@@ -16,8 +16,8 @@ public:
void open(Direction);
void close(Direction);
- ssize_t write(const byte*, size_t);
- ssize_t read(byte*, size_t);
+ ssize_t write(const byte*, ssize_t);
+ ssize_t read(byte*, ssize_t);
bool can_read() const;
bool can_write() const;
diff --git a/Kernel/FileDescriptor.cpp b/Kernel/FileDescriptor.cpp
index 67085bd5cc..084e22f0de 100644
--- a/Kernel/FileDescriptor.cpp
+++ b/Kernel/FileDescriptor.cpp
@@ -176,7 +176,7 @@ off_t FileDescriptor::seek(off_t offset, int whence)
return m_current_offset;
}
-ssize_t FileDescriptor::read(Process& process, byte* buffer, size_t count)
+ssize_t FileDescriptor::read(Process& process, byte* buffer, ssize_t count)
{
if (is_fifo()) {
ASSERT(fifo_direction() == FIFO::Reader);
@@ -194,7 +194,7 @@ ssize_t FileDescriptor::read(Process& process, byte* buffer, size_t count)
return nread;
}
-ssize_t FileDescriptor::write(Process& process, const byte* data, size_t size)
+ssize_t FileDescriptor::write(Process& process, const byte* data, ssize_t size)
{
if (is_fifo()) {
ASSERT(fifo_direction() == FIFO::Writer);
@@ -245,6 +245,7 @@ ByteBuffer FileDescriptor::read_entire_file(Process& process)
if (m_device) {
auto buffer = ByteBuffer::create_uninitialized(1024);
ssize_t nread = m_device->read(process, buffer.pointer(), buffer.size());
+ ASSERT(nread >= 0);
buffer.trim(nread);
return buffer;
}
@@ -259,7 +260,7 @@ bool FileDescriptor::is_directory() const
return metadata().is_directory();
}
-ssize_t FileDescriptor::get_dir_entries(byte* buffer, size_t size)
+ssize_t FileDescriptor::get_dir_entries(byte* buffer, ssize_t size)
{
auto metadata = this->metadata();
if (!metadata.is_valid())
diff --git a/Kernel/FileDescriptor.h b/Kernel/FileDescriptor.h
index a20e8d6de8..f7a6f982d4 100644
--- a/Kernel/FileDescriptor.h
+++ b/Kernel/FileDescriptor.h
@@ -30,14 +30,14 @@ public:
int close();
off_t seek(off_t, int whence);
- ssize_t read(Process&, byte*, size_t);
- ssize_t write(Process&, const byte* data, size_t);
+ ssize_t read(Process&, byte*, ssize_t);
+ ssize_t write(Process&, const byte* data, ssize_t);
int fstat(stat*);
bool can_read(Process&);
bool can_write(Process&);
- ssize_t get_dir_entries(byte* buffer, size_t);
+ ssize_t get_dir_entries(byte* buffer, ssize_t);
ByteBuffer read_entire_file(Process&);
diff --git a/Kernel/FullDevice.cpp b/Kernel/FullDevice.cpp
index d9e94303fb..6d7acfadc7 100644
--- a/Kernel/FullDevice.cpp
+++ b/Kernel/FullDevice.cpp
@@ -18,16 +18,16 @@ bool FullDevice::can_read(Process&) const
return true;
}
-ssize_t FullDevice::read(Process&, byte* buffer, size_t bufferSize)
+ssize_t FullDevice::read(Process&, byte* buffer, ssize_t size)
{
- size_t count = min(GoodBufferSize, bufferSize);
- memset(buffer, 0, count);
+ ssize_t count = min(GoodBufferSize, size);
+ memset(buffer, 0, (size_t)count);
return count;
}
-ssize_t FullDevice::write(Process&, const byte*, size_t bufferSize)
+ssize_t FullDevice::write(Process&, const byte*, ssize_t size)
{
- if (bufferSize == 0)
+ if (size == 0)
return 0;
return -ENOSPC;
}
diff --git a/Kernel/FullDevice.h b/Kernel/FullDevice.h
index a900ac2536..b494656047 100644
--- a/Kernel/FullDevice.h
+++ b/Kernel/FullDevice.h
@@ -10,8 +10,8 @@ public:
private:
// ^CharacterDevice
- virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
- virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
+ virtual ssize_t read(Process&, byte*, ssize_t) override;
+ virtual ssize_t write(Process&, const byte*, ssize_t) override;
virtual bool can_read(Process&) const override;
virtual bool can_write(Process&) const override { return true; }
virtual const char* class_name() const override { return "FullDevice"; }
diff --git a/Kernel/KeyboardDevice.cpp b/Kernel/KeyboardDevice.cpp
index ed6254048b..9085ae29b1 100644
--- a/Kernel/KeyboardDevice.cpp
+++ b/Kernel/KeyboardDevice.cpp
@@ -177,14 +177,14 @@ bool KeyboardDevice::can_read(Process&) const
return !m_queue.is_empty();
}
-ssize_t KeyboardDevice::read(Process&, byte* buffer, size_t size)
+ssize_t KeyboardDevice::read(Process&, byte* buffer, ssize_t size)
{
ssize_t nread = 0;
- while ((size_t)nread < size) {
+ while (nread < size) {
if (m_queue.is_empty())
break;
// Don't return partial data frames.
- if ((size - nread) < sizeof(Event))
+ if ((size - nread) < (ssize_t)sizeof(Event))
break;
auto event = m_queue.dequeue();
memcpy(buffer, &event, sizeof(Event));
@@ -193,7 +193,7 @@ ssize_t KeyboardDevice::read(Process&, byte* buffer, size_t size)
return nread;
}
-ssize_t KeyboardDevice::write(Process&, const byte*, size_t)
+ssize_t KeyboardDevice::write(Process&, const byte*, ssize_t)
{
return 0;
}
diff --git a/Kernel/KeyboardDevice.h b/Kernel/KeyboardDevice.h
index fb8e9fc28b..aebc6b6d93 100644
--- a/Kernel/KeyboardDevice.h
+++ b/Kernel/KeyboardDevice.h
@@ -22,9 +22,9 @@ public:
void set_client(KeyboardClient* client) { m_client = client; }
// ^CharacterDevice
- virtual ssize_t read(Process&, byte* buffer, size_t) override;
+ virtual ssize_t read(Process&, byte* buffer, ssize_t) override;
virtual bool can_read(Process&) const override;
- virtual ssize_t write(Process&, const byte* buffer, size_t) override;
+ virtual ssize_t write(Process&, const byte* buffer, ssize_t) override;
virtual bool can_write(Process&) const override { return true; }
private:
diff --git a/Kernel/Limits.h b/Kernel/Limits.h
index e342507fc9..87abe0389b 100644
--- a/Kernel/Limits.h
+++ b/Kernel/Limits.h
@@ -4,6 +4,6 @@
inline static const off_t maxFileOffset = 2147483647;
-static const size_t GoodBufferSize = 4096;
+static const ssize_t GoodBufferSize = 4096;
diff --git a/Kernel/LocalSocket.cpp b/Kernel/LocalSocket.cpp
index c8c6ec8a5b..dbbd15edf6 100644
--- a/Kernel/LocalSocket.cpp
+++ b/Kernel/LocalSocket.cpp
@@ -137,7 +137,7 @@ bool LocalSocket::can_read(SocketRole role) const
ASSERT_NOT_REACHED();
}
-ssize_t LocalSocket::read(SocketRole role, byte* buffer, size_t size)
+ssize_t LocalSocket::read(SocketRole role, byte* buffer, ssize_t size)
{
if (role == SocketRole::Accepted)
return m_for_server.read(buffer, size);
@@ -146,7 +146,7 @@ ssize_t LocalSocket::read(SocketRole role, byte* buffer, size_t size)
ASSERT_NOT_REACHED();
}
-ssize_t LocalSocket::write(SocketRole role, const byte* data, size_t size)
+ssize_t LocalSocket::write(SocketRole role, const byte* data, ssize_t size)
{
if (role == SocketRole::Accepted) {
if (!m_accepted_fds_open)
diff --git a/Kernel/LocalSocket.h b/Kernel/LocalSocket.h
index 7ad4abc8d0..435c15a99c 100644
--- a/Kernel/LocalSocket.h
+++ b/Kernel/LocalSocket.h
@@ -16,8 +16,8 @@ public:
virtual void attach_fd(SocketRole) override;
virtual void detach_fd(SocketRole) override;
virtual bool can_read(SocketRole) const override;
- virtual ssize_t read(SocketRole, byte*, size_t) override;
- virtual ssize_t write(SocketRole, const byte*, size_t) override;
+ virtual ssize_t read(SocketRole, byte*, ssize_t) override;
+ virtual ssize_t write(SocketRole, const byte*, ssize_t) override;
virtual bool can_write(SocketRole) const override;
private:
diff --git a/Kernel/MasterPTY.cpp b/Kernel/MasterPTY.cpp
index d6af396576..819277edd6 100644
--- a/Kernel/MasterPTY.cpp
+++ b/Kernel/MasterPTY.cpp
@@ -26,14 +26,14 @@ String MasterPTY::pts_name() const
return String::format("/dev/pts/%u", m_index);
}
-ssize_t MasterPTY::read(Process&, byte* buffer, size_t size)
+ssize_t MasterPTY::read(Process&, byte* buffer, ssize_t size)
{
if (!m_slave && m_buffer.is_empty())
return 0;
return m_buffer.read(buffer, size);
}
-ssize_t MasterPTY::write(Process&, const byte* buffer, size_t size)
+ssize_t MasterPTY::write(Process&, const byte* buffer, ssize_t size)
{
if (!m_slave)
return -EIO;
@@ -62,7 +62,7 @@ void MasterPTY::notify_slave_closed(Badge<SlavePTY>)
m_slave = nullptr;
}
-ssize_t MasterPTY::on_slave_write(const byte* data, size_t size)
+ssize_t MasterPTY::on_slave_write(const byte* data, ssize_t size)
{
if (m_closed)
return -EIO;
diff --git a/Kernel/MasterPTY.h b/Kernel/MasterPTY.h
index 896f094bce..e189cd7eef 100644
--- a/Kernel/MasterPTY.h
+++ b/Kernel/MasterPTY.h
@@ -13,15 +13,15 @@ public:
unsigned index() const { return m_index; }
String pts_name() const;
- ssize_t on_slave_write(const byte*, size_t);
+ ssize_t on_slave_write(const byte*, ssize_t);
bool can_write_from_slave() const;
void notify_slave_closed(Badge<SlavePTY>);
bool is_closed() const { return m_closed; }
private:
// ^CharacterDevice
- virtual ssize_t read(Process&, byte*, size_t) override;
- virtual ssize_t write(Process&, const byte*, size_t) override;
+ virtual ssize_t read(Process&, byte*, ssize_t) override;
+ virtual ssize_t write(Process&, const byte*, ssize_t) override;
virtual bool can_read(Process&) const override;
virtual bool can_write(Process&) const override;
virtual void close() override;
diff --git a/Kernel/MemoryManager.cpp b/Kernel/MemoryManager.cpp
index 4bef6b0e5b..dfe86d7b62 100644
--- a/Kernel/MemoryManager.cpp
+++ b/Kernel/MemoryManager.cpp
@@ -815,6 +815,8 @@ void VMObject::inode_size_changed(Badge<Inode>, size_t old_size, size_t new_size
void VMObject::inode_contents_changed(Badge<Inode>, off_t offset, size_t size, const byte* data)
{
+ (void)size;
+ (void)data;
InterruptDisabler disabler;
ASSERT(offset >= 0);
diff --git a/Kernel/NullDevice.cpp b/Kernel/NullDevice.cpp
index c1b2625655..cfb73450e1 100644
--- a/Kernel/NullDevice.cpp
+++ b/Kernel/NullDevice.cpp
@@ -26,13 +26,13 @@ bool NullDevice::can_read(Process&) const
return true;
}
-ssize_t NullDevice::read(Process&, byte*, size_t)
+ssize_t NullDevice::read(Process&, byte*, ssize_t)
{
return 0;
}
-ssize_t NullDevice::write(Process&, const byte*, size_t bufferSize)
+ssize_t NullDevice::write(Process&, const byte*, ssize_t buffer_size)
{
- return min(GoodBufferSize, bufferSize);
+ return min(GoodBufferSize, buffer_size);
}
diff --git a/Kernel/NullDevice.h b/Kernel/NullDevice.h
index 943635f9dd..d325bbecb5 100644
--- a/Kernel/NullDevice.h
+++ b/Kernel/NullDevice.h
@@ -12,8 +12,8 @@ public:
private:
// ^CharacterDevice
- virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
- virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
+ virtual ssize_t read(Process&, byte*, ssize_t) override;
+ virtual ssize_t write(Process&, const byte*, ssize_t) override;
virtual bool can_write(Process&) const override { return true; }
virtual bool can_read(Process&) const override;
virtual const char* class_name() const override { return "NullDevice"; }
diff --git a/Kernel/PS2MouseDevice.cpp b/Kernel/PS2MouseDevice.cpp
index dc70c5eb78..6541163479 100644
--- a/Kernel/PS2MouseDevice.cpp
+++ b/Kernel/PS2MouseDevice.cpp
@@ -144,10 +144,10 @@ bool PS2MouseDevice::can_read(Process&) const
return !m_queue.is_empty();
}
-ssize_t PS2MouseDevice::read(Process&, byte* buffer, size_t size)
+ssize_t PS2MouseDevice::read(Process&, byte* buffer, ssize_t size)
{
ssize_t nread = 0;
- while ((size_t)nread < size) {
+ while (nread < size) {
if (m_queue.is_empty())
break;
// FIXME: Don't return partial data frames.
@@ -156,7 +156,7 @@ ssize_t PS2MouseDevice::read(Process&, byte* buffer, size_t size)
return nread;
}
-ssize_t PS2MouseDevice::write(Process&, const byte*, size_t)
+ssize_t PS2MouseDevice::write(Process&, const byte*, ssize_t)
{
return 0;
}
diff --git a/Kernel/PS2MouseDevice.h b/Kernel/PS2MouseDevice.h
index 5f616a3933..c5cbc436a6 100644
--- a/Kernel/PS2MouseDevice.h
+++ b/Kernel/PS2MouseDevice.h
@@ -12,8 +12,8 @@ public:
// ^CharacterDevice
virtual bool can_read(Process&) const override;
- virtual ssize_t read(Process&, byte* buffer, size_t) override;
- virtual ssize_t write(Process&, const byte* buffer, size_t) override;
+ virtual ssize_t read(Process&, byte*, ssize_t) override;
+ virtual ssize_t write(Process&, const byte*, ssize_t) override;
virtual bool can_write(Process&) const override { return true; }
private:
diff --git a/Kernel/PTYMultiplexer.h b/Kernel/PTYMultiplexer.h
index 064d3eb00f..5e34d65324 100644
--- a/Kernel/PTYMultiplexer.h
+++ b/Kernel/PTYMultiplexer.h
@@ -16,8 +16,8 @@ public:
// ^CharacterDevice
virtual RetainPtr<FileDescriptor> open(int& error, int options) override;
- virtual ssize_t read(Process&, byte*, size_t) override { return 0; }
- virtual ssize_t write(Process&, const byte*, size_t) override { return 0; }
+ virtual ssize_t read(Process&, byte*, ssize_t) override { return 0; }
+ virtual ssize_t write(Process&, const byte*, ssize_t) override { return 0; }
virtual bool can_read(Process&) const override { return true; }
virtual bool can_write(Process&) const override { return true; }
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp
index 11d1acd279..f7309930bc 100644
--- a/Kernel/Process.cpp
+++ b/Kernel/Process.cpp
@@ -199,8 +199,10 @@ int Process::sys$munmap(void* addr, size_t size)
return 0;
}
-int Process::sys$gethostname(char* buffer, size_t size)
+int Process::sys$gethostname(char* buffer, ssize_t size)
{
+ if (size < 0)
+ return -EINVAL;
if (!validate_write(buffer, size))
return -EFAULT;
LOCKER(*s_hostname_lock);
@@ -971,8 +973,10 @@ const FileDescriptor* Process::file_descriptor(int fd) const
return nullptr;
}
-ssize_t Process::sys$get_dir_entries(int fd, void* buffer, size_t size)
+ssize_t Process::sys$get_dir_entries(int fd, void* buffer, ssize_t size)
{
+ if (size < 0)
+ return -EINVAL;
if (!validate_write(buffer, size))
return -EFAULT;
auto* descriptor = file_descriptor(fd);
@@ -989,8 +993,10 @@ int Process::sys$lseek(int fd, off_t offset, int whence)
return descriptor->seek(offset, whence);
}
-int Process::sys$ttyname_r(int fd, char* buffer, size_t size)
+int Process::sys$ttyname_r(int fd, char* buffer, ssize_t size)
{
+ if (size < 0)
+ return -EINVAL;
if (!validate_write(buffer, size))
return -EFAULT;
auto* descriptor = file_descriptor(fd);
@@ -1005,8 +1011,10 @@ int Process::sys$ttyname_r(int fd, char* buffer, size_t size)
return 0;
}
-int Process::sys$ptsname_r(int fd, char* buffer, size_t size)
+int Process::sys$ptsname_r(int fd, char* buffer, ssize_t size)
{
+ if (size < 0)
+ return -EINVAL;
if (!validate_write(buffer, size))
return -EFAULT;
auto* descriptor = file_descriptor(fd);
@@ -1022,8 +1030,10 @@ int Process::sys$ptsname_r(int fd, char* buffer, size_t size)
return 0;
}
-ssize_t Process::sys$write(int fd, const void* data, size_t size)
+ssize_t Process::sys$write(int fd, const byte* data, ssize_t size)
{
+ if (size < 0)
+ return -EINVAL;
if (!validate_read(data, size))
return -EFAULT;
#ifdef DEBUG_IO
@@ -1074,26 +1084,21 @@ ssize_t Process::sys$write(int fd, const void* data, size_t size)
if (nwritten == 0)
return -EINTR;
}
-#ifdef DEBUG_IO
- dbgprintf("%s(%u) sys$write: nwritten=%u\n", name().characters(), pid(), nwritten);
-#endif
return nwritten;
}
-ssize_t Process::sys$read(int fd, void* outbuf, size_t nread)
+ssize_t Process::sys$read(int fd, byte* buffer, ssize_t size)
{
- if (!validate_write(outbuf, nread))
+ if (size < 0)
+ return -EINVAL;
+ if (!validate_write(buffer, size))
return -EFAULT;
#ifdef DEBUG_IO
- dbgprintf("%s(%u) sys$read(%d, %p, %u)\n", name().characters(), pid(), fd, outbuf, nread);
+ dbgprintf("%s(%u) sys$read(%d, %p, %u)\n", name().characters(), pid(), fd, buffer, size);
#endif
auto* descriptor = file_descriptor(fd);
if (!descriptor)
return -EBADF;
-#ifdef DEBUG_IO
- dbgprintf(" > descriptor:%p, is_blocking:%u, can_read:%u\n", descriptor, descriptor->is_blocking(), descriptor->can_read(*this));
- dbgprintf(" > inode:K%x, device:K%x\n", descriptor->inode(), descriptor->character_device());
-#endif
if (descriptor->is_blocking()) {
if (!descriptor->can_read(*this)) {
m_blocked_fd = fd;
@@ -1103,11 +1108,7 @@ ssize_t Process::sys$read(int fd, void* outbuf, size_t nread)
return -EINTR;
}
}
- nread = descriptor->read(*this, (byte*)outbuf, nread);
-#ifdef DEBUG_IO
- dbgprintf("%s(%u) Process::sys$read: nread=%u\n", name().characters(), pid(), nread);
-#endif
- return nread;
+ return descriptor->read(*this, buffer, size);
}
int Process::sys$close(int fd)
@@ -1221,8 +1222,10 @@ int Process::sys$stat(const char* path, stat* statbuf)
return 0;
}
-int Process::sys$readlink(const char* path, char* buffer, size_t size)
+int Process::sys$readlink(const char* path, char* buffer, ssize_t size)
{
+ if (size < 0)
+ return -EINVAL;
if (!validate_read_str(path))
return -EFAULT;
if (!validate_write(buffer, size))
@@ -1240,7 +1243,7 @@ int Process::sys$readlink(const char* path, char* buffer, size_t size)
if (!contents)
return -EIO; // FIXME: Get a more detailed error from VFS.
- memcpy(buffer, contents.pointer(), min(size, contents.size()));
+ memcpy(buffer, contents.pointer(), min(size, (ssize_t)contents.size()));
if (contents.size() + 1 < size)
buffer[contents.size()] = '\0';
return 0;
@@ -1260,8 +1263,10 @@ int Process::sys$chdir(const char* path)
return 0;
}
-int Process::sys$getcwd(char* buffer, size_t size)
+int Process::sys$getcwd(char* buffer, ssize_t size)
{
+ if (size < 0)
+ return -EINVAL;
if (!validate_write(buffer, size))
return -EFAULT;
auto path = VFS::the().absolute_path(cwd_inode());
@@ -1655,8 +1660,9 @@ bool Process::validate_read_str(const char* str)
return validate_read(str, strlen(str) + 1);
}
-bool Process::validate_read(const void* address, size_t size) const
+bool Process::validate_read(const void* address, ssize_t size) const
{
+ ASSERT(size >= 0);
LinearAddress first_address((dword)address);
LinearAddress last_address = first_address.offset(size - 1);
if (is_ring0()) {
@@ -1678,8 +1684,9 @@ bool Process::validate_read(const void* address, size_t size) const
return MM.validate_user_read(*this, first_address);
}
-bool Process::validate_write(void* address, size_t size) const
+bool Process::validate_write(void* address, ssize_t size) const
{
+ ASSERT(size >= 0);
LinearAddress first_address((dword)address);
LinearAddress last_address = first_address.offset(size - 1);
if (is_ring0()) {
diff --git a/Kernel/Process.h b/Kernel/Process.h
index 305ac0a789..480d8f2229 100644
--- a/Kernel/Process.h
+++ b/Kernel/Process.h
@@ -162,8 +162,8 @@ public:
mode_t sys$umask(mode_t);
int sys$open(const char* path, int options, mode_t mode = 0);
int sys$close(int fd);
- ssize_t sys$read(int fd, void* outbuf, size_t nread);
- ssize_t sys$write(int fd, const void*, size_t);
+ ssize_t sys$read(int fd, byte*, ssize_t);
+ ssize_t sys$write(int fd, const byte*, ssize_t);
int sys$fstat(int fd, stat*);
int sys$lstat(const char*, stat*);
int sys$stat(const char*, stat*);
@@ -178,17 +178,17 @@ public:
int sys$set_mmap_name(void*, size_t, const char*);
int sys$select(const Syscall::SC_select_params*);
int sys$poll(pollfd*, int nfds, int timeout);
- ssize_t sys$get_dir_entries(int fd, void*, size_t);
- int sys$getcwd(char*, size_t);
+ ssize_t sys$get_dir_entries(int fd, void*, ssize_t);
+ int sys$getcwd(char*, ssize_t);
int sys$chdir(const char*);
int sys$sleep(unsigned seconds);
int sys$usleep(useconds_t usec);
int sys$gettimeofday(timeval*);
- int sys$gethostname(char* name, size_t length);
+ int sys$gethostname(char*, ssize_t);
int sys$uname(utsname*);
- int sys$readlink(const char*, char*, size_t);
- int sys$ttyname_r(int fd, char*, size_t);
- int sys$ptsname_r(int fd, char*, size_t);
+ int sys$readlink(const char*, char*, ssize_t);
+ int sys$ttyname_r(int fd, char*, ssize_t);
+ int sys$ptsname_r(int fd, char*, ssize_t);
pid_t sys$fork(RegisterDump&);
int sys$execve(const char* filename, const char** argv, const char** envp);
int sys$isatty(int fd);
@@ -257,8 +257,8 @@ public:
bool validate_read_from_kernel(LinearAddress) const;
- bool validate_read(const void*, size_t) const;
- bool validate_write(void*, size_t) const;
+ bool validate_read(const void*, ssize_t) const;
+ bool validate_write(void*, ssize_t) const;
bool validate_read_str(const char* str);
template<typename T> bool validate_read_typed(T* value, size_t count = 1) { return validate_read(value, sizeof(T) * count); }
template<typename T> bool validate_write_typed(T* value, size_t count = 1) { return validate_write(value, sizeof(T) * count); }
diff --git a/Kernel/RandomDevice.cpp b/Kernel/RandomDevice.cpp
index 3544080528..156c3d582d 100644
--- a/Kernel/RandomDevice.cpp
+++ b/Kernel/RandomDevice.cpp
@@ -34,20 +34,20 @@ bool RandomDevice::can_read(Process&) const
return true;
}
-ssize_t RandomDevice::read(Process&, byte* buffer, size_t bufferSize)
+ssize_t RandomDevice::read(Process&, byte* buffer, ssize_t size)
{
const int range = 'z' - 'a';
- ssize_t nread = min(bufferSize, GoodBufferSize);
+ ssize_t nread = min(size, GoodBufferSize);
for (ssize_t i = 0; i < nread; ++i) {
dword r = myrand() % range;
- buffer[i] = 'a' + r;
+ buffer[i] = (byte)('a' + r);
}
return nread;
}
-ssize_t RandomDevice::write(Process&, const byte*, size_t bufferSize)
+ssize_t RandomDevice::write(Process&, const byte*, ssize_t size)
{
// FIXME: Use input for entropy? I guess that could be a neat feature?
- return min(GoodBufferSize, bufferSize);
+ return min(GoodBufferSize, size);
}
diff --git a/Kernel/RandomDevice.h b/Kernel/RandomDevice.h
index defaebff9d..e2113b7cf3 100644
--- a/Kernel/RandomDevice.h
+++ b/Kernel/RandomDevice.h
@@ -10,8 +10,8 @@ public:
private:
// ^CharacterDevice
- virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
- virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
+ virtual ssize_t read(Process&, byte*, ssize_t) override;
+ virtual ssize_t write(Process&, const byte*, ssize_t) override;
virtual bool can_read(Process&) const override;
virtual bool can_write(Process&) const override { return true; }
virtual const char* class_name() const override { return "RandomDevice"; }
diff --git a/Kernel/SlavePTY.cpp b/Kernel/SlavePTY.cpp
index 266b726600..ddbbcc3176 100644
--- a/Kernel/SlavePTY.cpp
+++ b/Kernel/SlavePTY.cpp
@@ -25,13 +25,13 @@ String SlavePTY::tty_name() const
return String::format("/dev/pts/%u", m_index);
}
-void SlavePTY::on_master_write(const byte* buffer, size_t size)
+void SlavePTY::on_master_write(const byte* buffer, ssize_t size)
{
- for (size_t i = 0; i < size; ++i)
+ for (ssize_t i = 0; i < size; ++i)
emit(buffer[i]);
}
-ssize_t SlavePTY::on_tty_write(const byte* data, size_t size)
+ssize_t SlavePTY::on_tty_write(const byte* data, ssize_t size)
{
return m_master->on_slave_write(data, size);
}
@@ -48,7 +48,7 @@ bool SlavePTY::can_read(Process& process) const
return TTY::can_read(process);
}
-ssize_t SlavePTY::read(Process& process, byte* buffer, size_t size)
+ssize_t SlavePTY::read(Process& process, byte* buffer, ssize_t size)
{
if (m_master->is_closed())
return 0;
diff --git a/Kernel/SlavePTY.h b/Kernel/SlavePTY.h
index 08d518e561..fb249ae8f7 100644
--- a/Kernel/SlavePTY.h
+++ b/Kernel/SlavePTY.h
@@ -8,7 +8,7 @@ class SlavePTY final : public TTY {
public:
virtual ~SlavePTY() override;
- void on_master_write(const byte*, size_t);
+ void on_master_write(const byte*, ssize_t);
unsigned index() const { return m_index; }
InodeIdentifier devpts_inode_id() const { return m_devpts_inode_id; }
@@ -17,11 +17,11 @@ public:
private:
// ^TTY
virtual String tty_name() const override;
- virtual ssize_t on_tty_write(const byte*, size_t) override;
+ virtual ssize_t on_tty_write(const byte*, ssize_t) override;
// ^CharacterDevice
virtual bool can_read(Process&) const override;
- virtual ssize_t read(Process&, byte*, size_t) override;
+ virtual ssize_t read(Process&, byte*, ssize_t) override;
virtual bool can_write(Process&) const override;
virtual const char* class_name() const override { return "SlavePTY"; }
virtual void close() override;
diff --git a/Kernel/Socket.h b/Kernel/Socket.h
index 33767b6ad7..d62154b089 100644
--- a/Kernel/Socket.h
+++ b/Kernel/Socket.h
@@ -30,8 +30,8 @@ public:
virtual void attach_fd(SocketRole) = 0;
virtual void detach_fd(SocketRole) = 0;
virtual bool can_read(SocketRole) const = 0;
- virtual ssize_t read(SocketRole, byte*, size_t) = 0;
- virtual ssize_t write(SocketRole, const byte*, size_t) = 0;
+ virtual ssize_t read(SocketRole, byte*, ssize_t) = 0;
+ virtual ssize_t write(SocketRole, const byte*, ssize_t) = 0;
virtual bool can_write(SocketRole) const = 0;
pid_t origin_pid() const { return m_origin_pid; }
diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp
index 2e7a4bf740..ecad66090d 100644
--- a/Kernel/Syscall.cpp
+++ b/Kernel/Syscall.cpp
@@ -77,11 +77,11 @@ static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2,
case Syscall::SC_open:
return current->sys$open((const char*)arg1, (int)arg2, (mode_t)arg3);
case Syscall::SC_write:
- return current->sys$write((int)arg1, (const void*)arg2, (size_t)arg3);
+ return current->sys$write((int)arg1, (const byte*)arg2, (ssize_t)arg3);
case Syscall::SC_close:
return current->sys$close((int)arg1);
case Syscall::SC_read:
- return current->sys$read((int)arg1, (void*)arg2, (size_t)arg3);
+ return current->sys$read((int)arg1, (byte*)arg2, (ssize_t)arg3);
case Syscall::SC_lseek:
return current->sys$lseek((int)arg1, (off_t)arg2, (int)arg3);
case Syscall::SC_kill:
diff --git a/Kernel/TTY.cpp b/Kernel/TTY.cpp
index afa3b98cd8..137213d2e7 100644
--- a/Kernel/TTY.cpp
+++ b/Kernel/TTY.cpp
@@ -24,12 +24,12 @@ void TTY::set_default_termios()
memcpy(m_termios.c_cc, default_cc, sizeof(default_cc));
}
-ssize_t TTY::read(Process&, byte* buffer, size_t size)
+ssize_t TTY::read(Process&, byte* buffer, ssize_t size)
{
return m_buffer.read(buffer, size);
}
-ssize_t TTY::write(Process&, const byte* buffer, size_t size)
+ssize_t TTY::write(Process&, const byte* buffer, ssize_t size)
{
#ifdef TTY_DEBUG
dbgprintf("TTY::write {%u} ", size);
diff --git a/Kernel/TTY.h b/Kernel/TTY.h
index eda6a1e209..b3ae8336b7 100644
--- a/Kernel/TTY.h
+++ b/Kernel/TTY.h
@@ -10,8 +10,8 @@ class TTY : public CharacterDevice {
public:
virtual ~TTY() override;
- virtual ssize_t read(Process&, byte*, size_t) override;
- virtual ssize_t write(Process&, const byte*, size_t) override;
+ virtual ssize_t read(Process&, byte*, ssize_t) override;
+ virtual ssize_t write(Process&, const byte*, ssize_t) override;
virtual bool can_read(Process&) const override;
virtual bool can_write(Process&) const override;
virtual int ioctl(Process&, unsigned request, unsigned arg) override final;
@@ -33,7 +33,7 @@ public:
void hang_up();
protected:
- virtual ssize_t on_tty_write(const byte*, size_t) = 0;
+ virtual ssize_t on_tty_write(const byte*, ssize_t) = 0;
void set_size(unsigned short columns, unsigned short rows);
TTY(unsigned major, unsigned minor);
diff --git a/Kernel/VirtualConsole.cpp b/Kernel/VirtualConsole.cpp
index 08bebe8624..acaf14686e 100644
--- a/Kernel/VirtualConsole.cpp
+++ b/Kernel/VirtualConsole.cpp
@@ -499,10 +499,10 @@ void VirtualConsole::on_sysconsole_receive(byte ch)
m_current_attribute = old_attribute;
}
-ssize_t VirtualConsole::on_tty_write(const byte* data, size_t size)
+ssize_t VirtualConsole::on_tty_write(const byte* data, ssize_t size)
{
InterruptDisabler disabler;
- for (size_t i = 0; i < size; ++i)
+ for (ssize_t i = 0; i < size; ++i)
on_char(data[i]);
return size;
}
diff --git a/Kernel/VirtualConsole.h b/Kernel/VirtualConsole.h
index e9e9cedfe0..d2aa8a1be0 100644
--- a/Kernel/VirtualConsole.h
+++ b/Kernel/VirtualConsole.h
@@ -23,7 +23,7 @@ private:
virtual void on_sysconsole_receive(byte) override;
// ^TTY
- virtual ssize_t on_tty_write(const byte*, size_t) override;
+ virtual ssize_t on_tty_write(const byte*, ssize_t) override;
virtual String tty_name() const override;
// ^CharacterDevice
diff --git a/Kernel/ZeroDevice.cpp b/Kernel/ZeroDevice.cpp
index 2b05281e0a..3527e85b55 100644
--- a/Kernel/ZeroDevice.cpp
+++ b/Kernel/ZeroDevice.cpp
@@ -17,15 +17,15 @@ bool ZeroDevice::can_read(Process&) const
return true;
}
-ssize_t ZeroDevice::read(Process&, byte* buffer, size_t bufferSize)
+ssize_t ZeroDevice::read(Process&, byte* buffer, ssize_t size)
{
- size_t count = min(GoodBufferSize, bufferSize);
- memset(buffer, 0, count);
+ ssize_t count = min(GoodBufferSize, size);
+ memset(buffer, 0, (size_t)count);
return count;
}
-ssize_t ZeroDevice::write(Process&, const byte*, size_t bufferSize)
+ssize_t ZeroDevice::write(Process&, const byte*, ssize_t size)
{
- return min(GoodBufferSize, bufferSize);
+ return min(GoodBufferSize, size);
}
diff --git a/Kernel/ZeroDevice.h b/Kernel/ZeroDevice.h
index ee7f2dde37..cfcb00db9c 100644
--- a/Kernel/ZeroDevice.h
+++ b/Kernel/ZeroDevice.h
@@ -10,8 +10,8 @@ public:
private:
// ^CharacterDevice
- virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
- virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
+ virtual ssize_t read(Process&, byte*, ssize_t) override;
+ virtual ssize_t write(Process&, const byte*, ssize_t) override;
virtual bool can_read(Process&) const override;
virtual bool can_write(Process&) const override { return true; }
virtual const char* class_name() const override { return "ZeroDevice"; }