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

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