Cardiff had a late goal disallowed as they missed out on moving level with second-placed Derby after a 1-1 draw at Millwall.
Junior Hoilett’s early strike had put them on course to climb above Aston Villa and from fourth into third, maintaining their pursuit of automatic promotion to the Premier League.
But Millwall, on a night Tim Cahill made his second debut for the club as a late substitute, responded through Lee Gregory and were superior until Sol Bamba’s late finish was ruled out after referee Keith Stroud blew for a foul on Joe Bennett by Steve Morison.
Cardiff took advantage of the hosts’ uncertain start by scoring as early as the third minute.
Mahlon Romeo dithered on the ball in midfield, allowing Hoilett to steal possession, run into space towards the edge of the area and powerfully shoot into the bottom-left corner beyond Jordan Archer.
It took until mid-way through the first half before Millwall regained their composure but they convinced when they did.
Their captain Morison did well to control Ben Marshall’s left-wing cross, turn, and shoot from in front of goal and was unfortunate to hit the crossbar.
His strike partner Gregory then threatened with a shot that went just wide of the left post, before bringing his team level in the 40th minute.
A flick-on from Morison sent Jed Wallace into space on the right wing, and after he sent a low cross towards Gregory, the striker sent a superb, first-time curling finish from in front of goal high above Neil Etheridge but under the bar.
Wallace also went close in the second half before Bamba sent a close-range bicycle kick into the back of the net and saw a fine goal harshly disallowed by Stroud because of Morison’s challenge on Bennett on the edge of the area.
Furthering the visitors’ frustration, a header from Callum Paterson was then cleared off the line by George Saville as their late pressure went without reward.