Skip to content

Commit 91d50b3

Browse files
committed
impr: protecting tcp_server flags, initialization, write and getters
fix: monitor.peek unsafe
1 parent 5910762 commit 91d50b3

File tree

2 files changed

+51
-33
lines changed

2 files changed

+51
-33
lines changed

src/monitor.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,9 @@ class BridgeMonitor: public Stream {
9595
int peek() override {
9696
k_mutex_lock(&monitor_mutex, K_FOREVER);
9797
if (temp_buffer.available()) {
98+
int c = temp_buffer.peek();
9899
k_mutex_unlock(&monitor_mutex);
99-
return temp_buffer.peek();
100+
return c;
100101
}
101102
k_mutex_unlock(&monitor_mutex);
102103
return -1;

src/tcp_server.h

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -50,39 +50,35 @@ class BridgeTCPServer final: public Server {
5050
}
5151

5252
k_mutex_lock(&server_mutex, K_FOREVER);
53-
54-
String hostname = _addr.toString();
55-
_listening = bridge->call(TCP_LISTEN_METHOD, hostname, _port).result(listener_id);
56-
53+
if (!_listening){
54+
String hostname = _addr.toString();
55+
_listening = bridge->call(TCP_LISTEN_METHOD, hostname, _port).result(listener_id);
56+
}
5757
k_mutex_unlock(&server_mutex);
5858

5959
}
6060

6161
BridgeTCPClient<BufferSize> accept() {
6262

63-
if (!_listening) {
63+
k_mutex_lock(&server_mutex, K_FOREVER);
64+
65+
if (!_listening) { // Not listening -> return disconnected (invalid) client
66+
k_mutex_unlock(&server_mutex);
6467
return BridgeTCPClient<BufferSize>(*bridge, 0, false);
6568
}
6669

67-
if (_connected) {
70+
if (_connected) { // Connection already established return a client copy
71+
k_mutex_unlock(&server_mutex);
6872
return BridgeTCPClient<BufferSize>(*bridge, connection_id);
6973
}
7074

71-
k_mutex_lock(&server_mutex, K_FOREVER);
72-
75+
// Accept a connection
7376
const bool ret = bridge->call(TCP_ACCEPT_METHOD, listener_id).result(connection_id);
77+
_connected = ret;
7478

7579
k_mutex_unlock(&server_mutex);
76-
77-
if (ret) { // connection_id 0 marks an invalid connection
78-
_connected = true;
79-
return BridgeTCPClient<BufferSize>(*bridge, connection_id);
80-
} else {
81-
_connected = false;
82-
// Return invalid client
83-
return BridgeTCPClient<BufferSize>(*bridge, 0, false);
84-
}
85-
80+
// If no connection established return a disconnected (invalid) client
81+
return ret? BridgeTCPClient<BufferSize>(*bridge, connection_id) : BridgeTCPClient<BufferSize>(*bridge, 0, false);
8682
}
8783

8884
size_t write(uint8_t c) override {
@@ -92,24 +88,25 @@ class BridgeTCPServer final: public Server {
9288
size_t write(const uint8_t *buf, size_t size) override {
9389

9490
BridgeTCPClient<BufferSize> client = accept();
91+
if (!client) return 0;
9592

96-
if (client && _connected) {
97-
return client.write(buf, size);
93+
k_mutex_lock(&server_mutex, K_FOREVER);
94+
if (_connected) {
95+
size_t written = client.write(buf, size);
96+
k_mutex_unlock(&server_mutex);
97+
return written;
9898
}
99-
99+
k_mutex_unlock(&server_mutex);
100100
return 0;
101101
}
102102

103103
void close() {
104104
k_mutex_lock(&server_mutex, K_FOREVER);
105-
106105
String msg;
107-
const bool ret = bridge->call(TCP_CLOSE_LISTENER_METHOD, listener_id).result(msg);
108-
109-
if (ret) {
110-
_listening = false;
106+
if (_listening){
107+
_listening = !bridge->call(TCP_CLOSE_LISTENER_METHOD, listener_id).result(msg);
108+
// Debug msg?
111109
}
112-
113110
k_mutex_unlock(&server_mutex);
114111
}
115112

@@ -120,16 +117,36 @@ class BridgeTCPServer final: public Server {
120117
k_mutex_unlock(&server_mutex);
121118
}
122119

123-
bool is_listening() const {
124-
return _listening;
120+
bool is_listening() {
121+
k_mutex_lock(&server_mutex, K_FOREVER);
122+
bool out = _listening;
123+
k_mutex_unlock(&server_mutex);
124+
return out;
125125
}
126126

127-
uint16_t getPort() const {
128-
return _port;
127+
bool is_connected() {
128+
k_mutex_lock(&server_mutex, K_FOREVER);
129+
bool out = _connected;
130+
k_mutex_unlock(&server_mutex);
131+
return out;
132+
}
133+
134+
uint16_t getPort() {
135+
k_mutex_lock(&server_mutex, K_FOREVER);
136+
uint16_t port = _port;
137+
k_mutex_unlock(&server_mutex);
138+
return port;
139+
}
140+
141+
String getAddr() {
142+
k_mutex_lock(&server_mutex, K_FOREVER);
143+
String hostname = _addr.toString();
144+
k_mutex_unlock(&server_mutex);
145+
return hostname;
129146
}
130147

131148
operator bool() const {
132-
return _listening;
149+
return is_listening();
133150
}
134151

135152
using Print::write;

0 commit comments

Comments
 (0)