Adding Coyote Time and Jumpbuffer gave player infinite jumps.

I followed a Youtube Tutorial on how to make Coyote jump and also a jumpBuffer using the same method.
But the problem is that the player can now jump in air, and I really do not understand how this is even possible. So i don’t know how to fix this.
I thought of implementing a InputBuffer using Queue, but I think that is just overkill for only one input. So would rather find some kind of solution instead of trying something completely different.

[Header("Player Accesiblility")]
    public float hangTime = 1.5f;
    private float hangCounter;
    public float jumpBufferLength = 0.1f;
    private float jumpBufferCount;

     void Update()
     {
          if (coll.onGround) //Coyote Time for Jump
        {
            hangCounter = hangTime;
        }
        else
        {
            hangCounter -= Time.deltaTime;
        }

        //Jump Buffer
        if (Input.GetButtonDown("Jump"))
        {
            jumpBufferCount = jumpBufferLength;
        }
        else
        {
            jumpBufferCount -= Time.deltaTime;
        }
  

        if (jumpBufferCount >= 0 && hangCounter > 0f) //Jump Function
         {
            anim.SetTrigger("jump");

                Debug.Log("Jump");
                dustParticle.Play();
                Jump(Vector2.up, false);
                jumpBufferCount = 0;

            if (coll.onWall && !coll.onGround)
             {

                WallJump();
             }
         }

coll.onGround is from another script, where I just used OverLapCircle.

onGround = Physics2D.OverlapCircle((Vector2)transform.position + bottomOffset, collisionRadius, groundLayer);

I’ll write a little draft of how I’d do it and hope it’ll be of use to you.

        private bool _isGrounded;
        private bool _canCoyoteJump;
        private float _coyoteTime;
        private float _coyoteTimeDuration;
        private bool CanCoyoteJump => _canCoyoteJump && _coyoteTime < _coyoteTimeDuration;
       
        private void AttemptJumping()
        {
            if (_isGrounded)
            {
                Jump();
            }
            else
            {
                if (!CanCoyoteJump)
                {
                    BufferJumpInput();
                    return;
                }
                else
                {
                    StopCoyoteTimer();
                    Jump();
                }
            }
        }   

        private void Jump()
        {
            // Jump logic
        }

        // Insert this in FixedUpdate
        private void CheckGround()
        {
            // Raycasting downwards to look for ground
            bool foundGround;

            if (foundGround)
            {
                // If found ground but was not grounded, we just landed
                if (!_isGrounded)
                {
                    UseJumpBuffer();
                }

                _isGrounded = true;
            }
            else
            {
                // Didn't find ground now, but was grounded in the last check
                // means we just left ground
                if (_isGrounded)
                {
                    StartCoyoteTimer();
                }

                _isGrounded = false;
            }

        }

        private void UseJumpBuffer()
        {
            // If there's a jump input in the buffer, make the char jump
        }

        private void BufferJumpInput()
        {
            // Insert input in the buffer if there isn't
        }

        private void StartCoyoteTimer()
        {
            // Enable coyote jump and start the timer
        }

        private void StopCoyoteTimer()
        {
            // Disable coyote jump and prevent further jumps
        }

Cheers.