Jochen Hecht also scored to help Buffalo improve to 10-8-3 with its second victory in nine games. Buffalo goalie Ryan Miller made 27 saves to snap a personal three-game losing streak.
Matt Hunwick and Phil Kessel scored for Boston (14-4-4), which had its four-game winning streak snapped. Boston's Tim Thomas stopped 20 shots in losing for the first time in regulation since a 3-2 defeat at Calgary on Oct. 30.
Roy opened the scoring at 9:18 of the first. While in the slot, Roy stole the puck off Boston's David Krejci's stick and quickly whipped a wrist shot past Thomas.
Buffalo upped its lead to 2-0 when Roy scored his sixth of the year with a snap shot from the bottom of the right circle that beat Thomas with 1 1/2 minutes left in the first.
Hunwick halved the deficit with his third of the season 4:31 into the second, and Hecht made it 3-1 30 seconds later with a short-handed goal.
Kessel cut the lead to 3-2 with his 11th with 10:35 left in the third period. Marc Savard slightly whiffed on his slap shot from the right circle, but got enough of it that Milan Lucic was able to steer it to Kessel, who deposited the puck into an empty net after Miller committed on Savard's shot.
This was already the fourth of six meetings between the two teams, and third this month. ... Thomas allowed more than two goals for the first time since the loss to Calgary, a span of seven straight starts. ... Sabres LW Thomas Vanek missed the last half of the second period after absorbing a hit along the boards by Lucic. Vanek returned for the third period. ... Buffalo debuted its third jersey, which is highlighted by the team's original logo. ... It was Roy's first two-goal game of the season. ... Kessel extended his points streak to seven games.