Skip to content
Snippets Groups Projects
Commit d218c8de authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

"Handle" frames with a data length of zero.

These frames were already not allowed in the binkp/1.0 protocol,
and it is mentioned in the spec (issued in 2005) as "Some old
implementations do send empty frames as the last frame.".

It's certainly not allowed now, and any mailer which does it is
broken.

For zero-length data packets, it will be seen as a frame containing
zero data bytes which will also be logged as being after the file
if it comes after the file has already been completely transferred.

A zero-length command packet will abort with M_ERR, logging an error
regarding command number NaN or something like that.

This may fix #185 since attempting a recv() of zero bytes and
succeeding is the only way I can see for a zero second timeout to
have been logged in receving frame data.  The software assumed that
receiving zero bytes was a timeout, but if that's what you asked for,
it's actually success.
parent a754d85c
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
...@@ -1096,28 +1096,33 @@ BinkP.prototype.recvFrame = function(timeout) ...@@ -1096,28 +1096,33 @@ BinkP.prototype.recvFrame = function(timeout)
else else
ret = this.partialFrame; ret = this.partialFrame;
i = this.recv_buf(this.sock.recv(ret.length - ret.data.length, timeout)); if (ret.length == 0) {
if (i == null) { log(LOG_WARNING, "Remote illegally sent a "+(ret.is_cmd ? 'Command' : 'Data')+" packet with data length of zero. This isn't even allowed in protocol 1.0.");
log(LOG_INFO, "Error in recv() of packet data");
this.sock.close();
this.sock = undefined;
return undefined;
} }
if (i.length == 0) { else {
if (!this.sock.is_connected) { i = this.recv_buf(this.sock.recv(ret.length - ret.data.length, timeout));
log(LOG_DEBUG, "Remote host closed socket"); if (i == null) {
log(LOG_INFO, "Error in recv() of packet data");
this.sock.close(); this.sock.close();
this.sock = undefined; this.sock = undefined;
return undefined; return undefined;
} }
else if (timeout) { if (i.length == 0) {
log(LOG_WARNING, "Timed out receiving packet data from remote: " + this.remote_addrs); if (!this.sock.is_connected) {
this.sock.close(); log(LOG_DEBUG, "Remote host closed socket");
this.sock = undefined; this.sock.close();
return undefined; this.sock = undefined;
return undefined;
}
else if (timeout) {
log(LOG_WARNING, "Timed out receiving packet data from remote: " + this.remote_addrs);
this.sock.close();
this.sock = undefined;
return undefined;
}
} }
ret.data += i;
} }
ret.data += i;
if (ret.data.length < ret.length) if (ret.data.length < ret.length)
this.partialFrame = ret; this.partialFrame = ret;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment