diff --git a/src/smblib/smbdefs.h b/src/smblib/smbdefs.h
index 37cf54a4d39e3a431f5814e5a0c82ebc5e2e434b..23091333e74a89522327ceeae02627c279a5df69 100644
--- a/src/smblib/smbdefs.h
+++ b/src/smblib/smbdefs.h
@@ -148,6 +148,7 @@
 #define SMB_ERR_TIMEOUT		-205		/* File operation timed-out */
 #define SMB_ERR_FILE_LEN	-206		/* File length invalid */
 #define SMB_ERR_DELETE		-207		/* File deletion error */
+#define SMB_ERR_UNLOCK		-208		/* File unlock error */
 #define SMB_ERR_MEM			-300		/* Memory allocation error */
 
 #define SMB_DUPE_MSG		1			/* Duplicate message detected by smb_addcrc() */
diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index 9b79908ffccffc27b4ff8024d37ea4f369db0bb4..edb42f4d0a8bf4cd6666ac7e6c765a47badee43b 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -139,7 +139,10 @@ int SMBCALL smb_open(smb_t* smb)
 			smb_close(smb);
 			return(SMB_ERR_READ); 
 		}
-		smb_unlocksmbhdr(smb);
+		if((i=smb_unlocksmbhdr(smb))!=SMB_SUCCESS) {
+			smb_close(smb);
+			return(i);
+		}
 		rewind(smb->shd_fp); 
 	}
 
@@ -300,7 +303,7 @@ int SMBCALL smb_trunchdr(smb_t* smb)
 	}
 	rewind(smb->shd_fp);
 	while(1) {
-		if(!chsize(fileno(smb->shd_fp),0L))
+		if(chsize(fileno(smb->shd_fp),0L)==0)
 			break;
 		if(get_errno()!=EACCES && get_errno()!=EAGAIN) {
 			safe_snprintf(smb->last_error,sizeof(smb->last_error)
@@ -412,20 +415,21 @@ int SMBCALL smb_putstatus(smb_t* smb)
 }
 
 /****************************************************************************/
-/* Unlocks previously locks message base header 							*/
+/* Unlocks previously locked message base header 							*/
 /****************************************************************************/
 int SMBCALL smb_unlocksmbhdr(smb_t* smb)
 {
-	int result;
-
 	if(smb->shd_fp==NULL) {
 		safe_snprintf(smb->last_error,sizeof(smb->last_error),"msgbase not open");
 		return(SMB_ERR_NOT_OPEN);
 	}
-	result = unlock(fileno(smb->shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t));
-	if(result==0)
-		smb->locked=FALSE;
-	return(result);
+	if(unlock(fileno(smb->shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t))!=0) {
+		safe_snprintf(smb->last_error,sizeof(smb->last_error)
+			,"%d (%s) unlocking message base header",get_errno(),STRERROR(get_errno()));
+		return(SMB_ERR_UNLOCK);
+	}
+	smb->locked=FALSE;
+	return(SMB_SUCCESS);
 }
 
 /********************************/
@@ -462,7 +466,7 @@ int SMBCALL smb_lockmsghdr(smb_t* smb, smbmsg_t* msg)
 		return(SMB_ERR_HDR_OFFSET);
 
 	while(1) {
-		if(!lock(fileno(smb->shd_fp),msg->idx.offset,sizeof(msghdr_t)))
+		if(lock(fileno(smb->shd_fp),msg->idx.offset,sizeof(msghdr_t))==0)
 			return(SMB_SUCCESS);
 		if(!start)
 			start=time(NULL);