diff --git a/src/smblib/smballoc.c b/src/smblib/smballoc.c
index 8396a939d53b74b0566cd36eed3d3a4d6634d4b9..b26be60c7f2010d576bfc5358e480abd1edd3b2e 100644
--- a/src/smblib/smballoc.c
+++ b/src/smblib/smballoc.c
@@ -180,7 +180,7 @@ int smb_freemsgdat(smb_t* smb, off_t offset, ulong length, uint16_t refs)
 				continue;
 			}
 		}
-		
+
 		if(fseek(smb->sda_fp,-(int)sizeof(i),SEEK_CUR)) {
 			safe_snprintf(smb->last_error,sizeof(smb->last_error)
 				,"%s %d '%s' seeking backwards 2 bytes in allocation file", __FUNCTION__
@@ -192,13 +192,14 @@ int smb_freemsgdat(smb_t* smb, off_t offset, ulong length, uint16_t refs)
 			safe_snprintf(smb->last_error,sizeof(smb->last_error)
 				,"%s writing allocation bytes at offset %ld", __FUNCTION__
 				,sda_offset);
-			retval=SMB_ERR_WRITE; 
+			retval=SMB_ERR_WRITE;
 			break;
 		}
 	}
 	fflush(smb->sda_fp);
 	if(filelength(fileno(smb->sdt_fp)) / SDT_BLOCK_LEN > (long)(filelength(fileno(smb->sda_fp)) / sizeof(uint16_t)))
-		chsize(fileno(smb->sdt_fp), (long)(filelength(fileno(smb->sda_fp)) / sizeof(uint16_t)) * SDT_BLOCK_LEN);
+		if(chsize(fileno(smb->sdt_fp), (long)(filelength(fileno(smb->sda_fp)) / sizeof(uint16_t)) * SDT_BLOCK_LEN) != 0)
+			retval = SMB_ERR_TRUNCATE;
 	if(da_opened)
 		smb_close_da(smb);
 	smb_unlocksmbhdr(smb);
@@ -307,7 +308,8 @@ int smb_freemsghdr(smb_t* smb, off_t offset, ulong length)
 	sha_offset = offset/SHD_BLOCK_LEN;
 	if(filelength(fileno(smb->sha_fp)) <= (sha_offset + blocks)) {
 		if(chsize(fileno(smb->sha_fp), (long)sha_offset) == 0) {
-			chsize(fileno(smb->shd_fp), (long)(smb->status.header_offset + offset));
+			if(chsize(fileno(smb->shd_fp), (long)(smb->status.header_offset + offset)) != 0)
+				return SMB_ERR_TRUNCATE;
 			return SMB_SUCCESS;
 		}
 	}
diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index 952c6408969f03cf2f5e78ad6a9e9d394e664bdd..7eaa5c9bed88d252765bde37616ddcac297b58b7 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -1492,6 +1492,7 @@ int smb_addcrc(smb_t* smb, uint32_t crc)
 	char	str[MAX_PATH+1];
 	int 	file;
 	int		wr;
+	int		result = SMB_SUCCESS;
 	off_t	length;
 	long	newlen;
 	ulong	l;
@@ -1562,9 +1563,13 @@ int smb_addcrc(smb_t* smb, uint32_t crc)
 
 		if(length>=(long)(smb->status.max_crcs*sizeof(int32_t))) {
 			newlen=(smb->status.max_crcs-1)*sizeof(int32_t);
-			chsize(file,0);	/* truncate it */
-			lseek(file,0L,SEEK_SET);
-			write(file,buf+(length-newlen),newlen); 
+			if(chsize(file,0) != 0) {	/* truncate it */
+				result = SMB_ERR_TRUNCATE;
+			} else {
+				lseek(file,0L,SEEK_SET);
+				if(write(file,buf+(length-newlen),newlen) != newlen)
+					result = SMB_ERR_WRITE;
+			}
 		}
 		free(buf);
 	}
@@ -1578,7 +1583,7 @@ int smb_addcrc(smb_t* smb, uint32_t crc)
 		return(SMB_ERR_WRITE);
 	}
 
-	return(SMB_SUCCESS);
+	return result;
 }
 
 /****************************************************************************/
@@ -2009,13 +2014,16 @@ int smb_create(smb_t* smb)
 		return retval;
 
 	rewind(smb->shd_fp);
-	chsize(fileno(smb->shd_fp),sizeof(smbhdr_t)+sizeof(smbstatus_t));
+	if(chsize(fileno(smb->shd_fp),sizeof(smbhdr_t)+sizeof(smbstatus_t)) != 0)
+		return SMB_ERR_TRUNCATE;
 	fflush(smb->shd_fp);
 
 	rewind(smb->sdt_fp);
-	chsize(fileno(smb->sdt_fp),0L);
+	if(chsize(fileno(smb->sdt_fp),0L) != 0)
+		return SMB_ERR_TRUNCATE;
 	rewind(smb->sid_fp);
-	chsize(fileno(smb->sid_fp),0L);
+	if(chsize(fileno(smb->sid_fp),0L) != 0)
+		return SMB_ERR_TRUNCATE;
 
 	SAFEPRINTF(str,"%s.ini",smb->file);
 	if((fp = fopen(str, "w")) != NULL) {
diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h
index 480f8c379b3536bc6563a33380da0db402388af3..1b00516d7112575deb8515074d6b3fba8aef3f7a 100644
--- a/src/smblib/smblib.h
+++ b/src/smblib/smblib.h
@@ -68,6 +68,7 @@
 #define SMB_ERR_DELETE		-207		/* File deletion error */
 #define SMB_ERR_UNLOCK		-208		/* File unlock error */
 #define SMB_ERR_RENAME		-209		/* File rename error */
+#define SMB_ERR_TRUNCATE	-210		/* File truncation error */
 #define SMB_ERR_MEM			-300		/* Memory allocation error */
 
 #define SMB_DUPE_MSG		1			/* Duplicate message detected by smb_addcrc() */
diff --git a/src/xpdev/semfile.c b/src/xpdev/semfile.c
index 5b17cb940773b1df94d95bafe06c08d2e8f64565..df883274a3c238766fd0c842b0c1f537b8780f70 100644
--- a/src/xpdev/semfile.c
+++ b/src/xpdev/semfile.c
@@ -128,6 +128,8 @@ BOOL semfile_signal(const char* fname, const char* text)
 {
 	int file;
 	struct utimbuf ut;
+	size_t textlen = 0;
+	ssize_t wrlen = 0;
 #if !defined(NO_SOCKET_SUPPORT)
 	char hostname[128];
 
@@ -137,10 +139,10 @@ BOOL semfile_signal(const char* fname, const char* text)
 	if((file=open(fname,O_CREAT|O_WRONLY, DEFFILEMODE))<0)	/* use sopen instead? */
 		return(FALSE);
 	if(text!=NULL)
-		write(file,text,strlen(text));
+		wrlen = write(file,text,textlen = strlen(text));
 	close(file);
 
 	/* update the time stamp */
 	ut.actime = ut.modtime = time(NULL);
-	return utime(fname, &ut)==0;
+	return utime(fname, &ut)==0 && wrlen == textlen;
 }