summaryrefslogtreecommitdiff
path: root/source3/smbd/filename.c
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2024-07-04 11:07:54 +0200
committerVolker Lendecke <vl@samba.org>2024-07-04 15:26:36 +0000
commit94f37866b5ba74f08509cac376c5d1ed84c9d3e3 (patch)
treeb2949dda148aaad87a56516bf04579d3a8312324 /source3/smbd/filename.c
parentb91e257f565797849d384cce8f8a200755f71700 (diff)
downloadsamba-94f37866b5ba74f08509cac376c5d1ed84c9d3e3.tar.gz
samba-94f37866b5ba74f08509cac376c5d1ed84c9d3e3.tar.bz2
samba-94f37866b5ba74f08509cac376c5d1ed84c9d3e3.zip
smbd: Use new symlink_target_path routine
Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org>
Diffstat (limited to 'source3/smbd/filename.c')
-rw-r--r--source3/smbd/filename.c80
1 files changed, 10 insertions, 70 deletions
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index ea47adca40c..e6bc60ae217 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -594,70 +594,6 @@ static NTSTATUS filename_convert_normalize_new(
return NT_STATUS_OK;
}
-static const char *previous_slash(const char *name_in, const char *slash)
-{
- const char *prev = NULL;
-
- SMB_ASSERT((name_in <= slash) && (slash[0] == '/'));
-
- prev = strchr_m(name_in, '/');
-
- if (prev == slash) {
- /* No previous slash */
- return NULL;
- }
-
- while (true) {
- const char *next = strchr_m(prev + 1, '/');
-
- if (next == slash) {
- return prev;
- }
- prev = next;
- }
-
- return NULL; /* unreachable */
-}
-
-static char *_symlink_target_path(TALLOC_CTX *mem_ctx,
- const char *name_in,
- const char *substitute,
- size_t unparsed)
-{
- size_t name_in_len = strlen(name_in);
- const char *p_unparsed = NULL;
- const char *parent = NULL;
- char *ret;
-
- SMB_ASSERT(unparsed <= name_in_len);
-
- p_unparsed = name_in + (name_in_len - unparsed);
-
- if (substitute[0] == '/') {
- ret = talloc_asprintf(mem_ctx, "%s%s", substitute, p_unparsed);
- return ret;
- }
-
- if (unparsed == 0) {
- parent = strrchr_m(name_in, '/');
- } else {
- parent = previous_slash(name_in, p_unparsed);
- }
-
- if (parent == NULL) {
- ret = talloc_asprintf(mem_ctx, "%s%s", substitute, p_unparsed);
- } else {
- ret = talloc_asprintf(mem_ctx,
- "%.*s/%s%s",
- (int)(parent - name_in),
- name_in,
- substitute,
- p_unparsed);
- }
-
- return ret;
-}
-
NTSTATUS safe_symlink_target_path(TALLOC_CTX *mem_ctx,
const char *connectpath,
const char *dir,
@@ -1138,6 +1074,7 @@ NTSTATUS filename_convert_dirfsp(
char *target = NULL;
char *safe_target = NULL;
size_t symlink_redirects = 0;
+ int ret;
next:
if (symlink_redirects > 40) {
@@ -1202,12 +1139,15 @@ next:
* resolve all symlinks locally.
*/
- target = _symlink_target_path(mem_ctx,
- name_in,
- lnk->substitute_name,
- lnk->unparsed_path_length);
- if (target == NULL) {
- return NT_STATUS_NO_MEMORY;
+ ret = symlink_target_path(mem_ctx,
+ name_in,
+ lnk->unparsed_path_length,
+ lnk->substitute_name,
+ lnk->substitute_name[0] != '/',
+ '/',
+ &target);
+ if (ret != 0) {
+ return map_nt_error_from_unix(ret);
}
status = safe_symlink_target_path(mem_ctx,