mirror of
https://github.com/samba-team/samba.git
synced 2025-01-13 13:18:06 +03:00
r15936: Fix memory leak on error exit path. Trying to
track down #3308.
Jeremy.
(This used to be commit e39c11c911
)
This commit is contained in:
parent
5f8eb11651
commit
803eed1062
@ -727,7 +727,7 @@ static int call_trans2open(connection_struct *conn, char *inbuf, char *outbuf, i
|
||||
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 @@ static int call_trans2open(connection_struct *conn, char *inbuf, char *outbuf, i
|
||||
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 @@ int reply_trans2(connection_struct *conn, char *inbuf,char *outbuf,
|
||||
} 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user