Program: 111529
Project: 111529
Buggy source:
public void setCursor(int w,int h,Point hotspot,int[] data,byte[] mask){
synchronized (cc.viewer.useLocalCursor) {
    if (!cc.viewer.useLocalCursor.getValue())     return;
  }
  hideLocalCursor();
  cursor.hotspot=hotspot;
  cursor.setSize(w,h);
  cursor.setPF(getPF());
  cursorBacking.setSize(cursor.width(),cursor.height());
  cursorBacking.setPF(getPF());
  cursor.data=new int[cursor.width() * cursor.height()];
  cursor.mask=new byte[cursor.maskLen()];
  int maskBytesPerRow=(w + 7) / 8;
  for (int y=0; y < h; y++) {
    for (int x=0; x < w; x++) {
      int byte_=y * maskBytesPerRow + x / 8;
      int bit=7 - x % 8;
      if ((mask[byte_] & (1 << bit)) > 0) {
        cursor.data[y * cursor.width() + x]=(0xff << 24) | (im.cm.getRed(data[y * w + x]) << 16) | (im.cm.getGreen(data[y * w + x]) << 8)| (im.cm.getBlue(data[y * w + x]));
      }
    }
    System.arraycopy(mask,y * maskBytesPerRow,cursor.mask,y * ((cursor.width() + 7) / 8),maskBytesPerRow);
  }
  int cw=(int)Math.floor((float)cursor.width() * scaleWidthRatio);
  int ch=(int)Math.floor((float)cursor.height() * scaleHeightRatio);
  Dimension bestSize=tk.getBestCursorSize(cw,ch);
  MemoryImageSource cursorSrc;
  cursorSrc=new MemoryImageSource(cursor.width(),cursor.height(),ColorModel.getRGBdefault(),cursor.data,0,cursor.width());
  Image srcImage=tk.createImage(cursorSrc);
  BufferedImage cursorImage;
  cursorImage=new BufferedImage(bestSize.width,bestSize.height,BufferedImage.TYPE_INT_ARGB);
  Graphics2D g2=cursorImage.createGraphics();
  g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_SPEED);
  g2.drawImage(srcImage,0,0,(int)Math.min(cw,bestSize.width),(int)Math.min(ch,bestSize.height),0,0,cursor.width(),cursor.height(),null);
  g2.dispose();
  srcImage.flush();
  int x=(int)Math.floor((float)hotspot.x * scaleWidthRatio);
  int y=(int)Math.floor((float)hotspot.y * scaleHeightRatio);
  x=(int)Math.min(x,Math.max(bestSize.width - 1,0));
  y=(int)Math.min(y,Math.max(bestSize.height - 1,0));
  java.awt.Point hs=new java.awt.Point(x,y);
  if (!bestSize.equals(new Dimension(0,0)))   softCursor=tk.createCustomCursor(cursorImage,hs,"String_Node_Str");
  cursorImage.flush();
  if (softCursor != null) {
    setCursor(softCursor);
    cursorAvailable=false;
    return;
  }
  if (!cursorAvailable) {
    cursorAvailable=true;
  }
  showLocalCursor();
}

Fixed version (ground truth):
public void setCursor(int w,int h,Point hotspot,int[] data,byte[] mask){
synchronized (cc.viewer.useLocalCursor) {
    if (!cc.viewer.useLocalCursor.getValue())     return;
  }
  hideLocalCursor();
  cursor.hotspot=(hotspot != null) ? hotspot : new Point(0,0);
  cursor.setSize(w,h);
  cursor.setPF(getPF());
  cursorBacking.setSize(cursor.width(),cursor.height());
  cursorBacking.setPF(getPF());
  cursor.data=new int[cursor.width() * cursor.height()];
  cursor.mask=new byte[cursor.maskLen()];
  int maskBytesPerRow=(w + 7) / 8;
  for (int y=0; y < h; y++) {
    for (int x=0; x < w; x++) {
      int byte_=y * maskBytesPerRow + x / 8;
      int bit=7 - x % 8;
      if ((mask[byte_] & (1 << bit)) > 0) {
        cursor.data[y * cursor.width() + x]=(0xff << 24) | (im.cm.getRed(data[y * w + x]) << 16) | (im.cm.getGreen(data[y * w + x]) << 8)| (im.cm.getBlue(data[y * w + x]));
      }
    }
    System.arraycopy(mask,y * maskBytesPerRow,cursor.mask,y * ((cursor.width() + 7) / 8),maskBytesPerRow);
  }
  int cw=(int)Math.floor((float)cursor.width() * scaleWidthRatio);
  int ch=(int)Math.floor((float)cursor.height() * scaleHeightRatio);
  Dimension bestSize=tk.getBestCursorSize(cw,ch);
  MemoryImageSource cursorSrc;
  cursorSrc=new MemoryImageSource(cursor.width(),cursor.height(),ColorModel.getRGBdefault(),cursor.data,0,cursor.width());
  Image srcImage=tk.createImage(cursorSrc);
  BufferedImage cursorImage;
  cursorImage=new BufferedImage(bestSize.width,bestSize.height,BufferedImage.TYPE_INT_ARGB);
  Graphics2D g2=cursorImage.createGraphics();
  g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_SPEED);
  g2.drawImage(srcImage,0,0,(int)Math.min(cw,bestSize.width),(int)Math.min(ch,bestSize.height),0,0,cursor.width(),cursor.height(),null);
  g2.dispose();
  srcImage.flush();
  int x=(int)Math.floor((float)cursor.hotspot.x * scaleWidthRatio);
  int y=(int)Math.floor((float)cursor.hotspot.y * scaleHeightRatio);
  x=(int)Math.min(x,Math.max(bestSize.width - 1,0));
  y=(int)Math.min(y,Math.max(bestSize.height - 1,0));
  java.awt.Point hs=new java.awt.Point(x,y);
  if (!bestSize.equals(new Dimension(0,0)))   softCursor=tk.createCustomCursor(cursorImage,hs,"String_Node_Str");
  cursorImage.flush();
  if (softCursor != null) {
    setCursor(softCursor);
    cursorAvailable=false;
    return;
  }
  if (!cursorAvailable) {
    cursorAvailable=true;
  }
  showLocalCursor();
}