diff options
author | Jeremy Allison <jra@samba.org> | 2009-06-18 13:13:38 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2009-06-18 13:13:38 -0700 |
commit | 34267482d53cb559cc40c4ec2bee929c21b7886b (patch) | |
tree | dae973a4b11a0a7f3dd51e07a30f7a1065d7c6a6 /source3/smbd/reply.c | |
parent | e7e98ba4807f3c4e0538b24ae0092f69383ae2d7 (diff) | |
download | samba-34267482d53cb559cc40c4ec2bee929c21b7886b.tar.gz samba-34267482d53cb559cc40c4ec2bee929c21b7886b.tar.bz2 samba-34267482d53cb559cc40c4ec2bee929c21b7886b.zip |
Replace the boilerplate calls to :
resolve_dfspath() -> unix_convert() -> get_full_smb_filename() -> check_name()
with a new function filename_convert().
This restores the check_name() calls that had gone missing
since the default create_file was changed. All "standard"
pathname processing now goes through filename_convert().
I'll take a look at the non-standard pathname processing
next. As a benefit, fixed a missing resolve_dfspath()
in the trans2 mkdir call.
Jeremy.
Diffstat (limited to 'source3/smbd/reply.c')
-rw-r--r-- | source3/smbd/reply.c | 168 |
1 files changed, 35 insertions, 133 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 996cba208b..f11f3bfed7 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -987,10 +987,15 @@ void reply_checkpath(struct smb_request *req) return; } - status = resolve_dfspath(ctx, conn, - req->flags2 & FLAGS2_DFS_PATHNAMES, - name, - &name); + DEBUG(3,("reply_checkpath %s mode=%d\n", name, (int)SVAL(req->vwv+0, 0))); + + status = filename_convert(ctx, + conn, + req->flags2 & FLAGS2_DFS_PATHNAMES, + name, + &smb_fname, + &name); + if (!NT_STATUS_IS_OK(status)) { if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) { reply_botherror(req, NT_STATUS_PATH_NOT_COVERED, @@ -1001,24 +1006,6 @@ void reply_checkpath(struct smb_request *req) goto path_err; } - DEBUG(3,("reply_checkpath %s mode=%d\n", name, (int)SVAL(req->vwv+0, 0))); - - status = unix_convert(ctx, conn, name, &smb_fname, 0); - if (!NT_STATUS_IS_OK(status)) { - goto path_err; - } - - status = get_full_smb_filename(ctx, smb_fname, &name); - if (!NT_STATUS_IS_OK(status)) { - goto path_err; - } - - status = check_name(conn, name); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(3,("reply_checkpath: check_name of %s failed (%s)\n",name,nt_errstr(status))); - goto path_err; - } - if (!VALID_STAT(smb_fname->st) && (SMB_VFS_STAT(conn, name, &smb_fname->st) != 0)) { DEBUG(3,("reply_checkpath: stat of %s failed (%s)\n",name,strerror(errno))); @@ -1091,20 +1078,6 @@ void reply_getatr(struct smb_request *req) goto out; } - status = resolve_dfspath(ctx, conn, - req->flags2 & FLAGS2_DFS_PATHNAMES, - fname, - &fname); - if (!NT_STATUS_IS_OK(status)) { - if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) { - reply_botherror(req, NT_STATUS_PATH_NOT_COVERED, - ERRSRV, ERRbadpath); - goto out; - } - reply_nterror(req, status); - goto out; - } - /* dos smetimes asks for a stat of "" - it returns a "hidden directory" under WfWg - weird! */ if (*fname == '\0') { @@ -1115,19 +1088,18 @@ void reply_getatr(struct smb_request *req) size = 0; mtime = 0; } else { - status = unix_convert(ctx, conn, fname, &smb_fname, 0); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - status = get_full_smb_filename(ctx, smb_fname, &fname); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - status = check_name(conn, fname); + status = filename_convert(ctx, + conn, + req->flags2 & FLAGS2_DFS_PATHNAMES, + fname, + &smb_fname, + &fname); if (!NT_STATUS_IS_OK(status)) { - DEBUG(3,("reply_getatr: check_name of %s failed (%s)\n",fname,nt_errstr(status))); + if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) { + reply_botherror(req, NT_STATUS_PATH_NOT_COVERED, + ERRSRV, ERRbadpath); + goto out; + } reply_nterror(req, status); goto out; } @@ -1201,9 +1173,11 @@ void reply_setatr(struct smb_request *req) goto out; } - status = resolve_dfspath(ctx, conn, + status = filename_convert(ctx, + conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, + &smb_fname, &fname); if (!NT_STATUS_IS_OK(status)) { if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) { @@ -1215,24 +1189,6 @@ void reply_setatr(struct smb_request *req) goto out; } - status = unix_convert(ctx, conn, fname, &smb_fname, 0); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - - status = get_full_smb_filename(ctx, smb_fname, &fname); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - - status = check_name(conn, fname); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - if (fname[0] == '.' && fname[1] == '\0') { /* * Not sure here is the right place to catch this @@ -1769,10 +1725,11 @@ void reply_open(struct smb_request *req) goto out; } - status = resolve_dfspath(ctx, + status = filename_convert(ctx, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, + &smb_fname, &fname); if (!NT_STATUS_IS_OK(status)) { if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) { @@ -1785,12 +1742,6 @@ void reply_open(struct smb_request *req) goto out; } - status = unix_convert(ctx, conn, fname, &smb_fname, 0); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - if (!map_open_params_to_ntcreate( fname, deny_mode, OPENX_FILE_EXISTS_OPEN, &access_mask, &share_mode, &create_disposition, &create_options)) { @@ -1930,10 +1881,11 @@ void reply_open_and_X(struct smb_request *req) goto out; } - status = resolve_dfspath(ctx, + status = filename_convert(ctx, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, + &smb_fname, &fname); if (!NT_STATUS_IS_OK(status)) { if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) { @@ -1946,12 +1898,6 @@ void reply_open_and_X(struct smb_request *req) goto out; } - status = unix_convert(ctx, conn, fname, &smb_fname, 0); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - if (!map_open_params_to_ntcreate( fname, deny_mode, smb_ofun, &access_mask, &share_mode, &create_disposition, &create_options)) { @@ -2143,10 +2089,11 @@ void reply_mknew(struct smb_request *req) goto out; } - status = resolve_dfspath(ctx, + status = filename_convert(ctx, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, + &smb_fname, &fname); if (!NT_STATUS_IS_OK(status)) { if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) { @@ -2159,12 +2106,6 @@ void reply_mknew(struct smb_request *req) goto out; } - status = unix_convert(ctx, conn, fname, &smb_fname, 0); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - if (fattr & aVOLID) { DEBUG(0,("Attempt to create file (%s) with volid set - " "please report this\n", fname)); @@ -2281,9 +2222,10 @@ void reply_ctemp(struct smb_request *req) goto out; } - status = resolve_dfspath(ctx, conn, + status = filename_convert(ctx, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, + &smb_fname, &fname); if (!NT_STATUS_IS_OK(status)) { if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) { @@ -2295,18 +2237,6 @@ void reply_ctemp(struct smb_request *req) goto out; } - status = unix_convert(ctx, conn, fname, &smb_fname, 0); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - - status = check_name(conn, smb_fname->base_name); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - tmpfd = mkstemp(smb_fname->base_name); if (tmpfd == -1) { reply_unixerror(req, ERRDOS, ERRnoaccess); @@ -5263,9 +5193,10 @@ void reply_mkdir(struct smb_request *req) goto out; } - status = resolve_dfspath(ctx, conn, + status = filename_convert(ctx, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, directory, + &smb_dname, &directory); if (!NT_STATUS_IS_OK(status)) { if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) { @@ -5277,18 +5208,6 @@ void reply_mkdir(struct smb_request *req) goto out; } - status = unix_convert(ctx, conn, directory, &smb_dname, 0); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - - status = check_name(conn, smb_dname->base_name); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - status = create_directory(conn, req, smb_dname); DEBUG(5, ("create_directory returned %s\n", nt_errstr(status))); @@ -5535,9 +5454,10 @@ void reply_rmdir(struct smb_request *req) goto out; } - status = resolve_dfspath(ctx, conn, + status = filename_convert(ctx, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, directory, + &smb_dname, &directory); if (!NT_STATUS_IS_OK(status)) { if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) { @@ -5549,24 +5469,6 @@ void reply_rmdir(struct smb_request *req) goto out; } - status = unix_convert(ctx, conn, directory, &smb_dname, 0); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - - status = get_full_smb_filename(ctx, smb_dname, &directory); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - - status = check_name(conn, directory); - if (!NT_STATUS_IS_OK(status)) { - reply_nterror(req, status); - goto out; - } - dptr_closepath(directory, req->smbpid); status = rmdir_internals(ctx, conn, directory); if (!NT_STATUS_IS_OK(status)) { |