From 8d5f2979058ea97229f76842de6c98e39f5c9109 Mon Sep 17 00:00:00 2001
From: Rosen Penev <rosenp@gmail.com>
Date: Wed, 5 Oct 2022 13:29:07 -0700
Subject: [PATCH] ksmbd-tools: some g_autofree conversions

g_autofree allows to remove various free calls and simplify the code.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
---
 addshare/share_admin.c   | 24 ++++++++----------------
 adduser/user_admin.c     | 21 ++++++++-------------
 mountd/mountd.c          | 28 +++++++++-------------------
 mountd/rpc.c             |  9 +++------
 mountd/rpc_samr.c        |  4 ++--
 mountd/smbacl.c          |  4 +---
 lib/management/share.c   | 32 ++++++++------------------------
 7 files changed, 39 insertions(+), 83 deletions(-)

diff --git a/addshare/share_admin.c b/addshare/share_admin.c
index b7acdf22d261..67147431174c 100644
--- a/addshare/share_admin.c
+++ b/addshare/share_admin.c
@@ -138,7 +138,7 @@ static void update_share_cb(gpointer key,
 
 int command_add_share(char *smbconf, char *name, char *opts)
 {
-	char *new_name = NULL;
+	g_autofree char *new_name = NULL;
 
 	if (g_hash_table_lookup(parser.groups, name)) {
 		pr_err("Share `%s' already exists\n", name);
@@ -147,44 +147,40 @@ int command_add_share(char *smbconf, char *name, char *opts)
 
 	new_name = new_group_name(name);
 	if (cp_parse_external_smbconf_group(new_name, opts))
-		goto error;
+		return -EINVAL;
 
 	if (__open_smbconf(smbconf))
-		goto error;
+		return -EINVAL;
 
 	pr_info("Adding share `%s'\n", name);
 	g_hash_table_foreach(parser.groups, write_share_cb, NULL);
 	close(conf_fd);
-	g_free(new_name);
 	return 0;
 
-error:
-	g_free(new_name);
-	return -EINVAL;
 }
 
 int command_update_share(char *smbconf, char *name, char *opts)
 {
 	struct smbconf_group *existing_group;
 	struct smbconf_group *update_group;
-	char *aux_name = NULL;
+	g_autofree char *aux_name = NULL;
 
 	existing_group = g_hash_table_lookup(parser.groups, name);
 	if (!existing_group) {
 		pr_err("Share `%s' does not exist\n", name);
-		goto error;
+		return -EINVAL;
 	}
 
 	aux_name = aux_group_name(name);
 	if (cp_parse_external_smbconf_group(aux_name, opts))
-		goto error;
+		return -EINVAL;
 
 	/* get rid of [] */
 	sprintf(aux_name, "%s%s", AUX_GROUP_PREFIX, name);
 	update_group = g_hash_table_lookup(parser.groups, aux_name);
 	if (!update_group) {
 		pr_err("External group `%s' does not exist\n", aux_name);
-		goto error;
+		return -EINVAL;
 	}
 
 	g_free(existing_group->name);
@@ -195,16 +191,12 @@ int command_update_share(char *smbconf, char *name, char *opts)
 			     existing_group->kv);
 
 	if (__open_smbconf(smbconf))
-		goto error;
+		return -EINVAL;
 
 	pr_info("Updating share `%s'\n", name);
 	g_hash_table_foreach(parser.groups, write_share_cb, NULL);
 	close(conf_fd);
-	g_free(aux_name);
 	return 0;
-error:
-	g_free(aux_name);
-	return -EINVAL;
 }
 
 int command_del_share(char *smbconf, char *name, char *unused)
diff --git a/adduser/user_admin.c b/adduser/user_admin.c
index 826d755cdcee..12c433970ad1 100644
--- a/adduser/user_admin.c
+++ b/adduser/user_admin.c
@@ -162,7 +162,8 @@ static char *prompt_password(char *pswd_raw_opt, size_t *sz_raw)
 static char *get_utf16le_password(char *pswd_raw_opt, long *len)
 {
 	size_t sz_raw;
-	char *pswd_raw, *pswd_utf16le;
+	g_autofree char *pswd_raw = NULL;
+	char *pswd_utf16le;
 	gsize bytes_read = 0;
 	gsize bytes_written = 0;
 
@@ -176,20 +177,17 @@ static char *get_utf16le_password(char *pswd_raw_opt, long *len)
 				      KSMBD_CHARSET_DEFAULT,
 				      &bytes_read,
 				      &bytes_written);
-	if (!pswd_utf16le) {
-		g_free(pswd_raw);
+	if (!pswd_utf16le)
 		return NULL;
-	}
 
 	*len = bytes_written;
-	g_free(pswd_raw);
 	return pswd_utf16le;
 }
 
 static void __sanity_check(char *pswd_hash, char *pswd_b64)
 {
 	size_t pass_sz;
-	char *pass = base64_decode(pswd_b64, &pass_sz);
+	g_autofree char *pass = base64_decode(pswd_b64, &pass_sz);
 
 	if (!pass) {
 		pr_err("Unable to decode NT hash\n");
@@ -200,14 +198,15 @@ static void __sanity_check(char *pswd_hash, char *pswd_b64)
 		pr_err("NT hash encoding error\n");
 		exit(EXIT_FAILURE);
 	}
-	g_free(pass);
 }
 
 static char *get_base64_password(char *pswd_raw_opt)
 {
 	struct md4_ctx mctx;
 	long len;
-	char *pswd_utf16le, *pswd_hash, *pswd_b64;
+	g_autofree char *pswd_utf16le = NULL;
+	g_autofree char *pswd_hash = NULL;
+	char *pswd_b64;
 
 	pswd_utf16le = get_utf16le_password(pswd_raw_opt, &len);
 	if (!pswd_utf16le)
@@ -215,7 +214,6 @@ static char *get_base64_password(char *pswd_raw_opt)
 
 	pswd_hash = g_try_malloc0(sizeof(mctx.hash) + 1);
 	if (!pswd_hash) {
-		g_free(pswd_utf16le);
 		pr_err("Out of memory\n");
 		return NULL;
 	}
@@ -228,8 +226,6 @@ static char *get_base64_password(char *pswd_raw_opt)
 				 MD4_HASH_WORDS * sizeof(unsigned int));
 
 	__sanity_check(pswd_hash, pswd_b64);
-	g_free(pswd_utf16le);
-	g_free(pswd_hash);
 	return pswd_b64;
 }
 
@@ -361,7 +357,7 @@ int command_add_user(char *pwddb, char *account, char *password)
 int command_update_user(char *pwddb, char *account, char *password)
 {
 	struct ksmbd_user *user;
-	char *pswd;
+	g_autofree char *pswd = NULL;
 
 	user = usm_lookup_user(account);
 	if (!user) {
@@ -383,7 +379,6 @@ int command_update_user(char *pwddb, char *account, char *password)
 	}
 
 	put_ksmbd_user(user);
-	g_free(pswd);
 
 	if (__opendb_file(pwddb))
 		return -EINVAL;
diff --git a/mountd/mountd.c b/mountd/mountd.c
index 64c7f2e3a129..667a19806047 100644
--- a/mountd/mountd.c
+++ b/mountd/mountd.c
@@ -135,8 +135,8 @@ out:
  */
 static int write_file_safe(char *path, char *buff, size_t length, int mode)
 {
-	int fd, ret = -EINVAL;
-	char *path_tmp = g_strdup_printf("%s.tmp", path);
+	int fd;
+	g_autofree char *path_tmp = g_strdup_printf("%s.tmp", path);
 
 	if (g_file_test(path_tmp, G_FILE_TEST_EXISTS))
 		unlink(path_tmp);
@@ -144,13 +144,13 @@ static int write_file_safe(char *path, char *buff, size_t length, int mode)
 	fd = open(path_tmp, O_CREAT | O_EXCL | O_WRONLY, mode);
 	if (fd < 0) {
 		pr_err("Can't create `%s': %m\n", path_tmp);
-		goto err_out;
+		return -EINVAL;
 	}
 
 	if (write(fd, buff, length) == -1) {
 		pr_err("Can't write `%s': %m\n", path_tmp);
 		close(fd);
-		goto err_out;
+		return -EINVAL;
 	}
 
 	fsync(fd);
@@ -158,31 +158,21 @@ static int write_file_safe(char *path, char *buff, size_t length, int mode)
 
 	if (rename(path_tmp, path) == -1) {
 		pr_err("Can't rename `%s' to `%s': %m\n", path_tmp, path);
-		goto err_out;
+		return -EINVAL;
 	}
-	ret = 0;
 
-err_out:
-	g_free(path_tmp);
-	return ret;
+	return 0;
 }
 
 static int create_subauth_file(void)
 {
-	char *subauth_buf;
-	GRand *rnd;
-	int ret;
-
-	rnd = g_rand_new();
-	subauth_buf = g_strdup_printf("%d:%d:%d\n", g_rand_int_range(rnd, 0, INT_MAX),
+	GRand *rnd = g_rand_new();
+	g_autofree char *subauth_buf = g_strdup_printf("%d:%d:%d\n", g_rand_int_range(rnd, 0, INT_MAX),
 		g_rand_int_range(rnd, 0, INT_MAX),
 		g_rand_int_range(rnd, 0, INT_MAX));
 
-	ret = write_file_safe(PATH_SUBAUTH, subauth_buf, strlen(subauth_buf),
+	return write_file_safe(PATH_SUBAUTH, subauth_buf, strlen(subauth_buf),
 		S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
-	g_free(subauth_buf);
-
-	return ret;
 }
 
 static int generate_sub_auth(void)
diff --git a/mountd/rpc.c b/mountd/rpc.c
index bb21448d84b3..0a6f7654766c 100644
--- a/mountd/rpc.c
+++ b/mountd/rpc.c
@@ -422,7 +422,7 @@ static gchar *ndr_convert_char_to_unicode(struct ksmbd_dcerpc *dce, char *str,
 
 int ndr_write_vstring(struct ksmbd_dcerpc *dce, void *value)
 {
-	gchar *out;
+	g_autofree char *out = NULL;
 	gsize bytes_written = 0;
 
 	size_t raw_len, str_len;
@@ -456,13 +456,12 @@ int ndr_write_vstring(struct ksmbd_dcerpc *dce, void *value)
 	ret |= ndr_write_bytes(dce, out, bytes_written);
 	auto_align_offset(dce);
 
-	g_free(out);
 	return ret;
 }
 
 int ndr_write_string(struct ksmbd_dcerpc *dce, char *str)
 {
-	gchar *out;
+	g_autofree char *out = NULL;
 	gsize bytes_written = 0;
 
 	size_t len;
@@ -482,13 +481,12 @@ int ndr_write_string(struct ksmbd_dcerpc *dce, char *str)
 	ret |= ndr_write_bytes(dce, out, bytes_written);
 	auto_align_offset(dce);
 
-	g_free(out);
 	return ret;
 }
 
 int ndr_write_lsa_string(struct ksmbd_dcerpc *dce, char *str)
 {
-	gchar *out;
+	g_autofree char *out = NULL;
 	gsize bytes_written = 0;
 
 	size_t len;
@@ -508,7 +506,6 @@ int ndr_write_lsa_string(struct ksmbd_dcerpc *dce, char *str)
 	ret |= ndr_write_bytes(dce, out, bytes_written);
 	auto_align_offset(dce);
 
-	g_free(out);
 	return ret;
 }
 
diff --git a/mountd/rpc_samr.c b/mountd/rpc_samr.c
index 42c57f227aa3..2191359389da 100644
--- a/mountd/rpc_samr.c
+++ b/mountd/rpc_samr.c
@@ -366,7 +366,8 @@ static int samr_query_user_info_return(struct ksmbd_rpc_pipe *pipe)
 {
 	struct ksmbd_dcerpc *dce = pipe->dce;
 	struct connect_handle *ch;
-	char *home_dir, *profile_path;
+	char *home_dir;
+	g_autofree char *profile_path = NULL;
 	char hostname[NAME_MAX];
 	int home_dir_len, i;
 
@@ -509,7 +510,6 @@ static int samr_query_user_info_return(struct ksmbd_rpc_pipe *pipe)
 		ndr_write_int8(dce, 0xff);
 
 	g_free(home_dir);
-	g_free(profile_path);
 	return KSMBD_RPC_OK;
 }
 
diff --git a/mountd/smbacl.c b/mountd/smbacl.c
index 80f9344ec867..8cdd55dcbe5c 100644
--- a/mountd/smbacl.c
+++ b/mountd/smbacl.c
@@ -151,7 +151,7 @@ int set_domain_name(struct smb_sid *sid, char *domain, int *type)
 {
 	int ret = 0;
 	char domain_string[NAME_MAX] = {0};
-	gchar *domain_name;
+	g_autofree char *domain_name = NULL;
 
 	if (!smb_compare_sids(sid, &sid_domain) &&
 	    !memcmp(&sid->sub_auth[1], global_conf.gen_subauth,
@@ -162,7 +162,6 @@ int set_domain_name(struct smb_sid *sid, char *domain, int *type)
 		if (!domain_name)
 			return -ENOMEM;
 		strcpy(domain, domain_name);
-		g_free(domain_name);
 		*type = SID_TYPE_USER;
 	} else if (!smb_compare_sids(sid, &sid_unix_users)) {
 		strcpy(domain, "Unix User");
@@ -177,7 +176,6 @@ int set_domain_name(struct smb_sid *sid, char *domain, int *type)
 		if (!domain_name)
 			return -ENOMEM;
 		strcpy(domain, domain_name);
-		g_free(domain_name);
 		*type = SID_TYPE_UNKNOWN;
 		ret = -ENOENT;
 	}
diff --git a/lib/management/share.c b/lib/management/share.c
index 02a60ec7c2ca..5c8209d5e710 100644
--- a/lib/management/share.c
+++ b/lib/management/share.c
@@ -229,42 +229,26 @@ void shm_destroy(void)
 
 static char *shm_casefold_share_name(const char *name, size_t len)
 {
-	char *nfdi_name, *nfdicf_name;
+	g_autofree char *nfdi_name = NULL;
 
 	nfdi_name = g_utf8_normalize(name, len, G_NORMALIZE_NFD);
 	if (!nfdi_name)
-		goto out_ascii;
+		return g_ascii_strdown(name, len);
 
-	nfdicf_name = g_utf8_casefold(nfdi_name, strlen(nfdi_name));
-	g_free(nfdi_name);
-	return nfdicf_name;
-out_ascii:
-	g_free(nfdi_name);
-	return g_ascii_strdown(name, len);
+	return g_utf8_casefold(nfdi_name, strlen(nfdi_name));
 }
 
 guint shm_share_name_hash(gconstpointer name)
 {
-	char *cf_name;
-	guint hash;
-
-	cf_name = shm_casefold_share_name(name, strlen(name));
-	hash = g_str_hash(cf_name);
-	g_free(cf_name);
-	return hash;
+	g_autofree char *cf_name = shm_casefold_share_name(name, strlen(name));
+	return g_str_hash(cf_name);
 }
 
 gboolean shm_share_name_equal(gconstpointer lname, gconstpointer rname)
 {
-	char *cf_lname, *cf_rname;
-	gboolean equal;
-
-	cf_lname = shm_casefold_share_name(lname, strlen(lname));
-	cf_rname = shm_casefold_share_name(rname, strlen(rname));
-	equal = g_str_equal(cf_lname, cf_rname);
-	g_free(cf_lname);
-	g_free(cf_rname);
-	return equal;
+	g_autofree char *cf_lname = shm_casefold_share_name(lname, strlen(lname));
+	g_autofree char *cf_rname = shm_casefold_share_name(rname, strlen(rname));
+	return g_str_equal(cf_lname, cf_rname);
 }
 
 int shm_init(void)
-- 
2.25.1

