diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index 54c43737d6b2568ebf076804a4ca9f43fe6c8adf..8025e4f46e5a86165fda4065940f1e246efe832b 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -475,8 +475,8 @@ int SMBCALL smb_lockmsghdr(smb_t* smb, smbmsg_t* msg)
 			if(time(NULL)-start>=(time_t)smb->retry_time) 
 				break;
 		/* In case we've already locked it */
-		unlock(fileno(smb->shd_fp),msg->idx.offset,sizeof(msghdr_t)); 
-		SLEEP(smb->retry_delay);
+		if(unlock(fileno(smb->shd_fp),msg->idx.offset,sizeof(msghdr_t))!=0)
+			SLEEP(smb->retry_delay);
 	}
 	safe_snprintf(smb->last_error,sizeof(smb->last_error),"timeout locking header");
 	return(SMB_ERR_TIMEOUT);
@@ -941,7 +941,6 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
 			return(SMB_ERR_MEM); 
 		}
 		msg->hfield=vp;
-		msg->total_hfields++;
 		if(smb_fread(smb,&msg->hfield[i],sizeof(hfield_t),smb->shd_fp)!=sizeof(hfield_t)) {
 			smb_freemsgmem(msg);
 			safe_snprintf(smb->last_error,sizeof(smb->last_error)
@@ -958,6 +957,7 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
 			smb_freemsgmem(msg);  /* or 0 length field */
 			return(SMB_ERR_MEM); 
 		}
+		msg->total_hfields++;
 		memset(msg->hfield_dat[i],0,msg->hfield[i].length+1);  /* init to NULL */
 		if(msg->hfield[i].length
 			&& smb_fread(smb,msg->hfield_dat[i],msg->hfield[i].length,smb->shd_fp)
@@ -1509,7 +1509,6 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
 			,get_errno(),STRERROR(get_errno()),msg->idx.offset);
 		return(SMB_ERR_SEEK);
 	}
-
 	/* Verify that the number of blocks required to stored the actual 
 	   (calculated) header length does not exceed the number allocated. */
 	hdrlen=smb_getmsghdrlen(msg);
@@ -1527,7 +1526,6 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
 		return(SMB_ERR_HDR_LEN);
 	}
 	msg->hdr.length=(ushort)hdrlen; /* store the actual header length */
-
 	/**********************************/
 	/* Set the message header ID here */
 	/**********************************/
@@ -1553,7 +1551,6 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
 				,get_errno(),STRERROR(get_errno()));
 			return(SMB_ERR_WRITE);
 		}
-
 	/*******************************************/
 	/* Write the variable length header fields */
 	/*******************************************/
@@ -1690,10 +1687,11 @@ int SMBCALL smb_updatethread(smb_t* smb, smbmsg_t* remsg, ulong newmsgnum)
 		smb_unlockmsghdr(smb,remsg);
 		return(retval);
 	}
-	
+
 	/* Search for last reply and extend chain */
 	memset(&nextmsg,0,sizeof(nextmsg));
 	nextmsgnum=remsg->hdr.thread_first;	/* start with first reply */
+
 	while(1) {
 		nextmsg.idx.offset=0;
 		nextmsg.hdr.number=nextmsgnum;