Skip to content

Commit 603a944

Browse files
authored
Merge pull request #1254 from fwsGonzo/dev
websocket: Discard streams not fully connected
2 parents 6180dc9 + 5a88ec9 commit 603a944

2 files changed

Lines changed: 29 additions & 21 deletions

File tree

src/arch/x86/ioapic.cpp

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,28 @@ namespace x86
3434
{
3535
struct ioapic
3636
{
37-
uint32_t read(uint8_t reg) const noexcept {
38-
auto volatile* addr = (uint32_t volatile*) this->base;
39-
addr[0] = reg;
40-
return addr[4];
37+
struct io_regs {
38+
volatile uint32_t reg;
39+
uint32_t pad1[3];
40+
volatile uint32_t val;
41+
uint32_t pad2[3];
42+
};
43+
44+
uint32_t read(uint8_t reg) noexcept {
45+
base->reg = reg;
46+
return base->val;
4147
}
42-
void write(uint8_t reg, uint32_t value) {
43-
auto volatile* addr = (uint32_t volatile*) this->base;
44-
addr[0] = reg;
45-
addr[4] = value;
48+
void write(uint8_t reg, uint32_t value) noexcept {
49+
base->reg = reg;
50+
base->val = value;
4651
}
4752
void set_entry(uint8_t index, uint32_t lo, uint32_t hi)
4853
{
4954
assert(index < entries());
5055
write(IOAPIC_INTR + index * 2 + 1, hi);
5156
write(IOAPIC_INTR + index * 2, lo);
5257
}
53-
void set_id(uint32_t id)
58+
void set_id(uint32_t id) noexcept
5459
{
5560
write(IOAPIC_ID, id << 24);
5661
}
@@ -60,27 +65,25 @@ namespace x86
6065
return entries_;
6166
}
6267

63-
void init(uintptr_t base)
68+
void init(uintptr_t base_addr)
6469
{
65-
this->base = base;
70+
INFO("IOAPIC", "Initializing");
71+
this->base = (decltype(base)) base_addr;
6672
// required: set IOAPIC ID
6773
set_id(0);
6874
// number of redirection entries supported
69-
entries_ = read(IOAPIC_VER) >> 16;
70-
entries_ = 1 + (entries_ & 0xff);
75+
auto reg = read(IOAPIC_VER) >> 16;
76+
this->entries_ = 1 + (reg & 0xff);
7177

72-
INFO("IOAPIC", "Initializing");
73-
INFO2("Base addr: 0x%x Redirection entries: %u", base, entries());
78+
INFO2("Base addr: %p Redirection entries: %u", base, entries());
7479

7580
// default: all entries disabled
7681
for (unsigned i = 0; i < entries(); i++)
7782
set_entry(i, IOAPIC_IRQ_DISABLE, 0);
78-
79-
INFO("IOAPIC", "Done");
8083
}
8184

82-
uintptr_t base;
83-
uint32_t entries_;
85+
io_regs* base;
86+
uint32_t entries_;
8487
};
8588
// there can be more than one IOAPIC
8689
static ioapic numbawan;

src/net/http/websocket.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,13 @@ WebSocket_ptr WebSocket::upgrade(Request& req, Response_writer& writer)
186186
writer.write_header(http::Switching_Protocols);
187187

188188
auto stream = writer.connection().release();
189-
assert(stream->is_connected());
190-
return std::make_unique<WebSocket>(std::move(stream), false);
189+
190+
// discard streams which can be FIN-WAIT-1
191+
if (stream->is_connected()) {
192+
// for now, only accept fully connected streams
193+
return std::make_unique<WebSocket>(std::move(stream), false);
194+
}
195+
return nullptr;
191196
}
192197

193198
WebSocket_ptr WebSocket::upgrade(Error err, Response& res, Connection& conn, const std::string& key)

0 commit comments

Comments
 (0)