From 5376f91394e6d96ffc49634f4f2a502e4cc063c4 Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Fri, 19 Apr 2013 17:56:24 +0200 Subject: [PATCH] [XrdCl] Support undocumented wait response of zero size --- src/XrdCl/XrdClXRootDMsgHandler.cc | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/XrdCl/XrdClXRootDMsgHandler.cc b/src/XrdCl/XrdClXRootDMsgHandler.cc index 32522317ff9..a7d70a3592f 100644 --- a/src/XrdCl/XrdClXRootDMsgHandler.cc +++ b/src/XrdCl/XrdClXRootDMsgHandler.cc @@ -426,15 +426,26 @@ namespace XrdCl { std::auto_ptr msgPtr( pResponse ); pResponse = 0; + uint32_t waitSeconds = 0; - char *infoMsg = new char[rsp->hdr.dlen-3]; - infoMsg[rsp->hdr.dlen-4] = 0; - memcpy( infoMsg, rsp->body.wait.infomsg, rsp->hdr.dlen-4 ); - log->Dump( XRootDMsg, "[%s] Got kXR_wait response of %d seconds to " - "message %s: %s", pUrl.GetHostId().c_str(), - rsp->body.wait.seconds, pRequest->GetDescription().c_str(), - infoMsg ); - delete [] infoMsg; + if( rsp->hdr.dlen >= 4 ) + { + char *infoMsg = new char[rsp->hdr.dlen-3]; + infoMsg[rsp->hdr.dlen-4] = 0; + memcpy( infoMsg, rsp->body.wait.infomsg, rsp->hdr.dlen-4 ); + log->Dump( XRootDMsg, "[%s] Got kXR_wait response of %d seconds to " + "message %s: %s", pUrl.GetHostId().c_str(), + rsp->body.wait.seconds, pRequest->GetDescription().c_str(), + infoMsg ); + delete [] infoMsg; + waitSeconds = rsp->body.wait.seconds; + } + else + { + log->Dump( XRootDMsg, "[%s] Got kXR_wait response of 0 seconds to " + "message %s", pUrl.GetHostId().c_str(), + pRequest->GetDescription().c_str() ); + } //---------------------------------------------------------------------- // Some messages require rewriting before they can be sent again @@ -453,7 +464,7 @@ namespace XrdCl //---------------------------------------------------------------------- TaskManager *taskMgr = pPostMaster->GetTaskManager(); taskMgr->RegisterTask( new WaitTask( this ), - ::time(0)+rsp->body.wait.seconds ); + ::time(0)+waitSeconds ); return; }