Program: 31997
Project: 31997
Buggy source:
/** 
 * Start the events sync
 */
private void startSync(){
  if (null != mCurrentToken) {
    Log.d(LOG_TAG,"String_Node_Str" + mCurrentToken);
  }
 else {
    Log.d(LOG_TAG,"String_Node_Str");
  }
  int serverTimeout;
  mPaused=false;
  mInitialSyncDone=null != mCurrentToken;
  if (mInitialSyncDone) {
    serverTimeout=0;
    SyncResponse dummySyncResponse=new SyncResponse();
    dummySyncResponse.nextBatch=mCurrentToken;
    mListener.onSyncResponse(dummySyncResponse,null,true);
  }
 else {
    while (!mInitialSyncDone) {
      final CountDownLatch latch=new CountDownLatch(1);
      mEventsRestClient.syncFromToken(null,0,DEFAULT_CLIENT_TIMEOUT_MS,null,null,new SimpleApiCallback<SyncResponse>(mFailureCallback){
        @Override public void onSuccess(        SyncResponse syncResponse){
          Log.d(LOG_TAG,"String_Node_Str");
          mNextServerTimeoutms=hasDevicesChanged(syncResponse) ? 0 : mDefaultServerTimeoutms;
          mListener.onSyncResponse(syncResponse,null,(0 == mNextServerTimeoutms));
          mCurrentToken=syncResponse.nextBatch;
          mInitialSyncDone=true;
          latch.countDown();
        }
        private void sleepAndUnblock(){
          Log.i(LOG_TAG,"String_Node_Str");
          new Handler(Looper.getMainLooper()).postDelayed(new Runnable(){
            public void run(){
              latch.countDown();
            }
          }
,RETRY_WAIT_TIME_MS);
        }
        @Override public void onNetworkError(        Exception e){
          if (null != mCurrentToken) {
            onSuccess(null);
          }
 else {
            Log.e(LOG_TAG,"String_Node_Str" + e.getLocalizedMessage());
            super.onNetworkError(e);
            sleepAndUnblock();
          }
        }
        @Override public void onMatrixError(        MatrixError e){
          super.onMatrixError(e);
          if (TextUtils.equals(MatrixError.UNKNOWN_TOKEN,e.errcode)) {
            mListener.onInvalidToken();
          }
 else {
            sleepAndUnblock();
          }
        }
        @Override public void onUnexpectedError(        Exception e){
          super.onUnexpectedError(e);
          Log.e(LOG_TAG,"String_Node_Str" + e.getLocalizedMessage());
          sleepAndUnblock();
        }
      }
);
      try {
        latch.await();
      }
 catch (      InterruptedException e) {
        Log.e(LOG_TAG,"String_Node_Str");
      }
    }
    serverTimeout=mNextServerTimeoutms;
  }
  Log.d(LOG_TAG,"String_Node_Str" + mCurrentToken);
  if (null != mNetworkConnectivityReceiver) {
    mNetworkConnectivityReceiver.addEventListener(mNetworkListener);
    mbIsConnected=mNetworkConnectivityReceiver.isConnected();
    mIsNetworkSuspended=!mbIsConnected;
  }
  while (!mKilling) {
    if ((!mPaused && !mIsNetworkSuspended) && (0 != mRequestDelayMs)) {
      Log.d(LOG_TAG,"String_Node_Str");
      mSyncDelayTimer=new Timer();
      mSyncDelayTimer.schedule(new TimerTask(){
        @Override public void run(){
          Log.d(LOG_TAG,"String_Node_Str" + mRequestDelayMs + "String_Node_Str");
synchronized (mSyncObject) {
            mSyncObject.notify();
          }
        }
      }
,mRequestDelayMs);
    }
    if (mPaused || mIsNetworkSuspended || (null != mSyncDelayTimer)) {
      if (null != mSyncDelayTimer) {
        Log.d(LOG_TAG,"String_Node_Str");
      }
 else       if (mIsNetworkSuspended) {
        Log.d(LOG_TAG,"String_Node_Str");
      }
 else {
        Log.d(LOG_TAG,"String_Node_Str");
      }
      try {
        Log.d(LOG_TAG,"String_Node_Str");
synchronized (mSyncObject) {
          mSyncObject.wait();
        }
        if (null != mSyncDelayTimer) {
          Log.d(LOG_TAG,"String_Node_Str");
          mSyncDelayTimer.cancel();
          mSyncDelayTimer=null;
        }
        Log.d(LOG_TAG,"String_Node_Str");
        serverTimeout=0;
      }
 catch (      InterruptedException e) {
        Log.e(LOG_TAG,"String_Node_Str" + e.getMessage());
      }
    }
    if (!mKilling) {
      String inlineFilter=null;
      final CountDownLatch latch=new CountDownLatch(1);
      Log.d(LOG_TAG,"String_Node_Str" + mCurrentToken);
      final int fServerTimeout=serverTimeout;
      mNextServerTimeoutms=mDefaultServerTimeoutms;
      mEventsRestClient.syncFromToken(mCurrentToken,serverTimeout,DEFAULT_CLIENT_TIMEOUT_MS,(mIsCatchingUp && mIsOnline) ? "String_Node_Str" : null,inlineFilter,new SimpleApiCallback<SyncResponse>(mFailureCallback){
        @Override public void onSuccess(        SyncResponse syncResponse){
          if (!mKilling) {
            if (0 == fServerTimeout) {
              if (hasDevicesChanged(syncResponse)) {
                mNextServerTimeoutms=0;
              }
            }
            if (mIsCatchingUp && (0 != mNextServerTimeoutms)) {
              int eventCounts=0;
              if (null != syncResponse.rooms) {
                RoomsSyncResponse roomsSyncResponse=syncResponse.rooms;
                if (null != roomsSyncResponse.join) {
                  eventCounts+=roomsSyncResponse.join.size();
                }
                if (null != roomsSyncResponse.invite) {
                  eventCounts+=roomsSyncResponse.invite.size();
                }
              }
              Log.d(LOG_TAG,"String_Node_Str" + eventCounts + "String_Node_Str");
              if (!mGotFirstCatchupChunk) {
                mGotFirstCatchupChunk=(0 != eventCounts);
                if (mGotFirstCatchupChunk) {
                  Log.e(LOG_TAG,"String_Node_Str");
                  mCatchupSyncRequestsCount=0;
                }
 else {
                  Log.e(LOG_TAG,"String_Node_Str");
                }
                mNextServerTimeoutms=mDefaultServerTimeoutms / 10;
              }
 else {
                mCatchupSyncRequestsCount++;
                if ((0 == eventCounts) || (mCatchupSyncRequestsCount > 3)) {
                  if (0 == eventCounts) {
                    Log.e(LOG_TAG,"String_Node_Str" + mCatchupSyncRequestsCount + "String_Node_Str");
                  }
 else {
                    Log.e(LOG_TAG,"String_Node_Str");
                  }
                  mIsCatchingUp=false;
                  mPaused=true;
                }
 else {
                  Log.e(LOG_TAG,"String_Node_Str");
                  mNextServerTimeoutms=mDefaultServerTimeoutms / 10;
                }
              }
            }
            Log.d(LOG_TAG,"String_Node_Str");
            mListener.onSyncResponse(syncResponse,mCurrentToken,(0 == mNextServerTimeoutms));
            mCurrentToken=syncResponse.nextBatch;
            Log.d(LOG_TAG,"String_Node_Str" + mCurrentToken);
          }
          latch.countDown();
        }
        private void onError(        String description){
          boolean isConnected;
          Log.d(LOG_TAG,"String_Node_Str" + description);
synchronized (mSyncObject) {
            isConnected=mbIsConnected;
          }
          if (isConnected) {
            new Handler(Looper.getMainLooper()).postDelayed(new Runnable(){
              public void run(){
                latch.countDown();
              }
            }
,RETRY_WAIT_TIME_MS);
          }
 else {
            mIsNetworkSuspended=true;
            latch.countDown();
          }
        }
        @Override public void onNetworkError(        Exception e){
          onError(e.getLocalizedMessage());
        }
        @Override public void onMatrixError(        MatrixError e){
          if (TextUtils.equals(MatrixError.UNKNOWN_TOKEN,e.errcode)) {
            mListener.onInvalidToken();
          }
 else {
            onError(e.getLocalizedMessage());
          }
        }
        @Override public void onUnexpectedError(        Exception e){
          onError(e.getLocalizedMessage());
        }
      }
);
      try {
        latch.await();
      }
 catch (      InterruptedException e) {
        Log.e(LOG_TAG,"String_Node_Str");
      }
catch (      Exception e) {
        Log.e(LOG_TAG,"String_Node_Str" + e.getMessage());
      }
    }
    serverTimeout=mNextServerTimeoutms;
  }
  if (null != mNetworkConnectivityReceiver) {
    mNetworkConnectivityReceiver.removeEventListener(mNetworkListener);
  }
  Log.d(LOG_TAG,"String_Node_Str");
}

Fixed version (ground truth):
/** 
 * Start the events sync
 */
private void startSync(){
  if (null != mCurrentToken) {
    Log.d(LOG_TAG,"String_Node_Str" + mCurrentToken);
  }
 else {
    Log.d(LOG_TAG,"String_Node_Str");
  }
  int serverTimeout;
  mPaused=false;
  mInitialSyncDone=null != mCurrentToken;
  if (mInitialSyncDone) {
    serverTimeout=0;
    SyncResponse dummySyncResponse=new SyncResponse();
    dummySyncResponse.nextBatch=mCurrentToken;
    mListener.onSyncResponse(dummySyncResponse,null,true);
  }
 else {
    while (!mInitialSyncDone) {
      final CountDownLatch latch=new CountDownLatch(1);
      mEventsRestClient.syncFromToken(null,0,DEFAULT_CLIENT_TIMEOUT_MS,null,null,new SimpleApiCallback<SyncResponse>(mFailureCallback){
        @Override public void onSuccess(        SyncResponse syncResponse){
          Log.d(LOG_TAG,"String_Node_Str");
          mNextServerTimeoutms=hasDevicesChanged(syncResponse) ? 0 : mDefaultServerTimeoutms;
          mListener.onSyncResponse(syncResponse,null,(0 == mNextServerTimeoutms));
          mCurrentToken=syncResponse.nextBatch;
          mInitialSyncDone=true;
          latch.countDown();
        }
        private void sleepAndUnblock(){
          Log.i(LOG_TAG,"String_Node_Str");
          new Handler(Looper.getMainLooper()).postDelayed(new Runnable(){
            public void run(){
              latch.countDown();
            }
          }
,RETRY_WAIT_TIME_MS);
        }
        @Override public void onNetworkError(        Exception e){
          if (null != mCurrentToken) {
            onSuccess(null);
          }
 else {
            Log.e(LOG_TAG,"String_Node_Str" + e.getLocalizedMessage());
            super.onNetworkError(e);
            sleepAndUnblock();
          }
        }
        @Override public void onMatrixError(        MatrixError e){
          super.onMatrixError(e);
          if (TextUtils.equals(MatrixError.UNKNOWN_TOKEN,e.errcode)) {
            mListener.onInvalidToken();
          }
 else {
            sleepAndUnblock();
          }
        }
        @Override public void onUnexpectedError(        Exception e){
          super.onUnexpectedError(e);
          Log.e(LOG_TAG,"String_Node_Str" + e.getLocalizedMessage());
          sleepAndUnblock();
        }
      }
);
      try {
        latch.await();
      }
 catch (      InterruptedException e) {
        Log.e(LOG_TAG,"String_Node_Str");
      }
    }
    serverTimeout=mNextServerTimeoutms;
  }
  Log.d(LOG_TAG,"String_Node_Str" + mCurrentToken);
  if (null != mNetworkConnectivityReceiver) {
    mNetworkConnectivityReceiver.addEventListener(mNetworkListener);
    mbIsConnected=mNetworkConnectivityReceiver.isConnected();
    mIsNetworkSuspended=!mbIsConnected;
  }
  while (!mKilling) {
    if ((!mPaused && !mIsNetworkSuspended) && (0 != mRequestDelayMs)) {
      Log.d(LOG_TAG,"String_Node_Str");
      mSyncDelayTimer=new Timer();
      mSyncDelayTimer.schedule(new TimerTask(){
        @Override public void run(){
          Log.d(LOG_TAG,"String_Node_Str" + mRequestDelayMs + "String_Node_Str");
synchronized (mSyncObject) {
            mSyncObject.notify();
          }
        }
      }
,mRequestDelayMs);
    }
    if (mPaused || mIsNetworkSuspended || (null != mSyncDelayTimer)) {
      if (null != mSyncDelayTimer) {
        Log.d(LOG_TAG,"String_Node_Str");
      }
 else       if (mIsNetworkSuspended) {
        Log.d(LOG_TAG,"String_Node_Str");
      }
 else {
        Log.d(LOG_TAG,"String_Node_Str");
      }
      try {
        Log.d(LOG_TAG,"String_Node_Str");
synchronized (mSyncObject) {
          mSyncObject.wait();
        }
        if (null != mSyncDelayTimer) {
          Log.d(LOG_TAG,"String_Node_Str");
          mSyncDelayTimer.cancel();
          mSyncDelayTimer=null;
        }
        Log.d(LOG_TAG,"String_Node_Str");
        serverTimeout=0;
      }
 catch (      InterruptedException e) {
        Log.e(LOG_TAG,"String_Node_Str" + e.getMessage());
      }
    }
    if (!mKilling) {
      String inlineFilter=null;
      final CountDownLatch latch=new CountDownLatch(1);
      Log.d(LOG_TAG,"String_Node_Str" + mCurrentToken);
      final int fServerTimeout=serverTimeout;
      mNextServerTimeoutms=mDefaultServerTimeoutms;
      mEventsRestClient.syncFromToken(mCurrentToken,serverTimeout,DEFAULT_CLIENT_TIMEOUT_MS,(mIsCatchingUp && mIsOnline) ? "String_Node_Str" : null,inlineFilter,new SimpleApiCallback<SyncResponse>(mFailureCallback){
        @Override public void onSuccess(        SyncResponse syncResponse){
          if (!mKilling) {
            if (0 == fServerTimeout) {
              if (hasDevicesChanged(syncResponse)) {
                mNextServerTimeoutms=0;
              }
            }
            if (mIsCatchingUp && (0 != mNextServerTimeoutms)) {
              int eventCounts=0;
              if (null != syncResponse.rooms) {
                RoomsSyncResponse roomsSyncResponse=syncResponse.rooms;
                if (null != roomsSyncResponse.join) {
                  eventCounts+=roomsSyncResponse.join.size();
                }
                if (null != roomsSyncResponse.invite) {
                  eventCounts+=roomsSyncResponse.invite.size();
                }
              }
              Log.d(LOG_TAG,"String_Node_Str" + eventCounts + "String_Node_Str");
              if (!mGotFirstCatchupChunk) {
                mGotFirstCatchupChunk=(0 != eventCounts);
                if (mGotFirstCatchupChunk) {
                  Log.e(LOG_TAG,"String_Node_Str");
                  mCatchupSyncRequestsCount=0;
                }
 else {
                  Log.e(LOG_TAG,"String_Node_Str");
                }
                mNextServerTimeoutms=mDefaultServerTimeoutms / 10;
              }
 else {
                mCatchupSyncRequestsCount++;
                if ((0 == eventCounts) || (mCatchupSyncRequestsCount > 3)) {
                  if (0 == eventCounts) {
                    Log.e(LOG_TAG,"String_Node_Str" + mCatchupSyncRequestsCount + "String_Node_Str");
                  }
 else {
                    Log.e(LOG_TAG,"String_Node_Str");
                  }
                  mIsCatchingUp=false;
                  mPaused=(0 == mRequestDelayMs);
                }
 else {
                  Log.e(LOG_TAG,"String_Node_Str");
                  mNextServerTimeoutms=mDefaultServerTimeoutms / 10;
                }
              }
            }
            Log.d(LOG_TAG,"String_Node_Str");
            mListener.onSyncResponse(syncResponse,mCurrentToken,(0 == mNextServerTimeoutms));
            mCurrentToken=syncResponse.nextBatch;
            Log.d(LOG_TAG,"String_Node_Str" + mCurrentToken);
          }
          latch.countDown();
        }
        private void onError(        String description){
          boolean isConnected;
          Log.d(LOG_TAG,"String_Node_Str" + description);
synchronized (mSyncObject) {
            isConnected=mbIsConnected;
          }
          if (isConnected) {
            new Handler(Looper.getMainLooper()).postDelayed(new Runnable(){
              public void run(){
                latch.countDown();
              }
            }
,RETRY_WAIT_TIME_MS);
          }
 else {
            mIsNetworkSuspended=true;
            latch.countDown();
          }
        }
        @Override public void onNetworkError(        Exception e){
          onError(e.getLocalizedMessage());
        }
        @Override public void onMatrixError(        MatrixError e){
          if (TextUtils.equals(MatrixError.UNKNOWN_TOKEN,e.errcode)) {
            mListener.onInvalidToken();
          }
 else {
            onError(e.getLocalizedMessage());
          }
        }
        @Override public void onUnexpectedError(        Exception e){
          onError(e.getLocalizedMessage());
        }
      }
);
      try {
        latch.await();
      }
 catch (      InterruptedException e) {
        Log.e(LOG_TAG,"String_Node_Str");
      }
catch (      Exception e) {
        Log.e(LOG_TAG,"String_Node_Str" + e.getMessage());
      }
    }
    serverTimeout=mNextServerTimeoutms;
  }
  if (null != mNetworkConnectivityReceiver) {
    mNetworkConnectivityReceiver.removeEventListener(mNetworkListener);
  }
  Log.d(LOG_TAG,"String_Node_Str");
}