Skip to content

Commit 10e8fab

Browse files
teotwakibjoernQ
authored andcommitted
Refactor Socket::write to prevent infinite loop on long writes (esp-rs#151)
1 parent fdddaf5 commit 10e8fab

File tree

1 file changed

+20
-43
lines changed

1 file changed

+20
-43
lines changed

esp-wifi/src/wifi_interface.rs

Lines changed: 20 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -447,16 +447,14 @@ impl<'s, 'n: 's> Read for Socket<'s, 'n> {
447447
impl<'s, 'n: 's> Write for Socket<'s, 'n> {
448448
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
449449
loop {
450-
self.network.with_mut(|interface, device, sockets| {
451-
interface.poll(
452-
Instant::from_millis((self.network.current_millis_fn)() as i64),
453-
device,
454-
sockets,
455-
)
456-
});
457-
458450
let (may_send, is_open, can_send) =
459-
self.network.with_mut(|_interface, _device, sockets| {
451+
self.network.with_mut(|interface, device, sockets| {
452+
interface.poll(
453+
Instant::from_millis((self.network.current_millis_fn)() as i64),
454+
device,
455+
sockets,
456+
);
457+
460458
let socket = sockets.get_mut::<TcpSocket>(self.socket_handle);
461459

462460
(socket.may_send(), socket.is_open(), socket.can_send())
@@ -466,50 +464,29 @@ impl<'s, 'n: 's> Write for Socket<'s, 'n> {
466464
break;
467465
}
468466

469-
if !is_open {
470-
return Err(IoError::SocketClosed);
471-
}
472-
473-
if !can_send {
467+
if !is_open || !can_send {
474468
return Err(IoError::SocketClosed);
475469
}
476470
}
477471

472+
let mut written = 0;
478473
loop {
479-
let res = self.network.with_mut(|interface, device, sockets| {
480-
interface.poll(
481-
Instant::from_millis((self.network.current_millis_fn)() as i64),
482-
device,
483-
sockets,
484-
)
485-
});
474+
self.flush()?;
486475

487-
if let false = res {
476+
self.network.with_mut(|_interface, _device, sockets| {
477+
sockets
478+
.get_mut::<TcpSocket>(self.socket_handle)
479+
.send_slice(&buf[written..])
480+
.map(|len| written += len)
481+
.map_err(IoError::TcpSendError)
482+
})?;
483+
484+
if written >= buf.len() {
488485
break;
489486
}
490487
}
491488

492-
let res = self.network.with_mut(|_interface, _device, sockets| {
493-
let socket = sockets.get_mut::<TcpSocket>(self.socket_handle);
494-
495-
let mut written = 0;
496-
loop {
497-
match socket.send_slice(&buf[written..]) {
498-
Ok(len) => {
499-
written += len;
500-
501-
if written >= buf.len() {
502-
break Ok(written);
503-
}
504-
505-
log::info!("not fully written: {}", len);
506-
}
507-
Err(err) => break Err(IoError::TcpSendError(err)),
508-
}
509-
}
510-
});
511-
512-
res
489+
Ok(written)
513490
}
514491

515492
fn flush(&mut self) -> Result<(), Self::Error> {

0 commit comments

Comments
 (0)