At Kingsmead, play started under overcast conditions as the Proteas took a 61-run lead over the visitors' first innings total of 334.
Kallis, playing in his 166th match, scored 115 (off 316 balls, 13 fours) before getting out and in doing so went past Rahul Dravid's tally of 13,288 runs in 164 matches by one run to end up as the third-highest run-getter in Test cricket history.
Ravindra Jadeja picked his second five-wicket haul in Test cricket, in his first match overseas, taking 5/128 from 55 overs. Zaheer Khan (1/75) too picked up a wicket in this session, his first of the innings. Mohammad Shami (1/72) had taken one on day three, while Ishant Sharma (0/88) and Rohit Sharma (0/22) were still searching for success.
Play started 30 minutes before schedule once again, as South Africa began at their overnight score of 299/5.
Rohit bowled the last ball of the 106th over that was pending and South Africa's 300-run mark came up in the very next, the first full over of the day. It was a day of milestones thereafter, particularly for Kallis.