diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index 19be9fc55a93d087add49568dcdffe688067543b..ae7814b4aed2c46d3acb64ce745b4e938e8e0bb7 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -1368,9 +1368,13 @@ int SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length
 			, ushort headers)
 {
 	int		da_opened=0;
+	int		retval=0;
 	ushort	i;
 	ulong	l,blocks;
 
+	if(smb->status.attr&SMB_HYPERALLOC)	/* do nothing */
+		return(0);
+
 	blocks=smb_datblocks(length);
 
 	if(smb->sda_fp==NULL) {
@@ -1385,11 +1389,13 @@ int SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length
 			sprintf(smb->last_error
 				,"seeking to %ld of allocation file"
 				,((offset/SDT_BLOCK_LEN)+l)*2L);
-			return(1);
+			retval=1;
+			break;
 		}
 		if(!fread(&i,2,1,smb->sda_fp)) {
 			sprintf(smb->last_error,"reading allocation bytes");
-			return(2);
+			retval=2;
+			break;
 		}
 		if(!headers || headers>i)
 			i=0;			/* don't want to go negative */
@@ -1397,17 +1403,19 @@ int SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length
 			i-=headers;
 		if(fseek(smb->sda_fp,-2L,SEEK_CUR)) {
 			sprintf(smb->last_error,"seeking backwards 2 bytes in allocation file");
-			return(3);
+			retval=3;
+			break;
 		}
 		if(!fwrite(&i,2,1,smb->sda_fp)) {
 			sprintf(smb->last_error,"writing allocation bytes");
-			return(4); 
+			retval=4; 
+			break;
 		}
 	}
 	fflush(smb->sda_fp);
 	if(da_opened)
 		smb_close_da(smb);
-	return(0);
+	return(retval);
 }
 
 /****************************************************************************/