output: #fixed code
                               @Override
  	public void run() {
  		// First, analyze the torrent's local data.
  		try {
  			this.torrent.init();
  		} catch (ClosedByInterruptException cbie) {
  			logger.warn("Client was interrupted during initialization. " +
  					"Aborting right away.");
  			this.setState(ClientState.ERROR);
  			return;
  		} catch (IOException ioe) {
  			logger.error("Could not initialize torrent file data!", ioe);
  			this.setState(ClientState.ERROR);
  			return;
  		}
  
  		// Initial completion test
  		if (this.torrent.isComplete()) {
  			this.seed();
  		} else {
  			this.setState(ClientState.SHARING);
  		}
  
  		this.announce.start();
  		this.service.start();
  
  		int optimisticIterations = 0;
  		int rateComputationIterations = 0;
  
  		while (!this.stop) {
  			optimisticIterations =
  				(optimisticIterations == 0 ?
  				 Client.OPTIMISTIC_UNCHOKE_ITERATIONS :
  				 optimisticIterations - 1);
  
  			rateComputationIterations =
  				(rateComputationIterations == 0 ?
  				 Client.RATE_COMPUTATION_ITERATIONS :
  				 rateComputationIterations - 1);
  
  			try {
  				this.unchokePeers(optimisticIterations == 0);
  				this.info();
  				if (rateComputationIterations == 0) {
  					this.resetPeerRates();
  				}
  			} catch (Exception e) {
  				logger.error("An exception occurred during the BitTorrent " +
  						"client main loop execution!", e);
  			}
  
  			try {
  				Thread.sleep(Client.UNCHOKING_FREQUENCY*1000);
  			} catch (InterruptedException ie) {
  				logger.trace("BitTorrent main loop interrupted.");
  			}
  		}
  
  		logger.debug("Stopping BitTorrent client connection service " +
  				"and announce threads...");
  		this.service.stop();
  		this.announce.stop();
  
  		// Close all peer connections
  		logger.debug("Closing all remaining peer connections...");
  		for (SharingPeer peer : this.connected.values()) {
  			peer.unbind(true);
  		}
  
  		this.torrent.close();
  
  		// Determine final state
  		if (this.torrent.isComplete()) {
  			this.setState(ClientState.DONE);
  		} else {
  			this.setState(ClientState.ERROR);
  		}
  
  		logger.info("BitTorrent client signing off.");
  	}
input: #vulnerable code 
                               @Override
  	public void run() {
  		// First, analyze the torrent's local data.
  		try {
  			this.torrent.init();
  		} catch (ClosedByInterruptException cbie) {
  			logger.warn("Client was interrupted during initialization. " +
  					"Aborting right away.");
  			this.setState(ClientState.ERROR);
  			return;
  		} catch (IOException ioe) {
  			logger.error("Could not initialize torrent file data!", ioe);
  			this.setState(ClientState.ERROR);
  			return;
  		}
  
  		// Initial completion test
  		if (this.torrent.isComplete()) {
  			this.seed();
  		} else {
  			this.setState(ClientState.SHARING);
  		}
  
  		this.announce.start();
  		this.service.start();
  
  		int optimisticIterations = 0;
  		int rateComputationIterations = 0;
  
  		while (!this.stop) {
  			optimisticIterations =
  				(optimisticIterations == 0 ?
  				 Client.OPTIMISTIC_UNCHOKE_ITERATIONS :
  				 optimisticIterations - 1);
  
  			rateComputationIterations =
  				(rateComputationIterations == 0 ?
  				 Client.RATE_COMPUTATION_ITERATIONS :
  				 rateComputationIterations - 1);
  
  			try {
  				this.unchokePeers(optimisticIterations == 0);
  				this.info();
  				if (rateComputationIterations == 0) {
  					this.resetPeerRates();
  				}
  			} catch (Exception e) {
  				logger.error("An exception occurred during the BitTorrent " +
  						"client main loop execution!", e);
  			}
  
  			try {
  				Thread.sleep(Client.UNCHOKING_FREQUENCY*1000);
  			} catch (InterruptedException ie) {
  				logger.trace("BitTorrent main loop interrupted.");
  			}
  		}
  
  		logger.debug("Stopping BitTorrent client connection service " +
  				"and announce threads...");
  		this.service.stop();
  		this.announce.stop();
  
  		// Close all peer connections
  		logger.debug("Closing all remaining peer connections...");
  		for (SharingPeer peer : this.connected.values()) {
  			peer.unbind(true);
  		}
  
  		// Determine final state
  		if (this.torrent.isComplete()) {
  			this.setState(ClientState.DONE);
  		} else {
  			this.setState(ClientState.ERROR);
  		}
  
  		logger.info("BitTorrent client signing off.");
  	} 
                              #location 30 
                              #vulnerability type THREAD_SAFETY_VIOLATION