Kernel: Writing to a slave PTY should yield EIO if the master is closed.

This commit is contained in:
Andreas Kling 2019-02-05 13:09:01 +01:00
parent 2a0700af9a
commit 0669ef8977
Notes: sideshowbarker 2024-07-19 15:51:24 +09:00
7 changed files with 14 additions and 8 deletions

View file

@ -61,13 +61,18 @@ void MasterPTY::notify_slave_closed(Badge<SlavePTY>)
m_slave = nullptr; m_slave = nullptr;
} }
void MasterPTY::on_slave_write(const byte* data, size_t size) ssize_t MasterPTY::on_slave_write(const byte* data, size_t size)
{ {
if (m_closed)
return -EIO;
m_buffer.write(data, size); m_buffer.write(data, size);
return size;
} }
bool MasterPTY::can_write_from_slave() const bool MasterPTY::can_write_from_slave() const
{ {
if (m_closed)
return true;
return m_buffer.bytes_in_write_buffer() < 4096; return m_buffer.bytes_in_write_buffer() < 4096;
} }

View file

@ -13,7 +13,7 @@ public:
unsigned index() const { return m_index; } unsigned index() const { return m_index; }
String pts_name() const; String pts_name() const;
void on_slave_write(const byte*, size_t); ssize_t on_slave_write(const byte*, size_t);
bool can_write_from_slave() const; bool can_write_from_slave() const;
void notify_slave_closed(Badge<SlavePTY>); void notify_slave_closed(Badge<SlavePTY>);
bool is_closed() const { return m_closed; } bool is_closed() const { return m_closed; }

View file

@ -33,9 +33,9 @@ void SlavePTY::on_master_write(const byte* buffer, size_t size)
emit(buffer[i]); emit(buffer[i]);
} }
void SlavePTY::on_tty_write(const byte* data, size_t size) ssize_t SlavePTY::on_tty_write(const byte* data, size_t size)
{ {
m_master->on_slave_write(data, size); return m_master->on_slave_write(data, size);
} }
bool SlavePTY::can_write(Process&) const bool SlavePTY::can_write(Process&) const

View file

@ -17,7 +17,7 @@ public:
private: private:
// ^TTY // ^TTY
virtual String tty_name() const override; virtual String tty_name() const override;
virtual void on_tty_write(const byte*, size_t) override; virtual ssize_t on_tty_write(const byte*, size_t) override;
// ^CharacterDevice // ^CharacterDevice
virtual bool can_read(Process&) const override; virtual bool can_read(Process&) const override;

View file

@ -33,7 +33,7 @@ public:
void hang_up(); void hang_up();
protected: protected:
virtual void on_tty_write(const byte*, size_t) = 0; virtual ssize_t on_tty_write(const byte*, size_t) = 0;
void set_size(unsigned short columns, unsigned short rows); void set_size(unsigned short columns, unsigned short rows);
TTY(unsigned major, unsigned minor); TTY(unsigned major, unsigned minor);

View file

@ -499,11 +499,12 @@ void VirtualConsole::on_sysconsole_receive(byte ch)
m_current_attribute = old_attribute; m_current_attribute = old_attribute;
} }
void VirtualConsole::on_tty_write(const byte* data, size_t size) ssize_t VirtualConsole::on_tty_write(const byte* data, size_t size)
{ {
InterruptDisabler disabler; InterruptDisabler disabler;
for (size_t i = 0; i < size; ++i) for (size_t i = 0; i < size; ++i)
on_char(data[i]); on_char(data[i]);
return size;
} }
String VirtualConsole::tty_name() const String VirtualConsole::tty_name() const

View file

@ -23,7 +23,7 @@ private:
virtual void on_sysconsole_receive(byte) override; virtual void on_sysconsole_receive(byte) override;
// ^TTY // ^TTY
virtual void on_tty_write(const byte*, size_t) override; virtual ssize_t on_tty_write(const byte*, size_t) override;
virtual String tty_name() const override; virtual String tty_name() const override;
// ^CharacterDevice // ^CharacterDevice