commit dda7ba4474085f3670e189030429bb64ae0d4b9f
parent 719083107210d0a69ffcb3f9fd1d14d900816f17
Author: kyle <kyle@0x30.net>
Date: Sat, 2 Jan 2016 21:54:21 -0700
sl: add protocol version to message header
- might as well do this now while the protocol is changing quite a bit
- mostly unused for now. this field is our ace in the hole.
Diffstat:
6 files changed, 46 insertions(+), 22 deletions(-)
diff --git a/server/sl b/server/sl
@@ -83,7 +83,7 @@ while (my $client_sock = $listen_sock->accept()) {
my $sths = prepare_stmt_handles($dbh);
while (1) {
- my ($msg_type, $msg) = recv_msg($client_sock);
+ my ($ver, $msg_type, $msg) = recv_msg($client_sock);
log_set_msg($msg_str[$msg_type]);
$dbh->begin_work;
@@ -101,7 +101,7 @@ while (my $client_sock = $listen_sock->accept()) {
}
log_set_msg('');
- send_msg($client_sock, $msg_type, $reply);
+ send_msg($client_sock, $ver, $msg_type, $reply);
}
}
print ">>>>>> got here\n";
@@ -110,8 +110,13 @@ print ">>>>>> got here\n";
sub recv_msg {
my ($sock) = @_;
- my $header = read_all($sock, 4);
- my ($msg_type, $msg_size) = unpack("nn", $header);
+ my $header = read_all($sock, 6);
+ my ($version, $msg_type, $msg_size) = unpack("nnn", $header);
+
+ if ($version != 0) {
+ log_print("error: unsupported protocol version $version\n");
+ exit 0;
+ }
if ($msg_type >= @msg_str) {
log_print("error: unknown message type $msg_type\n");
@@ -124,11 +129,11 @@ sub recv_msg {
}
elsif ($msg_size == 0) {
# don't try and do another read, as a read of size 0 is EOF
- return ($msg_type, "");
+ return ($version, $msg_type, "");
}
my $msg = read_all($sock, $msg_size);
- return ($msg_type, $msg);
+ return ($version, $msg_type, $msg);
}
sub read_all {
@@ -151,15 +156,15 @@ sub read_all {
}
sub send_msg {
- my ($sock, $msg_type, $msg) = @_;
+ my ($sock, $ver, $msg_type, $payload) = @_;
- my $hdr_length = 4;
- my $msg_length = length($msg);
+ my $header_len = 6;
+ my $payload_len = length($payload);
- send_all($sock, pack("nn", $msg_type, $msg_length), $hdr_length);
- send_all($sock, $msg, $msg_length);
+ send_all($sock, pack("nnn", $ver, $msg_type, $payload_len), $header_len);
+ send_all($sock, $payload, $payload_len);
- return $hdr_length + $msg_length;
+ return $header_len + $payload_len;
}
sub send_all {
diff --git a/server/tests/bad_msg_type/test.pl b/server/tests/bad_msg_type/test.pl
@@ -5,4 +5,4 @@ use test;
# send an invalid message type
my $sock = new_socket();
-print $sock pack("nn", 47837, 0);
+print $sock pack("nnn", 0, 47837, 0);
diff --git a/server/tests/bad_protocol_version/Makefile b/server/tests/bad_protocol_version/Makefile
@@ -0,0 +1 @@
+include ../test.mk
diff --git a/server/tests/bad_protocol_version/server.log.good b/server/tests/bad_protocol_version/server.log.good
@@ -0,0 +1,4 @@
+accepting connections on <ip>:<port> (pid = <digits>)
+new connection (pid = <digits>)
+ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256'
+error: unsupported protocol version 101
diff --git a/server/tests/bad_protocol_version/test.pl b/server/tests/bad_protocol_version/test.pl
@@ -0,0 +1,8 @@
+#!/usr/bin/perl -I../
+use strict;
+use warnings;
+use test;
+
+# send an invalid message type
+my $sock = new_socket();
+print $sock pack("nnn", 101, 0, 0);
diff --git a/server/tests/test.pm b/server/tests/test.pm
@@ -73,7 +73,7 @@ sub new_socket
if (time > $timeout) {
fail "server not ready after 5 seconds";
}
- usleep(100 * 1000);
+ usleep(50 * 1000);
next;
}
@@ -88,19 +88,21 @@ sub new_socket
}
sub send_msg {
- my ($sock, $msg_type, $msg) = @_;
+ my ($sock, $msg_type, $payload) = @_;
if (! exists $msg_num{$msg_type}) {
fail "send_msg: invalid message type '$msg_type'";
}
- my $hdr_length = 4;
- my $msg_length = length($msg);
+ my $header_len = 6;
+ my $version = 0;
+ my $num = $msg_num{$msg_type};
+ my $payload_len = length($payload);
- send_all($sock, pack("nn", $msg_num{$msg_type}, $msg_length), $hdr_length);
- send_all($sock, $msg, $msg_length);
+ send_all($sock, pack("nnn", $version, $num, $payload_len), $header_len);
+ send_all($sock, $payload, $payload_len);
- return $hdr_length + $msg_length;
+ return $header_len + $payload_len;
}
sub send_all {
@@ -120,8 +122,12 @@ sub send_all {
sub recv_msg {
my ($sock, $expected_type) = @_;
- my $header = read_all($sock, 4);
- my ($msg_type, $msg_size) = unpack("nn", $header);
+ my $header = read_all($sock, 6);
+ my ($version, $msg_type, $msg_size) = unpack("nnn", $header);
+
+ if ($version != 0) {
+ fail "recv_msg: unsupported protocol version $version";
+ }
if ($msg_type >= @msg_str) {
fail "recv_msg: unknown message type $msg_type";