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