Program: 111543
Project: 111543
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();
  if (hotspot == null)   hotspot=new Point(0,0);
  cursor.hotspot=hotspot;
  Dimension bsc=tk.getBestCursorSize(w,h);
  cursor.setSize(((int)bsc.getWidth() > w ? (int)bsc.getWidth() : w),((int)bsc.getHeight() > h ? (int)bsc.getHeight() : 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);
  }
  MemoryImageSource bitmap=new MemoryImageSource(cursor.width(),cursor.height(),ColorModel.getRGBdefault(),cursor.data,0,cursor.width());
  int cw=(int)Math.floor((float)cursor.width() * scaleWidthRatio);
  int ch=(int)Math.floor((float)cursor.height() * scaleHeightRatio);
  int hint=java.awt.Image.SCALE_DEFAULT;
  hotspot=new Point((int)Math.floor((float)hotspot.x * scaleWidthRatio),(int)Math.floor((float)hotspot.y * scaleHeightRatio));
  Image cursorImage=(cw <= 0 || ch <= 0) ? tk.createImage(bitmap) : tk.createImage(bitmap).getScaledInstance(cw,ch,hint);
  softCursor=tk.createCustomCursor(cursorImage,new java.awt.Point(hotspot.x,hotspot.y),"String_Node_Str");
  cursorImage.flush();
  if (softCursor != null) {
    setCursor(softCursor);
    cursorAvailable=true;
    return;
  }
  if (!cursorAvailable) {
    cursorAvailable=true;
  }
  showLocalCursor();
  return;
}

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;
  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(),this);
  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=true;
    return;
  }
  if (!cursorAvailable) {
    cursorAvailable=true;
  }
  showLocalCursor();
  return;
}