summaryrefslogtreecommitdiff
path: root/source3/smbd
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2004-04-06 23:01:09 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:51:08 -0500
commit1db9257c953c93c3f26596a535e4f26b609e7955 (patch)
tree6113771ac0ec30fd0cb67d243a07f5844a5c6145 /source3/smbd
parent9d458e45c8979bbfa081722b379abba9db922bba (diff)
downloadsamba-1db9257c953c93c3f26596a535e4f26b609e7955.tar.gz
samba-1db9257c953c93c3f26596a535e4f26b609e7955.tar.bz2
samba-1db9257c953c93c3f26596a535e4f26b609e7955.zip
r96: Stupid f&%'n UNIX extensions.... SETPATHINFO
normally takes as it's param entry the filename to be acted upon.... Unless it's UNIX extensions create hardlink, or UNIX extensions create symlink. Then it's param -> newfile name data -> oldfile name. This caused me to stuff them up in 3.0.2 (and the client commands link and symlink). Fixed them, everything is now called oldname and newname - thus specifying which name should already exist (hint - the old one...) and which will be created (newname). Jeremy. (This used to be commit 21cc6ab7e8a41160a3e2970623ade7445b5214d6)
Diffstat (limited to 'source3/smbd')
-rw-r--r--source3/smbd/nttrans.c14
-rw-r--r--source3/smbd/trans2.c61
2 files changed, 39 insertions, 36 deletions
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index c9cc44627d..6ba74d5d50 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -1500,7 +1500,7 @@ int reply_ntrename(connection_struct *conn,
char *inbuf,char *outbuf,int length,int bufsize)
{
int outsize = 0;
- pstring name;
+ pstring oldname;
pstring newname;
char *p;
NTSTATUS status;
@@ -1515,13 +1515,13 @@ int reply_ntrename(connection_struct *conn,
}
p = smb_buf(inbuf) + 1;
- p += srvstr_get_path(inbuf, name, p, sizeof(name), 0, STR_TERMINATE, &status);
+ p += srvstr_get_path(inbuf, oldname, p, sizeof(oldname), 0, STR_TERMINATE, &status);
if (!NT_STATUS_IS_OK(status)) {
END_PROFILE(SMBntrename);
return ERROR_NT(status);
}
- if( strchr_m(name, ':')) {
+ if( strchr_m(oldname, ':')) {
/* Can't rename a stream. */
END_PROFILE(SMBntrename);
return ERROR_NT(NT_STATUS_ACCESS_DENIED);
@@ -1534,15 +1534,15 @@ int reply_ntrename(connection_struct *conn,
return ERROR_NT(status);
}
- RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
+ RESOLVE_DFSPATH(oldname, conn, inbuf, outbuf);
RESOLVE_DFSPATH(newname, conn, inbuf, outbuf);
- DEBUG(3,("reply_ntrename : %s -> %s\n",name,newname));
+ DEBUG(3,("reply_ntrename : %s -> %s\n",oldname,newname));
if (rename_type == RENAME_FLAG_RENAME) {
- status = rename_internals(conn, name, newname, attrs, False);
+ status = rename_internals(conn, oldname, newname, attrs, False);
} else {
- status = hardlink_internals(conn, name, newname);
+ status = hardlink_internals(conn, oldname, newname);
}
if (!NT_STATUS_IS_OK(status)) {
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 1e7d845714..30d6845509 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -2825,32 +2825,32 @@ static int ensure_link_is_safe(connection_struct *conn, const char *link_dest_in
code.
****************************************************************************/
-NTSTATUS hardlink_internals(connection_struct *conn, char *name, char *newname)
+NTSTATUS hardlink_internals(connection_struct *conn, char *oldname, char *newname)
{
- BOOL bad_path_src = False;
- BOOL bad_path_dest = False;
+ BOOL bad_path_oldname = False;
+ BOOL bad_path_newname = False;
SMB_STRUCT_STAT sbuf1, sbuf2;
BOOL rc, rcdest;
- pstring last_component_src;
- pstring last_component_dest;
+ pstring last_component_oldname;
+ pstring last_component_newname;
NTSTATUS status = NT_STATUS_OK;
ZERO_STRUCT(sbuf1);
ZERO_STRUCT(sbuf2);
/* No wildcards. */
- if (ms_has_wild(name) || ms_has_wild(newname)) {
+ if (ms_has_wild(newname) || ms_has_wild(oldname)) {
return NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
}
- rc = unix_convert(name,conn,last_component_src,&bad_path_src,&sbuf1);
- if (!rc && bad_path_src) {
+ rc = unix_convert(oldname,conn,last_component_oldname,&bad_path_oldname,&sbuf1);
+ if (!rc && bad_path_oldname) {
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
}
/* Quick check for "." and ".." */
- if (last_component_src[0] == '.') {
- if (!last_component_src[1] || (last_component_src[1] == '.' && !last_component_src[2])) {
+ if (last_component_oldname[0] == '.') {
+ if (!last_component_oldname[1] || (last_component_oldname[1] == '.' && !last_component_oldname[2])) {
return NT_STATUS_OBJECT_NAME_INVALID;
}
}
@@ -2860,19 +2860,19 @@ NTSTATUS hardlink_internals(connection_struct *conn, char *name, char *newname)
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
- rcdest = unix_convert(newname,conn,last_component_dest,&bad_path_dest,&sbuf2);
- if (!rcdest && bad_path_dest) {
+ rcdest = unix_convert(newname,conn,last_component_newname,&bad_path_newname,&sbuf2);
+ if (!rcdest && bad_path_newname) {
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
}
/* Quick check for "." and ".." */
- if (last_component_dest[0] == '.') {
- if (!last_component_dest[1] || (last_component_dest[1] == '.' && !last_component_dest[2])) {
+ if (last_component_newname[0] == '.') {
+ if (!last_component_newname[1] || (last_component_newname[1] == '.' && !last_component_newname[2])) {
return NT_STATUS_OBJECT_NAME_INVALID;
}
}
- /* Disallow if already exists. */
+ /* Disallow if newname already exists. */
if (VALID_STAT(sbuf2)) {
return NT_STATUS_OBJECT_NAME_COLLISION;
}
@@ -2882,15 +2882,15 @@ NTSTATUS hardlink_internals(connection_struct *conn, char *name, char *newname)
return NT_STATUS_FILE_IS_A_DIRECTORY;
}
- if (ensure_link_is_safe(conn, newname, newname) != 0)
+ if (ensure_link_is_safe(conn, oldname, oldname) != 0)
return NT_STATUS_ACCESS_DENIED;
- DEBUG(10,("hardlink_internals: doing hard link %s -> %s\n", name, newname ));
+ DEBUG(10,("hardlink_internals: doing hard link %s -> %s\n", newname, oldname ));
- if (SMB_VFS_LINK(conn,name,newname) != 0) {
+ if (SMB_VFS_LINK(conn,oldname,newname) != 0) {
status = map_nt_error_from_unix(errno);
- DEBUG(3,("hardlink_internals: Error %s link %s -> %s\n",
- nt_errstr(status), name,newname));
+ DEBUG(3,("hardlink_internals: Error %s hard link %s -> %s\n",
+ nt_errstr(status), newname, oldname));
}
return status;
@@ -3380,25 +3380,27 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
case SMB_SET_FILE_UNIX_LINK:
{
- pstring link_dest;
+ pstring oldname;
+ char *newname = fname;
+
/* Set a symbolic link. */
/* Don't allow this if follow links is false. */
if (!lp_symlinks(SNUM(conn)))
return(ERROR_DOS(ERRDOS,ERRnoaccess));
- srvstr_get_path(inbuf, link_dest, pdata, sizeof(link_dest), -1, STR_TERMINATE, &status);
+ srvstr_get_path(inbuf, oldname, pdata, sizeof(oldname), -1, STR_TERMINATE, &status);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}
- if (ensure_link_is_safe(conn, link_dest, link_dest) != 0)
+ if (ensure_link_is_safe(conn, oldname, oldname) != 0)
return(UNIXERROR(ERRDOS,ERRnoaccess));
DEBUG(10,("call_trans2setfilepathinfo: SMB_SET_FILE_UNIX_LINK doing symlink %s -> %s\n",
- fname, link_dest ));
+ fname, oldname ));
- if (SMB_VFS_SYMLINK(conn,link_dest,fname) != 0)
+ if (SMB_VFS_SYMLINK(conn,oldname,newname) != 0)
return(UNIXERROR(ERRDOS,ERRnoaccess));
SSVAL(params,0,0);
send_trans2_replies(outbuf, bufsize, params, 2, *ppdata, 0);
@@ -3407,18 +3409,19 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
case SMB_SET_FILE_UNIX_HLINK:
{
- pstring link_dest;
+ pstring oldname;
+ char *newname = fname;
/* Set a hard link. */
- srvstr_get_path(inbuf, link_dest, pdata, sizeof(link_dest), -1, STR_TERMINATE, &status);
+ srvstr_get_path(inbuf, oldname, pdata, sizeof(oldname), -1, STR_TERMINATE, &status);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}
DEBUG(10,("call_trans2setfilepathinfo: SMB_SET_FILE_UNIX_LINK doing hard link %s -> %s\n",
- fname, link_dest ));
+ fname, oldname));
- status = hardlink_internals(conn, fname, link_dest);
+ status = hardlink_internals(conn, oldname, newname);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}