1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-12 20:58:37 +03:00

r24135: Convert call_trans2open to the new API

This itself won't help much, because send_trans2_replies_new still allocates
the big buffers, but stay tuned :-)

Also add/update my copyright on stuff I recently touched.

Volker
This commit is contained in:
Volker Lendecke 2007-08-02 18:28:41 +00:00 committed by Gerald (Jerry) Carter
parent d9eef977dc
commit 248f15ff14
5 changed files with 77 additions and 38 deletions

View File

@ -2,6 +2,7 @@
Unix SMB/CIFS implementation.
negprot reply code
Copyright (C) Andrew Tridgell 1992-1998
Copyright (C) Volker Lendecke 2007
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -2,7 +2,7 @@
Unix SMB/CIFS implementation.
process incoming packets - main loop
Copyright (C) Andrew Tridgell 1992-1998
Copyright (C) Volker Lendecke 2005
Copyright (C) Volker Lendecke 2005-2007
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -4,6 +4,7 @@
Copyright (C) Andrew Tridgell 1992-1998
Copyright (C) Andrew Bartlett 2001
Copyright (C) Jeremy Allison 1992-2007.
Copyright (C) Volker Lendecke 2007
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -5,6 +5,7 @@
Copyright (C) Andrew Bartlett 2001
Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002
Copyright (C) Luke Howard 2003
Copyright (C) Volker Lendecke 2007
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -3,7 +3,7 @@
SMB transaction2 handling
Copyright (C) Jeremy Allison 1994-2007
Copyright (C) Stefan (metze) Metzmacher 2003
Copyright (C) Volker Lendecke 2005
Copyright (C) Volker Lendecke 2005-2007
Copyright (C) Steve French 2005
Copyright (C) James Peach 2007
@ -735,16 +735,37 @@ int send_trans2_replies(const char *inbuf,
return 0;
}
static void send_trans2_replies_new(struct smb_request *req,
const char *params,
int paramsize,
const char *pdata,
int datasize,
int max_data_bytes)
{
char *inbuf, *outbuf;
int length, bufsize;
if (!reply_prep_legacy(req, &inbuf, &outbuf, &length, &bufsize)) {
reply_nterror(req, NT_STATUS_NO_MEMORY);
return;
}
reply_post_legacy(req, send_trans2_replies(
inbuf, outbuf, bufsize,
params, paramsize,
pdata, datasize,
max_data_bytes));
}
/****************************************************************************
Reply to a TRANSACT2_OPEN.
****************************************************************************/
static int call_trans2open(connection_struct *conn,
struct smb_request *req,
char *inbuf, char *outbuf, int bufsize,
char **pparams, int total_params,
char **ppdata, int total_data,
unsigned int max_data_bytes)
static void call_trans2open(connection_struct *conn,
struct smb_request *req,
char **pparams, int total_params,
char **ppdata, int total_data,
unsigned int max_data_bytes)
{
char *params = *pparams;
char *pdata = *ppdata;
@ -779,7 +800,8 @@ static int call_trans2open(connection_struct *conn,
*/
if (total_params < 29) {
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
return;
}
flags = SVAL(params, 0);
@ -800,14 +822,16 @@ static int call_trans2open(connection_struct *conn,
pname = &params[28];
if (IS_IPC(conn)) {
return(ERROR_DOS(ERRSRV,ERRaccess));
reply_doserror(req, ERRSRV, ERRaccess);
return;
}
srvstr_get_path(inbuf, SVAL(inbuf,smb_flg2), fname, pname,
srvstr_get_path(params, req->flags2, fname, pname,
sizeof(fname), total_params - 28, STR_TERMINATE,
&status);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
reply_nterror(req, status);
return;
}
DEBUG(3,("call_trans2open %s deny_mode=0x%x attr=%d ofun=0x%x size=%d\n",
@ -818,16 +842,19 @@ static int call_trans2open(connection_struct *conn,
status = unix_convert(conn, fname, False, NULL, &sbuf);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
reply_nterror(req, status);
return;
}
status = check_name(conn, fname);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
reply_nterror(req, status);
return;
}
if (open_ofun == 0) {
return ERROR_NT(NT_STATUS_OBJECT_NAME_COLLISION);
reply_nterror(req, NT_STATUS_OBJECT_NAME_COLLISION);
return;
}
if (!map_open_params_to_ntcreate(fname, deny_mode, open_ofun,
@ -835,32 +862,38 @@ static int call_trans2open(connection_struct *conn,
&share_mode,
&create_disposition,
&create_options)) {
return ERROR_DOS(ERRDOS, ERRbadaccess);
reply_doserror(req, ERRDOS, ERRbadaccess);
return;
}
/* Any data in this call is an EA list. */
if (total_data && (total_data != 4) && !lp_ea_support(SNUM(conn))) {
return ERROR_NT(NT_STATUS_EAS_NOT_SUPPORTED);
reply_nterror(req, NT_STATUS_EAS_NOT_SUPPORTED);
return;
}
if (total_data != 4) {
if (total_data < 10) {
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
return;
}
if (IVAL(pdata,0) > total_data) {
DEBUG(10,("call_trans2open: bad total data size (%u) > %u\n",
IVAL(pdata,0), (unsigned int)total_data));
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
return;
}
ea_list = read_ea_list(tmp_talloc_ctx(), pdata + 4,
total_data - 4);
if (!ea_list) {
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
return;
}
} else if (IVAL(pdata,0) != 4) {
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
return;
}
status = open_file_ntcreate(conn, req, fname, &sbuf,
@ -873,11 +906,12 @@ static int call_trans2open(connection_struct *conn,
&smb_action, &fsp);
if (!NT_STATUS_IS_OK(status)) {
if (open_was_deferred(SVAL(inbuf,smb_mid))) {
if (open_was_deferred(req->mid)) {
/* We have re-scheduled this call. */
return -1;
return;
}
return ERROR_NT(status);
reply_nterror(req, status);
return;
}
size = get_file_size(sbuf);
@ -886,7 +920,8 @@ static int call_trans2open(connection_struct *conn,
inode = sbuf.st_ino;
if (fattr & aDIR) {
close_file(fsp,ERROR_CLOSE);
return(ERROR_DOS(ERRDOS,ERRnoaccess));
reply_doserror(req, ERRDOS,ERRnoaccess);
return;
}
/* Save the requested allocation size. */
@ -898,11 +933,13 @@ static int call_trans2open(connection_struct *conn,
if (fsp->is_directory) {
close_file(fsp,ERROR_CLOSE);
/* Can't set allocation size on a directory. */
return ERROR_NT(NT_STATUS_ACCESS_DENIED);
reply_nterror(req, NT_STATUS_ACCESS_DENIED);
return;
}
if (vfs_allocate_file_space(fsp, fsp->initial_allocation_size) == -1) {
close_file(fsp,ERROR_CLOSE);
return ERROR_NT(NT_STATUS_DISK_FULL);
reply_nterror(req, NT_STATUS_DISK_FULL);
return;
}
/* Adjust size here to return the right size in the reply.
@ -917,14 +954,16 @@ static int call_trans2open(connection_struct *conn,
status = set_ea(conn, fsp, fname, ea_list);
if (!NT_STATUS_IS_OK(status)) {
close_file(fsp,ERROR_CLOSE);
return ERROR_NT(status);
reply_nterror(req, status);
return;
}
}
/* Realloc the size of parameters and data we will return */
*pparams = (char *)SMB_REALLOC(*pparams, 30);
if(*pparams == NULL ) {
return ERROR_NT(NT_STATUS_NO_MEMORY);
reply_nterror(req, NT_STATUS_NO_MEMORY);
return;
}
params = *pparams;
@ -955,9 +994,7 @@ static int call_trans2open(connection_struct *conn,
}
/* Send the required number of replies */
send_trans2_replies(inbuf, outbuf, bufsize, params, 30, *ppdata, 0, max_data_bytes);
return -1;
send_trans2_replies_new(req, params, 30, *ppdata, 0, max_data_bytes);
}
/*********************************************************
@ -6588,7 +6625,7 @@ static int handle_trans2(connection_struct *conn, struct smb_request *req,
struct trans_state *state,
char *inbuf, char *outbuf, int size, int bufsize)
{
int outsize;
int outsize = -1;
if (Protocol >= PROTOCOL_NT1) {
SSVAL(outbuf,smb_flg2,SVAL(outbuf,smb_flg2) | 0x40); /* IS_LONG_NAME */
@ -6599,11 +6636,10 @@ static int handle_trans2(connection_struct *conn, struct smb_request *req,
case TRANSACT2_OPEN:
{
START_PROFILE(Trans2_open);
outsize = call_trans2open(
conn, req, inbuf, outbuf, bufsize,
&state->param, state->total_param,
&state->data, state->total_data,
state->max_data_return);
call_trans2open(conn, req,
&state->param, state->total_param,
&state->data, state->total_data,
state->max_data_return);
END_PROFILE(Trans2_open);
break;
}