about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-07-07 06:57:43 +0000
committerEric Wong <e@80x24.org>2019-07-07 06:57:43 +0000
commit71e8a392d465bf4de60f37ecb3dec5cea5c3a376 (patch)
treee5cff0497bd65b1aacf2f0bbd1c59b54e6434f99
parenta3c054cbbf2a51be121b3237c5d223acc5c8a2f4 (diff)
downloadpublic-inbox-71e8a392d465bf4de60f37ecb3dec5cea5c3a376.tar.gz
Add some checks for errors at initialization, though there's not
much that can be done with ENOMEM-type errors aside from
dropping clients.

We can also get rid of the scary FIXME for MemLevel=8.  It was a
stupid error on my part in the original per-client deflate
stream implementation calling C::R::Z::{Inflate,Deflate} in
array context and getting the extra dualvar error code as a
string result, causing the {zin}/{zout} array refs to have
extra array elements.
-rw-r--r--lib/PublicInbox/NNTP.pm3
-rw-r--r--lib/PublicInbox/NNTPdeflate.pm33
2 files changed, 22 insertions, 14 deletions
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm
index 895858b7..6fee29f4 100644
--- a/lib/PublicInbox/NNTP.pm
+++ b/lib/PublicInbox/NNTP.pm
@@ -922,9 +922,8 @@ sub cmd_starttls ($) {
 # RFC 8054
 sub cmd_compress ($$) {
         my ($self, $alg) = @_;
-        return '503 Only the DEFLATE is supported' if uc($alg) ne 'DEFLATE';
+        return '503 Only DEFLATE is supported' if uc($alg) ne 'DEFLATE';
         return r502 if $self->compressed || !$have_deflate;
-        res($self, '206 Compression active');
         PublicInbox::NNTPdeflate->enable($self);
         $self->requeue;
         undef
diff --git a/lib/PublicInbox/NNTPdeflate.pm b/lib/PublicInbox/NNTPdeflate.pm
index 78da2a58..10e2337c 100644
--- a/lib/PublicInbox/NNTPdeflate.pm
+++ b/lib/PublicInbox/NNTPdeflate.pm
@@ -30,24 +30,33 @@ my %IN_OPT = (
 
 # global deflate context and buffer
 my $zbuf = \(my $buf = '');
-my $zout = Compress::Raw::Zlib::Deflate->new(
-        # nnrpd (INN) and Compress::Raw::Zlib favor MemLevel=9,
-        # but the zlib C library and git use MemLevel=8 as the default.
-        # FIXME: sometimes clients fail with 8, so we use 9
-        # -MemLevel => 9,
-
-        # needs more testing, nothing obviously different in terms of memory
-        -Bufsize => 65536,
+my $zout;
+{
+        my $err;
+        ($zout, $err) = Compress::Raw::Zlib::Deflate->new(
+                # nnrpd (INN) and Compress::Raw::Zlib favor MemLevel=9,
+                # the zlib C library and git use MemLevel=8 as the default
+                # -MemLevel => 9,
+                -Bufsize => 65536, # same as nnrpd
+                -WindowBits => -15, # RFC 1951
+                -AppendOutput => 1,
+        );
+        $err == Z_OK or die "Failed to initialize zlib deflate stream: $err";
+}
 
-        -WindowBits => -15, # RFC 1951
-        -AppendOutput => 1,
-);
 
 sub enable {
         my ($class, $self) = @_;
+        my ($in, $err) = Compress::Raw::Zlib::Inflate->new(%IN_OPT);
+        if ($err != Z_OK) {
+                $self->err("Inflate->new failed: $err");
+                $self->res('403 Unable to activate compression');
+                return;
+        }
         unlock_hash(%$self);
+        $self->res('206 Compression active');
         bless $self, $class;
-        $self->{zin} = [ Compress::Raw::Zlib::Inflate->new(%IN_OPT), '' ];
+        $self->{zin} = [ $in, '' ];
 }
 
 # overrides PublicInbox::NNTP::compressed