Ahh, yes, after a quick look at the code, this could be very possible.
The Roster’s connection listener resets the roster state on connectionTerminated(), which is called in both cases, i.e. a clean termination and an unclean one. But in case of an unclean one, SM may be used. In which case the roster state should be kept.