Program: 48135
Project: 48135
Buggy source:
/** 
 * The DSIRead function reads out the content of a specific DSI (Data Structure for Interoperability). See BSI-TR-03112-4, version 1.1.2, section 3.4.9.
 * @param request DSIRead
 * @return DSIReadResponse
 */
@Override public DSIReadResponse dsiRead(DSIRead request){
  DSIReadResponse response=WSHelper.makeResponse(DSIReadResponse.class,WSHelper.makeResultOK());
  try {
    ConnectionHandleType connectionHandle=SALUtils.getConnectionHandle(request);
    CardStateEntry cardStateEntry=SALUtils.getCardStateEntry(states,connectionHandle);
    byte[] applicationID=cardStateEntry.getCurrentCardApplication().getApplicationIdentifier();
    String dsiName=request.getDSIName();
    Assert.assertIncorrectParameter(dsiName,"String_Node_Str");
    if (cardStateEntry.getFCPOfSelectedEF() == null) {
      throw new PrerequisitesNotSatisfiedException("String_Node_Str");
    }
    CardInfoWrapper cardInfoWrapper=cardStateEntry.getInfo();
    DataSetInfoType dataSetInfo=cardInfoWrapper.getDataSetByDsiName(dsiName);
    if (dataSetInfo == null) {
      dataSetInfo=cardInfoWrapper.getDataSetByName(dsiName);
      if (dataSetInfo != null) {
        if (!cardStateEntry.getFCPOfSelectedEF().getFileIdentifiers().isEmpty()) {
          byte[] path=dataSetInfo.getDataSetPath().getEfIdOrPath();
          byte[] fid=Arrays.copyOfRange(path,path.length - 2,path.length);
          if (!Arrays.equals(fid,cardStateEntry.getFCPOfSelectedEF().getFileIdentifiers().get(0))) {
            String msg="String_Node_Str" + dsiName + "String_Node_Str";
            throw new PrerequisitesNotSatisfiedException(msg);
          }
        }
      }
 else {
        String msg="String_Node_Str";
        throw new IncorrectParameterException(msg);
      }
    }
    Assert.securityConditionDataSet(cardStateEntry,applicationID,dsiName,NamedDataServiceActionName.DSI_READ);
    byte[] slotHandle=connectionHandle.getSlotHandle();
    byte[] fileContent=CardUtils.readFile(cardStateEntry.getFCPOfSelectedEF(),env.getDispatcher(),slotHandle);
    response.setDSIContent(fileContent);
  }
 catch (  ECardException e) {
    response.setResult(e.getResult());
  }
catch (  Exception e) {
    logger.error(e.getMessage(),e);
    response.setResult(WSHelper.makeResult(e));
  }
  return response;
}

Fixed version (ground truth):
/** 
 * The DSIRead function reads out the content of a specific DSI (Data Structure for Interoperability). See BSI-TR-03112-4, version 1.1.2, section 3.4.9.
 * @param request DSIRead
 * @return DSIReadResponse
 */
@Override public DSIReadResponse dsiRead(DSIRead request){
  DSIReadResponse response=WSHelper.makeResponse(DSIReadResponse.class,WSHelper.makeResultOK());
  try {
    ConnectionHandleType connectionHandle=SALUtils.getConnectionHandle(request);
    CardStateEntry cardStateEntry=SALUtils.getCardStateEntry(states,connectionHandle);
    byte[] applicationID=cardStateEntry.getCurrentCardApplication().getApplicationIdentifier();
    String dsiName=request.getDSIName();
    byte[] slotHandle=connectionHandle.getSlotHandle();
    Assert.assertIncorrectParameter(dsiName,"String_Node_Str");
    Assert.securityConditionDataSet(cardStateEntry,applicationID,dsiName,NamedDataServiceActionName.DSI_READ);
    if (cardStateEntry.getFCPOfSelectedEF() == null) {
      throw new PrerequisitesNotSatisfiedException("String_Node_Str");
    }
    CardInfoWrapper cardInfoWrapper=cardStateEntry.getInfo();
    DataSetInfoType dataSetInfo=cardInfoWrapper.getDataSetByDsiName(dsiName);
    if (dataSetInfo == null) {
      dataSetInfo=cardInfoWrapper.getDataSetByName(dsiName);
      if (dataSetInfo != null) {
        if (!cardStateEntry.getFCPOfSelectedEF().getFileIdentifiers().isEmpty()) {
          byte[] path=dataSetInfo.getDataSetPath().getEfIdOrPath();
          byte[] fid=Arrays.copyOfRange(path,path.length - 2,path.length);
          if (!Arrays.equals(fid,cardStateEntry.getFCPOfSelectedEF().getFileIdentifiers().get(0))) {
            String msg="String_Node_Str" + dsiName + "String_Node_Str";
            throw new PrerequisitesNotSatisfiedException(msg);
          }
        }
        byte[] fileContent=CardUtils.readFile(cardStateEntry.getFCPOfSelectedEF(),env.getDispatcher(),slotHandle);
        response.setDSIContent(fileContent);
      }
 else {
        String msg="String_Node_Str";
        throw new IncorrectParameterException(msg);
      }
    }
 else {
      byte[] dataSetPath=dataSetInfo.getDataSetPath().getEfIdOrPath();
      byte[] dataSetFID=new byte[]{dataSetPath[dataSetPath.length - 2],dataSetPath[dataSetPath.length - 1]};
      if (Arrays.equals(dataSetFID,cardStateEntry.getFCPOfSelectedEF().getFileIdentifiers().get(0))) {
        DSIType dsi=cardInfoWrapper.getDSIbyName(dsiName);
        PathType dsiPath=dsi.getDSIPath();
        if (dsiPath.getTagRef() != null) {
          TagRef tagReference=dsiPath.getTagRef();
          byte[] tag=tagReference.getTag();
          GetData getDataRequest;
          if (tag.length == 2) {
            getDataRequest=new GetData(GetData.INS_DATA,tag[0],tag[1]);
            CardResponseAPDU cardResponse=getDataRequest.transmit(env.getDispatcher(),slotHandle,Collections.EMPTY_LIST);
            byte[] responseData=cardResponse.getData();
            while (cardResponse.getTrailer()[0] == (byte)0x61) {
              GetResponse allData=new GetResponse();
              cardResponse=allData.transmit(env.getDispatcher(),slotHandle,Collections.EMPTY_LIST);
              responseData=ByteUtils.concatenate(responseData,cardResponse.getData());
            }
            response.setDSIContent(responseData);
          }
 else           if (tag.length == 1) {
            getDataRequest=new GetData(GetData.INS_DATA,GetData.SIMPLE_TLV,tag[0]);
            CardResponseAPDU cardResponse=getDataRequest.transmit(env.getDispatcher(),slotHandle,Collections.EMPTY_LIST);
            byte[] responseData=cardResponse.getData();
            if (Arrays.equals(cardResponse.getTrailer(),new byte[]{(byte)0x6A,(byte)0x88})) {
              getDataRequest=new GetData(GetData.INS_DATA,GetData.BER_TLV_ONE_BYTE,tag[0]);
              cardResponse=getDataRequest.transmit(env.getDispatcher(),slotHandle,Collections.EMPTY_LIST);
              responseData=cardResponse.getData();
            }
            while (cardResponse.getTrailer()[0] == (byte)0x61) {
              GetResponse allData=new GetResponse();
              cardResponse=allData.transmit(env.getDispatcher(),slotHandle,Collections.EMPTY_LIST);
              responseData=ByteUtils.concatenate(responseData,cardResponse.getData());
            }
            response.setDSIContent(responseData);
          }
        }
 else         if (dsiPath.getIndex() != null) {
          byte[] index=dsiPath.getIndex();
          byte[] length=dsiPath.getLength();
          List<byte[]> allowedResponse=new ArrayList<>();
          allowedResponse.add(new byte[]{(byte)0x90,(byte)0x00});
          allowedResponse.add(new byte[]{(byte)0x62,(byte)0x82});
          if (cardStateEntry.getFCPOfSelectedEF().getDataElements().isLinear()) {
            ReadRecord readRecord=new ReadRecord(index[0]);
            CardResponseAPDU cardResponse=readRecord.transmit(env.getDispatcher(),slotHandle,allowedResponse);
            response.setDSIContent(cardResponse.getData());
          }
 else {
            ReadBinary readBinary=new ReadBinary(ByteUtils.toShort(index),ByteUtils.toShort(length));
            CardResponseAPDU cardResponse=readBinary.transmit(env.getDispatcher(),slotHandle,allowedResponse);
            response.setDSIContent(cardResponse.getData());
          }
        }
 else {
          String msg="String_Node_Str" + dsiName;
          throw new PrerequisitesNotSatisfiedException(msg);
        }
      }
    }
  }
 catch (  ECardException e) {
    response.setResult(e.getResult());
  }
catch (  Exception e) {
    logger.error(e.getMessage(),e);
    response.setResult(WSHelper.makeResult(e));
  }
  return response;
}