Program: 107693
Project: 107693
Buggy source:
/** 
 * Adds byte array to ring buffer
 * @param buf byte array
 * @param length added length
 * @return actually added length
 */
public synchronized int add(byte[] buf,int length){
  int addLen=length;
  if ((mAddOffset < mGetOffset) && (mAddOffset + length) >= mGetOffset) {
    addLen=mGetOffset - mAddOffset;
  }
  if (buf.length < addLen) {
    addLen=buf.length;
  }
  if ((mAddOffset + addLen) > (mRingBufSize - 1)) {
    int remain=mAddOffset + addLen - mRingBufSize;
    int copyLen=addLen - remain;
    if (copyLen != 0) {
      System.arraycopy(buf,0,mRingBuf,mAddOffset,copyLen);
    }
    if (DEBUG_SHOW_ADD) {
      Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ (copyLen - 1)+ "String_Node_Str"+ mAddOffset+ "String_Node_Str"+ (mAddOffset + copyLen - 1)+ "String_Node_Str");
    }
    mAddOffset=0;
    if (DEBUG_SHOW_ADD) {
      Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ mAddOffset+ "String_Node_Str"+ mGetOffset);
    }
    System.arraycopy(buf,copyLen,mRingBuf,mAddOffset,remain);
    mAddOffset=remain;
    if (DEBUG_SHOW_ADD) {
      Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ (copyLen)+ "String_Node_Str"+ (addLen - 1)+ "String_Node_Str"+ (remain - 1)+ "String_Node_Str");
      Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ mAddOffset+ "String_Node_Str"+ mGetOffset);
    }
    return addLen;
  }
 else {
    System.arraycopy(buf,0,mRingBuf,mAddOffset,addLen);
    if (DEBUG_SHOW_ADD) {
      Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ (addLen - 1)+ "String_Node_Str"+ mAddOffset+ "String_Node_Str"+ (mAddOffset + addLen - 1)+ "String_Node_Str");
    }
    mAddOffset+=addLen;
    if (DEBUG_SHOW_ADD) {
      Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ mAddOffset+ "String_Node_Str"+ mGetOffset);
    }
    return addLen;
  }
}

Fixed version (ground truth):
/** 
 * Adds byte array to ring buffer
 * @param buf byte array
 * @param length added length
 * @return actually added length
 */
public synchronized int add(byte[] buf,int length){
  int addLen=length;
  if (mAddIndex > mGetIndex) {
    if ((mAddIndex + length) >= mRingBufSize) {
      if ((mRingBufSize - mAddIndex) + (mGetIndex - 1) < length) {
        addLen=(mRingBufSize - mAddIndex) + (mGetIndex - 1);
      }
    }
  }
 else   if (mAddIndex < mGetIndex) {
    if ((mGetIndex - 1) - mAddIndex < length) {
      addLen=(mGetIndex - 1) - mAddIndex;
    }
  }
  if (buf.length < addLen) {
    addLen=buf.length;
  }
  if ((mAddIndex + addLen) >= mRingBufSize) {
    int remain=mAddIndex + addLen - mRingBufSize;
    int copyLen=addLen - remain;
    if (copyLen != 0) {
      System.arraycopy(buf,0,mRingBuf,mAddIndex,copyLen);
      if (DEBUG_SHOW_ADD) {
        Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ (copyLen - 1)+ "String_Node_Str"+ mAddIndex+ "String_Node_Str"+ (mAddIndex + copyLen - 1)+ "String_Node_Str");
      }
    }
    mAddIndex=0;
    if (remain != 0) {
      System.arraycopy(buf,copyLen,mRingBuf,mAddIndex,remain);
      if (DEBUG_SHOW_ADD) {
        Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ (copyLen)+ "String_Node_Str"+ (addLen - 1)+ "String_Node_Str"+ (remain - 1)+ "String_Node_Str");
      }
      mAddIndex=remain;
    }
    if (DEBUG_SHOW_ADD) {
      Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ mAddIndex+ "String_Node_Str"+ mGetIndex);
    }
    return addLen;
  }
 else {
    System.arraycopy(buf,0,mRingBuf,mAddIndex,addLen);
    if (DEBUG_SHOW_ADD) {
      Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ (addLen - 1)+ "String_Node_Str"+ mAddIndex+ "String_Node_Str"+ (mAddIndex + addLen - 1)+ "String_Node_Str");
    }
    mAddIndex+=addLen;
    if (DEBUG_SHOW_ADD) {
      Log.d(TAG,"String_Node_Str" + length + "String_Node_Str"+ mAddIndex+ "String_Node_Str"+ mGetIndex);
    }
    return addLen;
  }
}