shlist

share and manage lists between multiple people
Log | Files | Refs

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:
Mserver/sl | 29+++++++++++++++++------------
Mserver/tests/bad_msg_type/test.pl | 2+-
Aserver/tests/bad_protocol_version/Makefile | 1+
Aserver/tests/bad_protocol_version/server.log.good | 4++++
Aserver/tests/bad_protocol_version/test.pl | 8++++++++
Mserver/tests/test.pm | 24+++++++++++++++---------
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";