Malawi started brightly, passing the ball around and bossing the midfield for a few minutes, but Bafana were quick to wrest control from the visitors and were two goals up inside 10 minutes.
Siboniso Gaxa sent in an early cross on four minutes, which was almost met by Majoro, but the ball was cleared by the Flames defence.
Bafana went ahead on six minutes, with a fantastic team goal. Tshabalala sent a long ball in, which Lerato Chabangu controlled confidently with a reverse flick behind his back on the edge of the goal area.
The Swallows man took a couple of steps into the box and had a shot, which was saved by Simplex Nthala. The goalkeeper could not hold on to it, however, and Majoro made not mistake from close range to get his debut goal for the national team.
Four minutes later, after some great work by Oupa Manyisa, Gaxa beat his man right at the corner flag and managed to pop the ball over his head before going down.
The ball bounced to Letsholonyane, who hit it across the face of goal, where Tshabalala and Majoro were waiting, and Shabba was the man to boot it home in midair for his 10th goal for South Africa.
The match opened up for the remainder of the half, with Malawi allowed some space, although they could not make anything of it.
Josephy Kamwendo had a couple of chances from free-kicks, and a shot from long range, but none were particularly convincing.
Meanwhile, Chabangu, Tshabalala and Manyisa had chances for Bafana, but again none looked too dangerous, and the match went into half-time at 2-0.
Malawi got a goal back at the beginning of the second half, when Siyabonga Sangweni was adjudged to have brought down Robert Ng'ambi in the area. Kamwendo stepped up to take the resulting spot-kick and beat Itumeleng Khune confidently high on the left.
Daine Klate came on for Shabba at the start of the second half, and Gordon Igesund brought on Tokelo Rantie and May Mahlangu for Majoro and Chabangu, respectively, soon after.
The new-look Bafana seemed to lose shape, and Malawi started to press after their opener, looking more dangerous, although neither keeper had much to do.
After some half-chances for Malawi, however, Bafana came back into the match.
With 15 minutes to go, Rantie was brought down by James Sangala in the box, and Mahlangu stepped up to convert the penalty and make it 3-1 to Bafana.
A few minutes later Rantie sent the ball across goal after a good move on the right, but it was palmed away by the keeper, with no South Africans there to collect the rebound.
In the final minutes of the match Klate sent a high cross into the box, after racing up the left wing, but Phala and Gaxa got in each other’s way and hesitated, and the ball was cleared.
Manyisa curled a shot in in injury time, but it was saved, and the match ended 3-1; a solid win for Bafana, although they let the game get away from them at times.