Index: og_user_roles.module
===================================================================
--- og_user_roles.module	(revision 1626)
+++ og_user_roles.module	(working copy)
@@ -341,16 +341,19 @@
  * @see og_user_roles_init()
  */
 function og_user_roles_grant_roles(&$account, $group_node = NULL) {
-  static $roles;
+  static $roles = array();
 
   // Sanity check for first and repeated calls.
   // @see og_user_roles_init()
   // @see og_user_roles_user()
-  if (!isset($group_node) && !isset($roles)) {
+  if (!is_object($group_node)) {
     return array();
   }
 
-  if (!isset($roles)) {
+  if (!isset($roles[$account->uid][$group_node->nid])) {
+    // Set the cache array to avoid running this again, if the query
+    // returns empty
+    $roles[$account->uid][$group_node->nid] = array();
     // Retrieve additional roles for current context.
     $args = array($group_node->nid);
     $placeholders = db_placeholders($args);
@@ -358,15 +361,13 @@
     // INNER JOIN as extra sanity check (not only for role name).
     $result = db_query("SELECT ogur.rid, r.name FROM {og_users_roles} ogur INNER JOIN {role} r ON r.rid = ogur.rid WHERE ogur.uid = %d AND ogur.gid IN ($placeholders)", $args);
     while ($role = db_fetch_object($result)) {
-      // Add roles to account first, so we can statically cache all roles
-      // afterwards.
-      $account->roles[$role->rid] = $role->name;
+      $roles[$account->uid][$group_node->nid][$role->rid] = $role->name;
     }
-    $roles = $account->roles;
   }
-  else {
-    // Grant all stored roles.
-    $account->roles = $roles;
+
+  // Merge in the granted roles, if any
+  foreach ($roles[$account->uid][$group_node->nid] as $rid => $role) {
+    $account->roles[$rid] = $role;
   }
 
   // Reload user permissions.
