bug fix: return after callback(err)