diff --git a/src/hammer.c b/src/hammer.c
index 3bbd53791987ebc80a4a7d32408feac9adcf4cdf..f02321d954207693b12f3871116c87c07b80b8ca 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -457,6 +457,7 @@ static void test_action(void) {
   
   g_check_parse_ok(action_, "ab", 2, "(u0x41 u0x42)");
   g_check_parse_ok(action_, "AB", 2, "(u0x41 u0x42)");
+  g_check_parse_failed(action_, "XX", 2);
 }
 
 static void test_in(void) {
diff --git a/src/parsers/action.c b/src/parsers/action.c
index c5b89f9a11154c158359e164a665f0b2ee5d186c..479a840cd8382db524762241ade0d2605ec2416f 100644
--- a/src/parsers/action.c
+++ b/src/parsers/action.c
@@ -10,8 +10,11 @@ static HParseResult* parse_action(void *env, HParseState *state) {
   if (a->p && a->action) {
     HParseResult *tmp = h_do_parse(a->p, state);
     //HParsedToken *tok = a->action(h_do_parse(a->p, state));
-    const HParsedToken *tok = a->action(tmp);
-    return make_result(state, (HParsedToken*)tok);
+    if(tmp) {
+        const HParsedToken *tok = a->action(tmp);
+        return make_result(state, (HParsedToken*)tok);
+    } else
+      return NULL;
   } else // either the parser's missing or the action's missing
     return NULL;
 }