Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b2a0e89 authored by Jitendra Sharma's avatar Jitendra Sharma Committed by Gerrit - the friendly Code Review server
Browse files

soc: qcom: Reset string table index for each dump collection request



Section name should be placed in String table.
Currently, we used static version for string table
index to update subsequent section names.

Due to this string table index keeps on increasing
during every new dump(subsystem restart) request.
This ultimately will result in buffer overflow,
leading to Redzone overwritten.

Hence, as a fix, now reset, this string table
index once dump capture is complete.

Change-Id: Ibc2446ae4011db5291044eacdc1a1119597d862a
Signed-off-by: default avatarJitendra Sharma <shajit@codeaurora.org>
parent 5bd445d8
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2011-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -411,19 +411,19 @@ static inline char *elf_str_table(struct elfhdr *hdr)
}

static inline unsigned int set_section_name(const char *name,
					    struct elfhdr *ehdr)
					    struct elfhdr *ehdr,
					    int *strtable_idx)
{
	char *strtab = elf_str_table(ehdr);
	static int strtable_idx = 1;
	int idx, ret = 0;

	idx = strtable_idx;
	idx = *strtable_idx;
	if ((strtab == NULL) || (name == NULL))
		return 0;

	ret = idx;
	idx += strlcpy((strtab + idx), name, MAX_NAME_LENGTH);
	strtable_idx = idx + 1;
	*strtable_idx = idx + 1;

	return ret;
}
@@ -436,6 +436,7 @@ static int _do_minidump(void *handle, struct ramdump_segment *segments,
	struct elfhdr *ehdr;
	struct elf_shdr *shdr;
	unsigned long offset, strtbl_off;
	int strtable_idx = 1;

	if (!rd_dev->consumer_present) {
		pr_err("Ramdump(%s): No consumers. Aborting..\n", rd_dev->name);
@@ -475,13 +476,14 @@ static int _do_minidump(void *handle, struct ramdump_segment *segments,
	shdr->sh_size = MAX_STRTBL_SIZE;
	shdr->sh_entsize = 0;
	shdr->sh_flags = 0;
	shdr->sh_name = set_section_name("STR_TBL", ehdr);
	shdr->sh_name = set_section_name("STR_TBL", ehdr, &strtable_idx);
	shdr++;

	for (i = 0; i < nsegments; i++, shdr++) {
		/* Update elf header */
		shdr->sh_type = SHT_PROGBITS;
		shdr->sh_name = set_section_name(segments[i].name, ehdr);
		shdr->sh_name = set_section_name(segments[i].name, ehdr,
							&strtable_idx);
		shdr->sh_addr = (elf_addr_t)segments[i].address;
		shdr->sh_size = segments[i].size;
		shdr->sh_flags = SHF_WRITE;