Program: 40137
Project: 40137
Buggy source:
public SourceBuffer(Position p) throws IOException {
  this.p=p;
  BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
  String currentLine=null;
  List<String> lines=new ArrayList<String>();
  int offset=0, line=0;
  do {
    currentLine=reader.readLine();
    if (currentLine == null) {
      this.lines=new String[0];
      return;
    }
    offset+=(currentLine.length() + 1);
    line++;
  }
 while (p.getLastOffset() >= 0 ? p.getFirstOffset() > offset : p.getFirstLine() > line);
  if (p.getLastOffset() >= 0) {
    if (p.getFirstOffset() == offset) {
      lines.add("String_Node_Str");
    }
 else {
      lines.add(currentLine.substring(p.getFirstOffset() - (offset - currentLine.length() - 1)));
    }
  }
 else {
    lines.add(currentLine.substring(p.getFirstCol()));
  }
  while (p.getLastOffset() >= 0 ? p.getLastOffset() >= offset : p.getLastLine() >= line) {
    currentLine=reader.readLine();
    if (currentLine == null) {
      offset=p.getLastOffset();
      break;
    }
 else {
      offset+=currentLine.length() + 1;
    }
    line++;
    if (p.getLastOffset() >= 0) {
      if (offset > p.getLastOffset()) {
        lines.add(currentLine.substring(0,currentLine.length() - (offset - p.getLastOffset()) + 1));
      }
 else {
        lines.add(currentLine);
      }
    }
 else {
      if (p.getLastLine() == line) {
        lines.add(currentLine.substring(0,p.getLastCol()));
      }
 else {
        lines.add(currentLine);
      }
    }
  }
  this.lines=lines.toArray(new String[lines.size()]);
}

Fixed version (ground truth):
public SourceBuffer(Position p) throws IOException {
  this.p=p;
  BufferedReader reader=new BufferedReader(p.getReader());
  String currentLine=null;
  List<String> lines=new ArrayList<String>();
  int offset=0, line=0;
  do {
    currentLine=reader.readLine();
    if (currentLine == null) {
      this.lines=new String[0];
      return;
    }
    offset+=(currentLine.length() + 1);
    line++;
  }
 while (p.getLastOffset() >= 0 ? p.getFirstOffset() > offset : p.getFirstLine() > line);
  if (p.getLastOffset() >= 0) {
    if (p.getFirstOffset() == offset) {
      lines.add("String_Node_Str");
    }
 else {
      int startOffset=p.getFirstOffset() - (offset - currentLine.length() - 1);
      if (offset > p.getLastOffset()) {
        int endOffset=p.getLastOffset() - (offset - currentLine.length() - 1);
        lines.add(currentLine.substring(startOffset,endOffset));
      }
 else {
        lines.add(currentLine.substring(startOffset));
      }
    }
  }
 else {
    lines.add(currentLine.substring(p.getFirstCol()));
  }
  while (p.getLastOffset() >= 0 ? p.getLastOffset() >= offset : p.getLastLine() >= line) {
    currentLine=reader.readLine();
    if (currentLine == null) {
      offset=p.getLastOffset();
      break;
    }
 else {
      offset+=currentLine.length() + 1;
    }
    line++;
    if (p.getLastOffset() >= 0) {
      if (offset > p.getLastOffset()) {
        lines.add(currentLine.substring(0,currentLine.length() - (offset - p.getLastOffset()) + 1));
      }
 else {
        lines.add(currentLine);
      }
    }
 else {
      if (p.getLastLine() == line) {
        lines.add(currentLine.substring(0,p.getLastCol()));
      }
 else {
        lines.add(currentLine);
      }
    }
  }
  this.lines=lines.toArray(new String[lines.size()]);
}