Browse Source

Kernel: Check can_write for blocking write

This way the socket write buffer sizes are respected, and things that
exceed them get sent EAGAIN.
Robin Burchell 6 years ago
parent
commit
d8b74c8c86
1 changed files with 4 additions and 2 deletions
  1. 4 2
      Kernel/Process.cpp

+ 4 - 2
Kernel/Process.cpp

@@ -853,8 +853,10 @@ ssize_t Process::sys$writev(int fd, const struct iovec* iov, int iov_count)
 ssize_t Process::do_write(FileDescriptor& descriptor, const byte* data, int data_size)
 ssize_t Process::do_write(FileDescriptor& descriptor, const byte* data, int data_size)
 {
 {
     ssize_t nwritten = 0;
     ssize_t nwritten = 0;
-    if (!descriptor.is_blocking())
-        return descriptor.write(data, data_size);
+    if (!descriptor.is_blocking()) {
+        if (!descriptor.can_write())
+            return -EAGAIN;
+    }
 
 
     while (nwritten < data_size) {
     while (nwritten < data_size) {
 #ifdef IO_DEBUG
 #ifdef IO_DEBUG