From 0a2a5c994d30a94ee36eaa26cbb55dbc96184b31 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Wed, 13 Oct 2004 23:50:48 +0000
Subject: [PATCH] smb_unlocksmbhdr() now sets smb.last_error and returns
 SMB_ERR_UNLOCK if unlock() returns failure (non-zero). smb_open() now checks
 return value of smb_unlockmsghdr().

---
 src/smblib/smbdefs.h |  1 +
 src/smblib/smblib.c  | 24 ++++++++++++++----------
 2 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/src/smblib/smbdefs.h b/src/smblib/smbdefs.h
index 37cf54a4d3..23091333e7 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 9b79908ffc..edb42f4d0a 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);
-- 
GitLab