From e296fec9f143dab203b9c8cc8a5d7bea6448e8c0 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Wed, 20 Aug 2003 09:35:24 +0000
Subject: [PATCH] Created smb_freemsg_dfields() to free all data fields for a
 specified msg. Created SMB_ALL_REFS macro, used to free all references to
 data block.

---
 src/smblib/smblib.c | 75 +++++++++++++++++++++++++++------------------
 src/smblib/smblib.h | 11 ++++---
 2 files changed, 52 insertions(+), 34 deletions(-)

diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index 1f9db87a5c..f24f2b85d3 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -68,7 +68,7 @@
 #include "filewrap.h"
 
 /* Use smb_ver() and smb_lib_ver() to obtain these values */
-#define SMBLIB_VERSION		"2.22"      /* SMB library version */
+#define SMBLIB_VERSION		"2.23"      /* SMB library version */
 #define SMB_VERSION 		0x0121		/* SMB format version */
 										/* High byte major, low byte minor */
 
@@ -1041,9 +1041,10 @@ int SMBCALL smb_copymsgmem(smb_t* smb, smbmsg_t* msg, smbmsg_t* srcmsg)
 	/* data field types/lengths */
 	if(msg->hdr.total_dfields>0) {
 		if((msg->dfield=(dfield_t *)MALLOC(msg->hdr.total_dfields*sizeof(dfield_t)))==NULL) {
-			sprintf(smb->last_error
-				,"malloc failure of %d bytes for %d data fields"
-				,msg->hdr.total_dfields*sizeof(dfield_t), msg->hdr.total_dfields);
+			if(smb!=NULL)
+				sprintf(smb->last_error
+					,"malloc failure of %d bytes for %d data fields"
+					,msg->hdr.total_dfields*sizeof(dfield_t), msg->hdr.total_dfields);
 			return(SMB_ERR_MEM);
 		}
 		memcpy(msg->dfield,srcmsg->dfield,msg->hdr.total_dfields*sizeof(dfield_t));
@@ -1052,26 +1053,29 @@ int SMBCALL smb_copymsgmem(smb_t* smb, smbmsg_t* msg, smbmsg_t* srcmsg)
 	/* header field types/lengths */
 	if(msg->total_hfields>0) {
 		if((msg->hfield=(hfield_t *)MALLOC(msg->total_hfields*sizeof(hfield_t)))==NULL) {
-			sprintf(smb->last_error
-				,"malloc failure of %d bytes for %d header fields"
-				,msg->total_hfields*sizeof(hfield_t), msg->total_hfields);
+			if(smb!=NULL)
+				sprintf(smb->last_error
+					,"malloc failure of %d bytes for %d header fields"
+					,msg->total_hfields*sizeof(hfield_t), msg->total_hfields);
 			return(SMB_ERR_MEM);
 		}
 		memcpy(msg->hfield,srcmsg->hfield,msg->total_hfields*sizeof(hfield_t));
 
 		/* header field data */
 		if((msg->hfield_dat=(void**)MALLOC(msg->total_hfields*sizeof(void*)))==NULL) {
-			sprintf(smb->last_error
-				,"malloc failure of %d bytes for %d header fields"
-				,msg->total_hfields*sizeof(void*), msg->total_hfields);
+			if(smb!=NULL)
+				sprintf(smb->last_error
+					,"malloc failure of %d bytes for %d header fields"
+					,msg->total_hfields*sizeof(void*), msg->total_hfields);
 			return(SMB_ERR_MEM);
 		}
 
 		for(i=0;i<msg->total_hfields;i++) {
 			if((msg->hfield_dat[i]=(void*)MALLOC(msg->hfield[i].length+1))==NULL) {
-				sprintf(smb->last_error
-					,"malloc failure of %d bytes for header field #%d"
-					,msg->hfield[i].length+1, i+1);
+				if(smb!=NULL)
+					sprintf(smb->last_error
+						,"malloc failure of %d bytes for header field #%d"
+						,msg->hfield[i].length+1, i+1);
 				return(SMB_ERR_MEM);
 			}
 			memset(msg->hfield_dat[i],0,msg->hfield[i].length+1);
@@ -1596,7 +1600,7 @@ ulong SMBCALL smb_hdrblocks(ulong length)
 /* smb_close_da() should be called after									*/
 /* Returns negative on error												*/
 /****************************************************************************/
-long SMBCALL smb_allocdat(smb_t* smb, ulong length, ushort headers)
+long SMBCALL smb_allocdat(smb_t* smb, ulong length, ushort refs)
 {
     ushort  i,j;
 	ulong	l,blocks,offset=0L;
@@ -1629,7 +1633,7 @@ long SMBCALL smb_allocdat(smb_t* smb, ulong length, ushort headers)
 		return(SMB_ERR_SEEK);
 	}
 	for(l=0;l<blocks;l++)
-		if(!fwrite(&headers,2,1,smb->sda_fp)) {
+		if(!fwrite(&refs,2,1,smb->sda_fp)) {
 			sprintf(smb->last_error,"%d (%s) writing allocation bytes"
 				,errno,STRERROR(errno));
 			return(SMB_ERR_WRITE);
@@ -1642,7 +1646,7 @@ long SMBCALL smb_allocdat(smb_t* smb, ulong length, ushort headers)
 /* Allocates space for data, but doesn't search for unused blocks           */
 /* Returns negative on error												*/
 /****************************************************************************/
-long SMBCALL smb_fallocdat(smb_t* smb, ulong length, ushort headers)
+long SMBCALL smb_fallocdat(smb_t* smb, ulong length, ushort refs)
 {
 	ulong	l,blocks,offset;
 
@@ -1662,7 +1666,7 @@ long SMBCALL smb_fallocdat(smb_t* smb, ulong length, ushort headers)
 		return(SMB_ERR_DAT_OFFSET);
 	}
 	for(l=0;l<blocks;l++)
-		if(!fwrite(&headers,2,1,smb->sda_fp))
+		if(!fwrite(&refs,2,1,smb->sda_fp))
 			break;
 	fflush(smb->sda_fp);
 	if(l<blocks) {
@@ -1677,8 +1681,7 @@ long SMBCALL smb_fallocdat(smb_t* smb, ulong length, ushort headers)
 /* De-allocates space for data												*/
 /* Returns non-zero on error												*/
 /****************************************************************************/
-int SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length
-			, ushort headers)
+int SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length, ushort refs)
 {
 	int		da_opened=0;
 	int		retval=0;
@@ -1714,10 +1717,10 @@ int SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length
 			retval=SMB_ERR_READ;
 			break;
 		}
-		if(!headers || headers>i)
+		if(refs==SMB_ALL_REFS || refs>i)
 			i=0;			/* don't want to go negative */
 		else
-			i-=headers;
+			i-=refs;
 		if(fseek(smb->sda_fp,-2L,SEEK_CUR)) {
 			sprintf(smb->last_error,"%d (%s) seeking backwards 2 bytes in allocation file"
 				,errno,STRERROR(errno));
@@ -1741,7 +1744,7 @@ int SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length
 /* Adds to data allocation records for blocks starting at 'offset'          */
 /* Returns non-zero on error												*/
 /****************************************************************************/
-int SMBCALL smb_incdat(smb_t* smb, ulong offset, ulong length, ushort headers)
+int SMBCALL smb_incdat(smb_t* smb, ulong offset, ulong length, ushort refs)
 {
 	ushort	i;
 	ulong	l,blocks;
@@ -1761,7 +1764,7 @@ int SMBCALL smb_incdat(smb_t* smb, ulong offset, ulong length, ushort headers)
 				,errno,STRERROR(errno));
 			return(SMB_ERR_READ);
 		}
-		i+=headers;
+		i+=refs;
 		if(fseek(smb->sda_fp,-2L,SEEK_CUR)) {
 			return(SMB_ERR_SEEK);
 		}
@@ -1834,21 +1837,33 @@ int SMBCALL smb_freemsghdr(smb_t* smb, ulong offset, ulong length)
 }
 
 /****************************************************************************/
-/* Frees all allocated header and data blocks for 'msg'                     */
 /****************************************************************************/
-int SMBCALL smb_freemsg(smb_t* smb, smbmsg_t* msg)
+int SMBCALL smb_freemsg_dfields(smb_t* smb, smbmsg_t* msg, ushort refs)
 {
-	int 	i;
+	int		i;
 	ushort	x;
 
-	if(smb->status.attr&SMB_HYPERALLOC)  /* Nothing to do */
-		return(SMB_SUCCESS);
-
 	for(x=0;x<msg->hdr.total_dfields;x++) {
 		if((i=smb_freemsgdat(smb,msg->hdr.offset+msg->dfield[x].offset
-			,msg->dfield[x].length,1))!=0)
+			,msg->dfield[x].length,refs))!=0)
 			return(i); 
 	}
+	return(0);
+}
+
+/****************************************************************************/
+/* Frees all allocated header and data blocks (1 reference) for 'msg'       */
+/****************************************************************************/
+int SMBCALL smb_freemsg(smb_t* smb, smbmsg_t* msg)
+{
+	int 	i;
+
+	if(smb->status.attr&SMB_HYPERALLOC)  /* Nothing to do */
+		return(SMB_SUCCESS);
+
+	if((i=smb_freemsg_dfields(smb,msg,1))!=0)
+		return(i);
+
 	return(smb_freemsghdr(smb,msg->idx.offset-smb->status.header_offset
 		,msg->hdr.length));
 }
diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h
index 7a5c33c362..f417cbd11e 100644
--- a/src/smblib/smblib.h
+++ b/src/smblib/smblib.h
@@ -78,6 +78,8 @@
 #define SMB_STACK_PUSH      1           /* Push a msg base onto smb_stack() */
 #define SMB_STACK_XCHNG     2           /* Exchange msg base w/last pushed	*/
 
+#define SMB_ALL_REFS		0			/* Free all references to data		*/
+
 #define GETMSGTXT_TAILS 	(1<<0)		/* Get message tail(s)				*/
 #define GETMSGTXT_NO_BODY	(1<<1)		/* Do not retrieve message body		*/
 
@@ -128,13 +130,14 @@ SMBEXPORT ulong	SMBCALL smb_datblocks(ulong length);
 SMBEXPORT long	SMBCALL smb_allochdr(smb_t* smb, ulong length);
 SMBEXPORT long	SMBCALL smb_fallochdr(smb_t* smb, ulong length);
 SMBEXPORT long	SMBCALL smb_hallochdr(smb_t* smb);
-SMBEXPORT long	SMBCALL smb_allocdat(smb_t* smb, ulong length, ushort headers);
-SMBEXPORT long	SMBCALL smb_fallocdat(smb_t* smb, ulong length, ushort headers);
+SMBEXPORT long	SMBCALL smb_allocdat(smb_t* smb, ulong length, ushort refs);
+SMBEXPORT long	SMBCALL smb_fallocdat(smb_t* smb, ulong length, ushort refs);
 SMBEXPORT long	SMBCALL smb_hallocdat(smb_t* smb);
 SMBEXPORT int	SMBCALL smb_incmsg(smb_t* smb, smbmsg_t* msg);
-SMBEXPORT int 	SMBCALL smb_incdat(smb_t* smb, ulong offset, ulong length, ushort headers);
+SMBEXPORT int 	SMBCALL smb_incdat(smb_t* smb, ulong offset, ulong length, ushort refs);
 SMBEXPORT int 	SMBCALL smb_freemsg(smb_t* smb, smbmsg_t* msg);
-SMBEXPORT int 	SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length, ushort headers);
+SMBEXPORT int	SMBCALL smb_freemsg_dfields(smb_t* smb, smbmsg_t* msg, ushort refs);
+SMBEXPORT int 	SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length, ushort refs);
 SMBEXPORT int 	SMBCALL smb_freemsghdr(smb_t* smb, ulong offset, ulong length);
 SMBEXPORT void	SMBCALL smb_freemsgtxt(char* buf);
 SMBEXPORT int	SMBCALL	smb_copymsgmem(smb_t* smb, smbmsg_t* destmsg, smbmsg_t* srcmsg);
-- 
GitLab