From: "Atte Heikkilä" <atteh.mailbox@gmail.com>
To: linux-cifs@vger.kernel.org
Cc: "Atte Heikkilä" <atteh.mailbox@gmail.com>
Subject: [PATCH v2 2/2] ksmbd-tools: casefold utf-8 share names
Date: Mon, 12 Sep 2022 00:55:42 +0300 [thread overview]
Message-ID: <20220911215542.104935-2-atteh.mailbox@gmail.com> (raw)
In-Reply-To: <20220911215542.104935-1-atteh.mailbox@gmail.com>
Match kernel space behavior regarding case-insensitivity of UTF-8 share
names by first NFD(I) normalizing and then casefolding them. Fallback
to ASCII lowercase conversion on failure.
Signed-off-by: Atte Heikkilä <atteh.mailbox@gmail.com>
---
addshare/addshare.c | 6 +++---
include/management/share.h | 1 +
lib/config_parser.c | 2 +-
lib/management/share.c | 19 +++++++++++++++++++
mountd/rpc_srvsvc.c | 2 +-
5 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/addshare/addshare.c b/addshare/addshare.c
index f5894c9..be4c67d 100644
--- a/addshare/addshare.c
+++ b/addshare/addshare.c
@@ -123,17 +123,17 @@ int main(int argc, char *argv[])
switch (c) {
case 'a':
g_free(share);
- share = g_ascii_strdown(optarg, strlen(optarg));
+ share = shm_casefold_share_name(optarg, strlen(optarg));
command = command_add_share;
break;
case 'd':
g_free(share);
- share = g_ascii_strdown(optarg, strlen(optarg));
+ share = shm_casefold_share_name(optarg, strlen(optarg));
command = command_del_share;
break;
case 'u':
g_free(share);
- share = g_ascii_strdown(optarg, strlen(optarg));
+ share = shm_casefold_share_name(optarg, strlen(optarg));
command = command_update_share;
break;
case 'o':
diff --git a/include/management/share.h b/include/management/share.h
index 306cca5..bb3952c 100644
--- a/include/management/share.h
+++ b/include/management/share.h
@@ -141,6 +141,7 @@ static inline int test_share_flag(struct ksmbd_share *share, int flag)
struct ksmbd_share *get_ksmbd_share(struct ksmbd_share *share);
void put_ksmbd_share(struct ksmbd_share *share);
+char *shm_casefold_share_name(char *name, size_t len);
struct ksmbd_share *shm_lookup_share(char *name);
struct smbconf_group;
diff --git a/lib/config_parser.c b/lib/config_parser.c
index 2dbc0c7..a1dc85c 100644
--- a/lib/config_parser.c
+++ b/lib/config_parser.c
@@ -93,7 +93,7 @@ static int add_new_group(char *line)
while (*end && *end != ']')
end = g_utf8_find_next_char(end, NULL);
- name = g_ascii_strdown(begin + 1, end - begin - 1);
+ name = shm_casefold_share_name(begin + 1, end - begin - 1);
if (!name)
goto out_free;
diff --git a/lib/management/share.c b/lib/management/share.c
index 22e6a83..fc09ea8 100644
--- a/lib/management/share.c
+++ b/lib/management/share.c
@@ -236,6 +236,25 @@ int shm_init(void)
return 0;
}
+char *shm_casefold_share_name(char *name, size_t len)
+{
+ char *nfdi_name, *nfdicf_name;
+
+ nfdi_name = g_utf8_normalize(name, len, G_NORMALIZE_NFD);
+ if (!nfdi_name)
+ goto out_ascii;
+
+ nfdicf_name = g_utf8_casefold(nfdi_name, strlen(nfdi_name));
+ if (!nfdicf_name)
+ goto out_ascii;
+
+ g_free(nfdi_name);
+ return nfdicf_name;
+out_ascii:
+ g_free(nfdi_name);
+ return g_ascii_strdown(name, len);
+}
+
static struct ksmbd_share *__shm_lookup_share(char *name)
{
return g_hash_table_lookup(shares_table, name);
diff --git a/mountd/rpc_srvsvc.c b/mountd/rpc_srvsvc.c
index 38b984b..8716c34 100644
--- a/mountd/rpc_srvsvc.c
+++ b/mountd/rpc_srvsvc.c
@@ -171,7 +171,7 @@ static int srvsvc_share_get_info_invoke(struct ksmbd_rpc_pipe *pipe,
int ret;
gchar *share_name;
- share_name = g_ascii_strdown(STR_VAL(hdr->share_name),
+ share_name = shm_casefold_share_name(STR_VAL(hdr->share_name),
strlen(STR_VAL(hdr->share_name)));
share = shm_lookup_share(share_name);
if (!share)
--
2.37.3
next prev parent reply other threads:[~2022-09-11 21:56 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-11 21:55 [PATCH v2 1/2] ksmbd: casefold utf-8 share names and fix ascii lowercase conversion Atte Heikkilä
2022-09-11 21:55 ` Atte Heikkilä [this message]
2022-09-15 13:31 ` Namjae Jeon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220911215542.104935-2-atteh.mailbox@gmail.com \
--to=atteh.mailbox@gmail.com \
--cc=linux-cifs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox