Program: 33883
Project: 33883
Buggy source:
/** 
 * Removes perms for a player who was on one island and is now elsewhere If fromIsland and toIsland are the same, then the player is just out of their protection zone and if timing is allowed, they will keep their fly capability
 * @param player
 * @param fromIsland
 * @param toIsland
 */
public void removeTempPerms(final Player player,Island fromIsland,Island toIsland){
  if (DEBUG)   plugin.getLogger().info("String_Node_Str");
  if (VaultHelper.checkPerm(player,Settings.PERMPREFIX + "String_Node_Str")) {
    if (toIsland != null && fromIsland.equals(toIsland)) {
      if (player.isFlying() && player.getGameMode().equals(GameMode.SURVIVAL)) {
        if (DEBUG)         plugin.getLogger().info("String_Node_Str" + Settings.flyTimeOutside + "String_Node_Str");
        if (Settings.flyTimeOutside == 0) {
          player.setAllowFlight(false);
          player.setFlying(false);
          if (DEBUG)           plugin.getLogger().info("String_Node_Str");
        }
 else {
          plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin,new Runnable(){
            @Override public void run(){
              if (!plugin.getGrid().playerIsOnIsland(player) && player.isFlying()) {
                if (player.getGameMode().equals(GameMode.SURVIVAL)) {
                  player.setAllowFlight(false);
                  player.setFlying(false);
                  if (DEBUG)                   plugin.getLogger().info("String_Node_Str");
                }
              }
            }
          }
,20 * Settings.flyTimeOutside);
        }
      }
    }
 else {
      if (DEBUG)       plugin.getLogger().info("String_Node_Str");
      if (player.getGameMode().equals(GameMode.SURVIVAL)) {
        player.setAllowFlight(false);
        player.setFlying(false);
        if (DEBUG)         plugin.getLogger().info("String_Node_Str");
      }
    }
  }
  for (  String perm : Settings.temporaryPermissions) {
    if (temporaryPerms.containsKey(player.getUniqueId()) && VaultHelper.checkPerm(player,perm)) {
      VaultHelper.removePerm(player,perm);
      if (DEBUG)       plugin.getLogger().info("String_Node_Str" + perm);
      List<String> perms=temporaryPerms.get(player.getUniqueId());
      perms.remove(perm);
      if (perms.isEmpty())       temporaryPerms.remove(player.getUniqueId());
 else       temporaryPerms.put(player.getUniqueId(),perms);
    }
  }
}

Fixed version (ground truth):
/** 
 * Removes perms for a player who was on one island and is now elsewhere If fromIsland and toIsland are the same, then the player is just out of their protection zone and if timing is allowed, they will keep their fly capability
 * @param player
 * @param fromIsland
 * @param toIsland
 */
public void removeTempPerms(final Player player,Island fromIsland,Island toIsland){
  if (DEBUG)   plugin.getLogger().info("String_Node_Str");
  if (player.hasMetadata("String_Node_Str")) {
    return;
  }
  if (VaultHelper.checkPerm(player,Settings.PERMPREFIX + "String_Node_Str")) {
    if (toIsland != null && fromIsland.equals(toIsland)) {
      if (player.isFlying() && player.getGameMode().equals(GameMode.SURVIVAL)) {
        if (DEBUG)         plugin.getLogger().info("String_Node_Str" + Settings.flyTimeOutside + "String_Node_Str");
        if (Settings.flyTimeOutside == 0) {
          player.setAllowFlight(false);
          player.setFlying(false);
          if (DEBUG)           plugin.getLogger().info("String_Node_Str");
        }
 else {
          plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin,new Runnable(){
            @Override public void run(){
              if (!plugin.getGrid().playerIsOnIsland(player) && player.isFlying()) {
                if (player.getGameMode().equals(GameMode.SURVIVAL)) {
                  player.setAllowFlight(false);
                  player.setFlying(false);
                  if (DEBUG)                   plugin.getLogger().info("String_Node_Str");
                }
              }
            }
          }
,20 * Settings.flyTimeOutside);
        }
      }
    }
 else {
      if (DEBUG)       plugin.getLogger().info("String_Node_Str");
      if (player.getGameMode().equals(GameMode.SURVIVAL)) {
        player.setAllowFlight(false);
        player.setFlying(false);
        if (DEBUG)         plugin.getLogger().info("String_Node_Str");
      }
    }
  }
  for (  String perm : Settings.temporaryPermissions) {
    if (temporaryPerms.containsKey(player.getUniqueId()) && VaultHelper.checkPerm(player,perm)) {
      VaultHelper.removePerm(player,perm);
      if (DEBUG)       plugin.getLogger().info("String_Node_Str" + perm);
      List<String> perms=temporaryPerms.get(player.getUniqueId());
      perms.remove(perm);
      if (perms.isEmpty())       temporaryPerms.remove(player.getUniqueId());
 else       temporaryPerms.put(player.getUniqueId(),perms);
    }
  }
}