Unverified Commit 2d25b05d authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!10183 v3 ima: Fix use-after-free on a dentry's dname.name

parents b2140a04 a411c510
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -201,7 +201,7 @@ int ima_collect_measurement(struct integrity_iint_cache *iint,
{
	const char *audit_cause = "failed";
	struct inode *inode = file_inode(file);
	const char *filename = file->f_path.dentry->d_name.name;
	struct name_snapshot filename;
	int result = 0;
	int length;
	void *tmpbuf;
@@ -252,9 +252,13 @@ int ima_collect_measurement(struct integrity_iint_cache *iint,
		if (file->f_flags & O_DIRECT)
			audit_cause = "failed(directio)";

		take_dentry_name_snapshot(&filename, file->f_path.dentry);

		integrity_audit_msg(AUDIT_INTEGRITY_DATA, inode,
				    filename, "collect_data", audit_cause,
				    result, 0);
				    filename.name, "collect_data",
				    audit_cause, result, 0);

		release_dentry_name_snapshot(&filename);
	}
	return result;
}
@@ -356,6 +360,7 @@ void ima_audit_measurement(struct integrity_iint_cache *iint,
 */
const char *ima_d_path(const struct path *path, char **pathbuf, char *namebuf)
{
	struct name_snapshot filename;
	char *pathname = NULL;

	*pathbuf = __getname();
@@ -369,7 +374,10 @@ const char *ima_d_path(const struct path *path, char **pathbuf, char *namebuf)
	}

	if (!pathname) {
		strlcpy(namebuf, path->dentry->d_name.name, NAME_MAX);
		take_dentry_name_snapshot(&filename, path->dentry);
		strscpy(namebuf, filename.name, NAME_MAX);
		release_dentry_name_snapshot(&filename);

		pathname = namebuf;
	}

+14 −3
Original line number Diff line number Diff line
@@ -348,7 +348,10 @@ static int ima_eventname_init_common(struct ima_event_data *event_data,
				     bool size_limit)
{
	const char *cur_filename = NULL;
	struct name_snapshot filename;
	u32 cur_filename_len = 0;
	bool snapshot = false;
	int ret;

	BUG_ON(event_data->filename == NULL && event_data->file == NULL);

@@ -361,7 +364,10 @@ static int ima_eventname_init_common(struct ima_event_data *event_data,
	}

	if (event_data->file) {
		cur_filename = event_data->file->f_path.dentry->d_name.name;
		take_dentry_name_snapshot(&filename,
					  event_data->file->f_path.dentry);
		snapshot = true;
		cur_filename = filename.name;
		cur_filename_len = strlen(cur_filename);
	} else
		/*
@@ -370,8 +376,13 @@ static int ima_eventname_init_common(struct ima_event_data *event_data,
		 */
		cur_filename_len = IMA_EVENT_NAME_LEN_MAX;
out:
	return ima_write_template_field_data(cur_filename, cur_filename_len,
	ret = ima_write_template_field_data(cur_filename, cur_filename_len,
					    DATA_FMT_STRING, field_data);

	if (snapshot)
		release_dentry_name_snapshot(&filename);

	return ret;
}

/*