Commit b5ee94ac authored by Philipp Kerling's avatar Philipp Kerling Committed by Steve French
Browse files

ksmbd: allow a filename to contain colons on SMB3.1.1 posix extensions

If the client sends SMB2_CREATE_POSIX_CONTEXT to ksmbd, allow the filename
to contain a colon (':'). This requires disabling the support for Alternate
Data Streams (ADS), which are denoted by a colon-separated suffix to the
filename on Windows. This should not be an issue, since this concept is not
known to POSIX anyway and the client has to explicitly request a POSIX
context to get this behavior.

Link: https://lore.kernel.org/all/f9401718e2be2ab22058b45a6817db912784ef61.camel@rx2.rx-server.de/


Signed-off-by: default avatarPhilipp Kerling <pkerling@casix.org>
Acked-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent b320789d
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -2951,6 +2951,8 @@ int smb2_open(struct ksmbd_work *work)
		}

		ksmbd_debug(SMB, "converted name = %s\n", name);

		if (posix_ctxt == false) {
			if (strchr(name, ':')) {
				if (!test_share_config_flag(work->tcon->share_conf,
							KSMBD_SHARE_FLAG_STREAMS)) {
@@ -2962,7 +2964,6 @@ int smb2_open(struct ksmbd_work *work)
					goto err_out2;
			}

		if (posix_ctxt == false) {
			rc = ksmbd_validate_filename(name);
			if (rc < 0)
				goto err_out2;
@@ -3443,6 +3444,8 @@ int smb2_open(struct ksmbd_work *work)
	fp->attrib_only = !(req->DesiredAccess & ~(FILE_READ_ATTRIBUTES_LE |
			FILE_WRITE_ATTRIBUTES_LE | FILE_SYNCHRONIZE_LE));

	fp->is_posix_ctxt = posix_ctxt;

	/* fp should be searchable through ksmbd_inode.m_fp_list
	 * after daccess, saccess, attrib_only, and stream are
	 * initialized.
@@ -5988,7 +5991,7 @@ static int smb2_rename(struct ksmbd_work *work,
	if (IS_ERR(new_name))
		return PTR_ERR(new_name);

	if (strchr(new_name, ':')) {
	if (fp->is_posix_ctxt == false && strchr(new_name, ':')) {
		int s_type;
		char *xattr_stream_name, *stream_name = NULL;
		size_t xattr_stream_size;
+2 −0
Original line number Diff line number Diff line
@@ -112,6 +112,8 @@ struct ksmbd_file {
	bool				is_durable;
	bool				is_persistent;
	bool				is_resilient;

	bool                            is_posix_ctxt;
};

static inline void set_ctx_actor(struct dir_context *ctx,