svn commit: samba r15935 - in trunk/source/smbd: .

jra at samba.org jra at samba.org
Mon May 29 21:44:11 GMT 2006


Author: jra
Date: 2006-05-29 21:44:10 +0000 (Mon, 29 May 2006)
New Revision: 15935

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15935

Log:
Fix memory leak on error exit path. Trying to
track down #3308.
Jeremy.

Modified:
   trunk/source/smbd/trans2.c


Changeset:
Modified: trunk/source/smbd/trans2.c
===================================================================
--- trunk/source/smbd/trans2.c	2006-05-29 21:34:34 UTC (rev 15934)
+++ trunk/source/smbd/trans2.c	2006-05-29 21:44:10 UTC (rev 15935)
@@ -727,7 +727,7 @@
 	time_t open_time;
 #endif
 	int open_ofun;
-	int32 open_size;
+	uint32 open_size;
 	char *pname;
 	pstring fname;
 	SMB_OFF_T size=0;
@@ -860,6 +860,30 @@
 		return(ERROR_DOS(ERRDOS,ERRnoaccess));
 	}
 
+	/* Save the requested allocation size. */
+	/* Allocate space for the file if a size hint is supplied */
+	if ((smb_action == FILE_WAS_CREATED) || (smb_action == FILE_WAS_OVERWRITTEN)) {
+		SMB_BIG_UINT allocation_size = (SMB_BIG_UINT)open_size;
+		if (allocation_size && (allocation_size > (SMB_BIG_UINT)size)) {
+                        fsp->initial_allocation_size = smb_roundup(fsp->conn, allocation_size);
+                        if (fsp->is_directory) {
+                                close_file(fsp,ERROR_CLOSE);
+                                /* Can't set allocation size on a directory. */
+                                return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+                        }
+                        if (vfs_allocate_file_space(fsp, fsp->initial_allocation_size) == -1) {
+                                close_file(fsp,ERROR_CLOSE);
+                                return ERROR_NT(NT_STATUS_DISK_FULL);
+                        }
+
+			/* Adjust size here to return the right size in the reply.
+			   Windows does it this way. */
+			size = fsp->initial_allocation_size;
+                } else {
+                        fsp->initial_allocation_size = smb_roundup(fsp->conn,(SMB_BIG_UINT)size);
+                }
+	}
+
 	if (total_data && smb_action == FILE_WAS_CREATED) {
 		status = set_ea(conn, fsp, fname, ea_list);
 		talloc_destroy(ctx);
@@ -5238,6 +5262,7 @@
 		} else {
 			DEBUG(2,("Invalid smb_sucnt in trans2 call(%u)\n",state->setup_count));
 			DEBUG(2,("Transaction is %d\n",tran_call));
+			TALLOC_FREE(state);
 			END_PROFILE(SMBtrans2);
 			return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
 		}



More information about the samba-cvs mailing list