mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
smbd/nttrans.c smbd/trans2.c: First fixes for NT5.0beta2. That redirector
has some *horrible* bugs !
smbwrapper/shared.c smbwrapper/smbsh.c smbwrapper/smbw.c: Fixed gcc warnings.
Jeremy.
(This used to be commit 76448d1d82
)
This commit is contained in:
parent
c778331328
commit
60cf45b2bc
@ -232,6 +232,39 @@ static int send_nt_replies(char *outbuf, int bufsize, char *params,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
(Hopefully) temporary call to fix bugs in NT5.0beta2. This OS sends unicode
|
||||
strings in NT calls AND DOESN'T SET THE UNICODE BIT !!!!!!!
|
||||
****************************************************************************/
|
||||
|
||||
static void my_wcstombs(char *dst, uint16 *src, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for(i = 0; i < len; i++)
|
||||
dst[i] = (char)SVAL(src,i*2);
|
||||
}
|
||||
|
||||
static void get_filename( char *fname, char *inbuf, int data_offset, int data_len, int fname_len)
|
||||
{
|
||||
if(data_len - fname_len > 1) {
|
||||
/*
|
||||
* NT 5.0 Beta 2 has kindly sent us a UNICODE string
|
||||
* without bothering to set the unicode bit. How kind.
|
||||
*
|
||||
* Firstly - ensure that the data offset is aligned
|
||||
* on a 2 byte boundary - add one if not.
|
||||
*/
|
||||
fname_len = fname_len/2;
|
||||
if(data_offset & 1)
|
||||
data_offset++;
|
||||
my_wcstombs( fname, (uint16 *)(inbuf+data_offset), fname_len);
|
||||
} else {
|
||||
StrnCpy(fname,inbuf+data_offset,fname_len);
|
||||
}
|
||||
fname[fname_len] = '\0';
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Save case statics.
|
||||
****************************************************************************/
|
||||
@ -327,7 +360,7 @@ static int map_share_mode( uint32 desired_access, uint32 share_access, uint32 fi
|
||||
if(desired_access & (DELETE_ACCESS|FILE_WRITE_ATTRIBUTES|
|
||||
WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS))
|
||||
smb_open_mode = 2;
|
||||
else if(desired_access & (FILE_EXECUTE|READ_CONTROL_ACCESS))
|
||||
else if(desired_access & (FILE_EXECUTE|FILE_READ_ATTRIBUTES|READ_CONTROL_ACCESS))
|
||||
smb_open_mode = 0;
|
||||
else {
|
||||
DEBUG(0,("map_share_mode: Incorrect value for desired_access = %x\n",
|
||||
@ -481,12 +514,22 @@ int reply_ntcreate_and_X(connection_struct *conn,
|
||||
if(fname_len + dir_name_len >= sizeof(pstring))
|
||||
return(ERROR(ERRSRV,ERRfilespecs));
|
||||
|
||||
get_filename(&fname[dir_name_len], inbuf, smb_buf(inbuf)-inbuf,
|
||||
smb_buflen(inbuf),fname_len);
|
||||
#if 0
|
||||
StrnCpy(&fname[dir_name_len], smb_buf(inbuf),fname_len);
|
||||
fname[dir_name_len+fname_len] = '\0';
|
||||
#endif
|
||||
|
||||
} else {
|
||||
|
||||
get_filename(fname, inbuf, smb_buf(inbuf)-inbuf,
|
||||
smb_buflen(inbuf),fname_len);
|
||||
|
||||
#if 0
|
||||
StrnCpy(fname,smb_buf(inbuf),fname_len);
|
||||
fname[fname_len] = '\0';
|
||||
#endif
|
||||
}
|
||||
|
||||
/* If it's an IPC, use the pipe handler. */
|
||||
|
@ -1115,7 +1115,7 @@ static int call_trans2qfsinfo(connection_struct *conn,
|
||||
}
|
||||
case SMB_QUERY_FS_ATTRIBUTE_INFO:
|
||||
data_len = 12 + 2*strlen(fstype);
|
||||
SIVAL(pdata,0,FILE_CASE_PRESERVED_NAMES); /* FS ATTRIBUTES */
|
||||
SIVAL(pdata,0,FILE_CASE_PRESERVED_NAMES|FILE_CASE_SENSITIVE_SEARCH); /* FS ATTRIBUTES */
|
||||
#if 0 /* Old code. JRA. */
|
||||
SIVAL(pdata,0,0x4006); /* FS ATTRIBUTES == long filenames supported? */
|
||||
#endif /* Old code. */
|
||||
@ -1238,23 +1238,45 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
char *fname;
|
||||
char *p;
|
||||
int l;
|
||||
SMB_OFF_T pos;
|
||||
SMB_OFF_T pos = 0;
|
||||
BOOL bad_path = False;
|
||||
|
||||
if (tran_call == TRANSACT2_QFILEINFO) {
|
||||
files_struct *fsp = file_fsp(params,0);
|
||||
info_level = SVAL(params,2);
|
||||
|
||||
CHECK_FSP(fsp,conn);
|
||||
CHECK_ERROR(fsp);
|
||||
if(fsp && fsp->open && fsp->is_directory) {
|
||||
/*
|
||||
* This is actually a QFILEINFO on a directory
|
||||
* handle (returned from an NT SMB). NT5.0 seems
|
||||
* to do this call. JRA.
|
||||
*/
|
||||
fname = fsp->fsp_name;
|
||||
unix_convert(fname,conn,0,&bad_path,&sbuf);
|
||||
if (!check_name(fname,conn) || (!VALID_STAT(sbuf) && dos_stat(fname,&sbuf))) {
|
||||
DEBUG(3,("fileinfo of %s failed (%s)\n",fname,strerror(errno)));
|
||||
if((errno == ENOENT) && bad_path)
|
||||
{
|
||||
unix_ERR_class = ERRDOS;
|
||||
unix_ERR_code = ERRbadpath;
|
||||
}
|
||||
return(UNIXERROR(ERRDOS,ERRbadpath));
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Original code - this is an open file.
|
||||
*/
|
||||
CHECK_FSP(fsp,conn);
|
||||
CHECK_ERROR(fsp);
|
||||
|
||||
fname = fsp->fsp_name;
|
||||
if (sys_fstat(fsp->fd_ptr->fd,&sbuf) != 0) {
|
||||
DEBUG(3,("fstat of fnum %d failed (%s)\n",fsp->fnum, strerror(errno)));
|
||||
return(UNIXERROR(ERRDOS,ERRbadfid));
|
||||
fname = fsp->fsp_name;
|
||||
if (sys_fstat(fsp->fd_ptr->fd,&sbuf) != 0) {
|
||||
DEBUG(3,("fstat of fnum %d failed (%s)\n",fsp->fnum, strerror(errno)));
|
||||
return(UNIXERROR(ERRDOS,ERRbadfid));
|
||||
}
|
||||
if((pos = sys_lseek(fsp->fd_ptr->fd,0,SEEK_CUR)) == -1)
|
||||
return(UNIXERROR(ERRDOS,ERRnoaccess));
|
||||
}
|
||||
if((pos = sys_lseek(fsp->fd_ptr->fd,0,SEEK_CUR)) == -1)
|
||||
return(UNIXERROR(ERRDOS,ERRnoaccess));
|
||||
} else {
|
||||
/* qpathinfo */
|
||||
info_level = SVAL(params,0);
|
||||
@ -1270,7 +1292,6 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
}
|
||||
return(UNIXERROR(ERRDOS,ERRbadpath));
|
||||
}
|
||||
pos = 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -121,7 +121,6 @@ char *smbw_getshared(const char *name)
|
||||
|
||||
i=0;
|
||||
while (i < shared_size) {
|
||||
int len;
|
||||
char *n, *v;
|
||||
|
||||
n = &variables[i];
|
||||
|
@ -38,7 +38,6 @@ int main(int argc, char *argv[])
|
||||
char *p, *u;
|
||||
char *libd = BINDIR;
|
||||
pstring line;
|
||||
extern FILE *dbf;
|
||||
int opt;
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
@ -404,7 +404,7 @@ struct smbw_server *smbw_server(char *server, char *share)
|
||||
DEBUG(4,("server_n=[%s] server=[%s]\n", server_n, server));
|
||||
|
||||
if ((p=strchr(server_n,'#')) && strcmp(p+1,"1D")==0) {
|
||||
struct in_addr ip;
|
||||
struct in_addr sip;
|
||||
pstring s;
|
||||
|
||||
fstrcpy(group, server_n);
|
||||
@ -414,11 +414,11 @@ struct smbw_server *smbw_server(char *server, char *share)
|
||||
/* cache the workgroup master lookup */
|
||||
slprintf(s,sizeof(s)-1,"MASTER_%s", group);
|
||||
if (!(server_n = smbw_getshared(s))) {
|
||||
if (!find_master_ip(group, &ip)) {
|
||||
if (!find_master_ip(group, &sip)) {
|
||||
errno = ENOENT;
|
||||
return NULL;
|
||||
}
|
||||
fstrcpy(group, inet_ntoa(ip));
|
||||
fstrcpy(group, inet_ntoa(sip));
|
||||
server_n = group;
|
||||
smbw_setshared(s,server_n);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user