Romain Grosjean took his fifth GP2 win of the season at the Hungaroring after race-long leader Marcus Ericsson was given a drive-through penalty in the closing stages.
Ericsson had led the race from the first lap after jumping front row starters Luiz Razia and Luca Filippi in the race to Turn 1.
From there the iSport driver controlled the race while AirAsia driver Razia kept third-placed Grosjean at bay in the opening stint. But the championship leader was able to jump the pole-sitter by pitting one lap earlier than him.
Ericsson maintained his lead during the stops, but as he left the pits he was released into the path of the incoming Razia, prompting an investigation by the stewards. It was another eight laps before confirmation of the penalty came through, and Ericsson rejoined the race in sixth after serving his drive-through.
Before that DAMS driver Grosjean had closed the gap down to as little as 1.5 seconds, but Ericsson never looked unsettled in the lead.
Grosjean had an easy final seven laps once the Swede was out of the way, as behind him Coloni driver Filippi ran into tyre trouble due to pitting earlier than most of the frontrunners.
The Italian had been hassling Grosjean shortly after the tyre changes, but he eventually fell behind Charles Pic (Addax), Razia, Giedo van der Garde (Addax) and a recovering Ericsson.
Pic had passed Razia while they fought their way through some slower cars that were yet to pit during the middle of the race, and once he was clear of Filippi he set an impressive pace to hunt down a cruising Grosjean to the flag.
The final points places - and therefore the front row on the grid for Sunday's sprint race - went to old F3 Euro Series rivals Jules Bianchi (ART) and Christian Vietoris (Racing Engineering).
The pair had run as low as 10th and 11th after the stops, but they fought their way past Sam Bird (iSport), Dani Clos (Racing Engineering) and Fabio Leimer (Rapax) in a thrilling midfield scrap.
Bird, who had made up ground by pitting on lap 10, ended up in so much trouble with his rear tyres that he was forced to make a second stop as he dropped down the field.
Results - 38 laps:
Pos Driver Team Time/Gap
1. Romain Grosjean DAMS 1h00m36.334s
2. Charles Pic Addax + 2.641s
3. Luiz Razia AirAsia + 8.107s
4. Giedo van der Garde Addax + 15.161s
5. Marcus Ericsson iSport + 18.864s
6. Luca Filippi Coloni + 21.636s
7. Jules Bianchi ART + 24.891s
8. Christian Vietoris Racing Engineering + 35.059s
9. Josef Kral Arden + 43.516s
10. Dani Clos Racing Engineering + 46.289s
11. Fabio Leimer Rapax + 46.685s
12. Michael Herck Coloni + 51.910s
13. Pal Varhaug DAMS + 52.107s
14. Kevin Mirocha Ocean + 52.826s
15. Michael Aleshin Carlin + 53.120s
16. Davide Valsecchi AirAsia + 53.335s
17. Sam Bird iSport + 56.655s
18. Max Chilton Carlin + 56.776s
19. Adam Carroll Super Nova + 57.839s
20. Julian Leal Rapax + 58.286s
21. Stefano Coletti Trident + 1m10.982s
22. Jolyon Palmer Arden + 1 lap
Rodolfo Gonzalez Trident 21 laps
Esteban Gutierrez ART 4 laps
Fairuz Fauzy Super Nova 0 laps
Johnny Cecotto Ocean 0 laps