Program: 111580
Project: 111580
Buggy source:
public void setCursor(int w,int h,Point hotspot,int[] data,byte[] mask){
synchronized (this) {
    if (!cc.viewer.useLocalCursor.getValue())     return;
    hideLocalCursor();
    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()];
    if (cursor.getPF().bpp == 8) {
      cursor.cm=new DirectColorModel(9,7,(7 << 3),(3 << 6),(1 << 8));
    }
    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]=(cursor.getPF().bpp == 8) ? data[y * w + x] | (1 << 8) : 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(),cursor.cm,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;
    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"));
  }
  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 (this) {
    if (!cc.viewer.useLocalCursor.getValue())     return;
    hideLocalCursor();
    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()];
    if (cursor.getPF().bpp == 8) {
      cursor.cm=new DirectColorModel(9,7,(7 << 3),(3 << 6),(1 << 8));
    }
    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]=(cursor.getPF().bpp == 8) ? data[y * w + x] | (1 << 8) : 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(),cursor.cm,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");
  }
  if (softCursor != null) {
    setCursor(softCursor);
    cursorAvailable=true;
    return;
  }
  if (!cursorAvailable) {
    cursorAvailable=true;
  }
  showLocalCursor();
  return;
}