diff --git a/src/backends/llk.c b/src/backends/llk.c
index 2f41f9122c8ed76fe414c7ece16523cea87cd9fb..3780cf1b078b35b230a606182e510ee461b48da4 100644
--- a/src/backends/llk.c
+++ b/src/backends/llk.c
@@ -389,6 +389,13 @@ static HCountedArray *llk_parse_chunk_(HLLkState *s, const HParser* parser,
   if(!seq)
     return NULL;  // parse already failed
 
+  // out-of-memory handling
+  jmp_buf except;
+  h_arena_set_except(arena, &except);
+  h_arena_set_except(tarena, &except);
+  if(setjmp(except))
+    goto no_parse;
+
   if(s->win.length > 0) {
     append_win(kmax, s, chunk);
     stream = &s->win;
@@ -530,8 +537,6 @@ static HCountedArray *llk_parse_chunk_(HLLkState *s, const HParser* parser,
   return seq;
 
  no_parse:
-  h_delete_arena(arena);
-  s->arena = NULL;
   return NULL;
 
  need_input:
@@ -550,6 +555,8 @@ static HParseResult *llk_parse_finish_(HAllocator *mm__, HLLkState *s)
   if(s->seq) {
     assert(s->seq->used == 1);
     res = make_result(s->arena, s->seq->elements[0]);
+  } else {
+    h_delete_arena(s->arena);
   }
 
   h_delete_arena(s->tarena);
@@ -561,17 +568,6 @@ HParseResult *h_llk_parse(HAllocator* mm__, const HParser* parser, HInputStream*
 {
   HLLkState *s = llk_parse_start_(mm__, parser);
 
-  // out-of-memory handling
-  jmp_buf except;
-  h_arena_set_except(s->arena, &except);
-  h_arena_set_except(s->tarena, &except);
-  if(setjmp(except)) {
-    h_delete_arena(s->arena);
-    h_delete_arena(s->tarena);
-    h_free(s);
-    return NULL;
-  }
-
   assert(stream->last_chunk);
   s->seq = llk_parse_chunk_(s, parser, stream);