diff --git a/src/hammer.c b/src/hammer.c
index 0934a050c970d5aebe9221db56def26fbba6e3b4..85a7fc2f33afa051302e880ce60e1c16917005bb 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -426,6 +426,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_not_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;
 }