Skip to content

Commit 6b4aa46

Browse files
committed
Merge tag '6.11-rc3-ksmbd-fixes' of git://git.samba.org/ksmbd
Pull smb server fixes from Steve French: "Two smb3 server fixes for access denied problem on share path checks" * tag '6.11-rc3-ksmbd-fixes' of git://git.samba.org/ksmbd: ksmbd: override fsids for smb2_query_info() ksmbd: override fsids for share path check
2 parents d74da84 + f6bd412 commit 6b4aa46

File tree

7 files changed

+39
-13
lines changed

7 files changed

+39
-13
lines changed

fs/smb/server/mgmt/share_config.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "share_config.h"
1616
#include "user_config.h"
1717
#include "user_session.h"
18+
#include "../connection.h"
1819
#include "../transport_ipc.h"
1920
#include "../misc.h"
2021

@@ -120,12 +121,13 @@ static int parse_veto_list(struct ksmbd_share_config *share,
120121
return 0;
121122
}
122123

123-
static struct ksmbd_share_config *share_config_request(struct unicode_map *um,
124+
static struct ksmbd_share_config *share_config_request(struct ksmbd_work *work,
124125
const char *name)
125126
{
126127
struct ksmbd_share_config_response *resp;
127128
struct ksmbd_share_config *share = NULL;
128129
struct ksmbd_share_config *lookup;
130+
struct unicode_map *um = work->conn->um;
129131
int ret;
130132

131133
resp = ksmbd_ipc_share_config_request(name);
@@ -181,7 +183,14 @@ static struct ksmbd_share_config *share_config_request(struct unicode_map *um,
181183
KSMBD_SHARE_CONFIG_VETO_LIST(resp),
182184
resp->veto_list_sz);
183185
if (!ret && share->path) {
186+
if (__ksmbd_override_fsids(work, share)) {
187+
kill_share(share);
188+
share = NULL;
189+
goto out;
190+
}
191+
184192
ret = kern_path(share->path, 0, &share->vfs_path);
193+
ksmbd_revert_fsids(work);
185194
if (ret) {
186195
ksmbd_debug(SMB, "failed to access '%s'\n",
187196
share->path);
@@ -214,7 +223,7 @@ static struct ksmbd_share_config *share_config_request(struct unicode_map *um,
214223
return share;
215224
}
216225

217-
struct ksmbd_share_config *ksmbd_share_config_get(struct unicode_map *um,
226+
struct ksmbd_share_config *ksmbd_share_config_get(struct ksmbd_work *work,
218227
const char *name)
219228
{
220229
struct ksmbd_share_config *share;
@@ -227,7 +236,7 @@ struct ksmbd_share_config *ksmbd_share_config_get(struct unicode_map *um,
227236

228237
if (share)
229238
return share;
230-
return share_config_request(um, name);
239+
return share_config_request(work, name);
231240
}
232241

233242
bool ksmbd_share_veto_filename(struct ksmbd_share_config *share,

fs/smb/server/mgmt/share_config.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include <linux/path.h>
1212
#include <linux/unicode.h>
1313

14+
struct ksmbd_work;
15+
1416
struct ksmbd_share_config {
1517
char *name;
1618
char *path;
@@ -68,7 +70,7 @@ static inline void ksmbd_share_config_put(struct ksmbd_share_config *share)
6870
__ksmbd_share_config_put(share);
6971
}
7072

71-
struct ksmbd_share_config *ksmbd_share_config_get(struct unicode_map *um,
73+
struct ksmbd_share_config *ksmbd_share_config_get(struct ksmbd_work *work,
7274
const char *name);
7375
bool ksmbd_share_veto_filename(struct ksmbd_share_config *share,
7476
const char *filename);

fs/smb/server/mgmt/tree_connect.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@
1616
#include "user_session.h"
1717

1818
struct ksmbd_tree_conn_status
19-
ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct ksmbd_session *sess,
20-
const char *share_name)
19+
ksmbd_tree_conn_connect(struct ksmbd_work *work, const char *share_name)
2120
{
2221
struct ksmbd_tree_conn_status status = {-ENOENT, NULL};
2322
struct ksmbd_tree_connect_response *resp = NULL;
2423
struct ksmbd_share_config *sc;
2524
struct ksmbd_tree_connect *tree_conn = NULL;
2625
struct sockaddr *peer_addr;
26+
struct ksmbd_conn *conn = work->conn;
27+
struct ksmbd_session *sess = work->sess;
2728
int ret;
2829

29-
sc = ksmbd_share_config_get(conn->um, share_name);
30+
sc = ksmbd_share_config_get(work, share_name);
3031
if (!sc)
3132
return status;
3233

@@ -61,7 +62,7 @@ ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct ksmbd_session *sess,
6162
struct ksmbd_share_config *new_sc;
6263

6364
ksmbd_share_config_del(sc);
64-
new_sc = ksmbd_share_config_get(conn->um, share_name);
65+
new_sc = ksmbd_share_config_get(work, share_name);
6566
if (!new_sc) {
6667
pr_err("Failed to update stale share config\n");
6768
status.ret = -ESTALE;

fs/smb/server/mgmt/tree_connect.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
struct ksmbd_share_config;
1414
struct ksmbd_user;
1515
struct ksmbd_conn;
16+
struct ksmbd_work;
1617

1718
enum {
1819
TREE_NEW = 0,
@@ -50,8 +51,7 @@ static inline int test_tree_conn_flag(struct ksmbd_tree_connect *tree_conn,
5051
struct ksmbd_session;
5152

5253
struct ksmbd_tree_conn_status
53-
ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct ksmbd_session *sess,
54-
const char *share_name);
54+
ksmbd_tree_conn_connect(struct ksmbd_work *work, const char *share_name);
5555
void ksmbd_tree_connect_put(struct ksmbd_tree_connect *tcon);
5656

5757
int ksmbd_tree_conn_disconnect(struct ksmbd_session *sess,

fs/smb/server/smb2pdu.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1955,7 +1955,7 @@ int smb2_tree_connect(struct ksmbd_work *work)
19551955
ksmbd_debug(SMB, "tree connect request for tree %s treename %s\n",
19561956
name, treename);
19571957

1958-
status = ksmbd_tree_conn_connect(conn, sess, name);
1958+
status = ksmbd_tree_conn_connect(work, name);
19591959
if (status.ret == KSMBD_TREE_CONN_STATUS_OK)
19601960
rsp->hdr.Id.SyncId.TreeId = cpu_to_le32(status.tree_conn->id);
19611961
else
@@ -5596,6 +5596,11 @@ int smb2_query_info(struct ksmbd_work *work)
55965596

55975597
ksmbd_debug(SMB, "GOT query info request\n");
55985598

5599+
if (ksmbd_override_fsids(work)) {
5600+
rc = -ENOMEM;
5601+
goto err_out;
5602+
}
5603+
55995604
switch (req->InfoType) {
56005605
case SMB2_O_INFO_FILE:
56015606
ksmbd_debug(SMB, "GOT SMB2_O_INFO_FILE\n");
@@ -5614,6 +5619,7 @@ int smb2_query_info(struct ksmbd_work *work)
56145619
req->InfoType);
56155620
rc = -EOPNOTSUPP;
56165621
}
5622+
ksmbd_revert_fsids(work);
56175623

56185624
if (!rc) {
56195625
rsp->StructureSize = cpu_to_le16(9);
@@ -5623,6 +5629,7 @@ int smb2_query_info(struct ksmbd_work *work)
56235629
le32_to_cpu(rsp->OutputBufferLength));
56245630
}
56255631

5632+
err_out:
56265633
if (rc < 0) {
56275634
if (rc == -EACCES)
56285635
rsp->hdr.Status = STATUS_ACCESS_DENIED;

fs/smb/server/smb_common.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -732,10 +732,10 @@ bool is_asterisk(char *p)
732732
return p && p[0] == '*';
733733
}
734734

735-
int ksmbd_override_fsids(struct ksmbd_work *work)
735+
int __ksmbd_override_fsids(struct ksmbd_work *work,
736+
struct ksmbd_share_config *share)
736737
{
737738
struct ksmbd_session *sess = work->sess;
738-
struct ksmbd_share_config *share = work->tcon->share_conf;
739739
struct cred *cred;
740740
struct group_info *gi;
741741
unsigned int uid;
@@ -775,6 +775,11 @@ int ksmbd_override_fsids(struct ksmbd_work *work)
775775
return 0;
776776
}
777777

778+
int ksmbd_override_fsids(struct ksmbd_work *work)
779+
{
780+
return __ksmbd_override_fsids(work, work->tcon->share_conf);
781+
}
782+
778783
void ksmbd_revert_fsids(struct ksmbd_work *work)
779784
{
780785
const struct cred *cred;

fs/smb/server/smb_common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,8 @@ int ksmbd_extract_shortname(struct ksmbd_conn *conn,
447447
int ksmbd_smb_negotiate_common(struct ksmbd_work *work, unsigned int command);
448448

449449
int ksmbd_smb_check_shared_mode(struct file *filp, struct ksmbd_file *curr_fp);
450+
int __ksmbd_override_fsids(struct ksmbd_work *work,
451+
struct ksmbd_share_config *share);
450452
int ksmbd_override_fsids(struct ksmbd_work *work);
451453
void ksmbd_revert_fsids(struct ksmbd_work *work);
452454

0 commit comments

Comments
 (0)