Modifier ChristmasDinner::nonReentrant does not set the locked variable to true allowing to reenter the functions protected by nonReentrant modifier.
Modifier nonReentrant is implemented as below:
The modifier relies on the locked variable to lock the contract, but it never sets locked to true.
Function ChristmasDinner::_refundETH does not follow CEI pattern, but it relies on the nonReentrant modifier to protect from reentrancy attacks. Since the nonReentrant is implemented incorrectly and it does not set the locked variable to true, this protection does not work and allows to drain the contract eth balance.
Manual review
Set locked variable to true after checking its value as below:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.