diff --git a/src/core/surface/call.c b/src/core/surface/call.c
index 7ab914294744b942074cf4beb3379e57d71b1fc1..57be72f9ab36c31b04fdd0fda8834593ec527abc 100644
--- a/src/core/surface/call.c
+++ b/src/core/surface/call.c
@@ -711,6 +711,10 @@ static void call_on_done_recv(void *pc, int success) {
           break;
       }
     }
+    if (!success) {
+      grpc_stream_ops_unref_owned_objects(&call->recv_ops.ops[i],
+                                          call->recv_ops.nops - i);
+    }
     if (call->recv_state == GRPC_STREAM_RECV_CLOSED) {
       GPR_ASSERT(call->read_state <= READ_STATE_READ_CLOSED);
       call->read_state = READ_STATE_READ_CLOSED;