lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <h6a3m4kt5qucesxrjq2kdg63hph6zxjfpkodgykifq4ii7iyoa@gziflw3kfe7y>
Date: Tue, 10 Jun 2025 15:40:43 -0700
From: Josh Poimboeuf <jpoimboe@...nel.org>
To: Alexandre Chartre <alexandre.chartre@...cle.com>
Cc: linux-kernel@...r.kernel.org, mingo@...nel.org, peterz@...radead.org
Subject: Re: [RFC 05/13] objtool: Store instruction disassembly result

On Fri, Jun 06, 2025 at 05:34:32PM +0200, Alexandre Chartre wrote:
> +static int dbuffer_init(struct dbuffer *dbuf, size_t size)
> +{
> +	dbuf->used = 0;
> +	dbuf->size = size;
> +
> +	if (!size) {
> +		dbuf->addr = NULL;
> +		return 0;
> +	}
> +
> +	dbuf->addr = malloc(size);
> +	if (!dbuf->addr)
> +		return -1;
> +
> +	return 0;
> +}
> +
> +static void dbuffer_fini(struct dbuffer *dbuf)
> +{
> +	free(dbuf->addr);
> +	dbuf->size = 0;
> +	dbuf->used = 0;
> +}
> +
> +static void dbuffer_reset(struct dbuffer *dbuf)
> +{
> +	dbuf->used = 0;
> +}
> +
> +static char *dbuffer_data(struct dbuffer *dbuf)
> +{
> +	return dbuf->addr;
> +}
> +
> +static int dbuffer_expand(struct dbuffer *dbuf, size_t space)
> +{
> +	size_t size;
> +	char *addr;
> +
> +	size = dbuf->size + space;
> +	addr = realloc(dbuf->addr, size);
> +	if (!addr)
> +		return -1;
> +
> +	dbuf->addr = addr;
> +	dbuf->size = size;
> +
> +	return 0;
> +}
> +
> +static int dbuffer_vappendf_noexpand(struct dbuffer *dbuf, const char *fmt, va_list ap)
> +{
> +	int free, len;
> +
> +	free = dbuf->size - dbuf->used;
> +
> +	len = vsnprintf(dbuf->addr + dbuf->used, free, fmt, ap);
> +
> +	if (len < 0)
> +		return -1;
> +
> +	if (len < free) {
> +		dbuf->used += len;
> +		return 0;
> +	}
> +
> +	return (len - free) + 1;
> +}
> +
> +static int dbuffer_vappendf(struct dbuffer *dbuf, const char *fmt, va_list ap)
> +{
> +	int space_needed, err;
> +
> +	space_needed = dbuffer_vappendf_noexpand(dbuf, fmt, ap);
> +	if (space_needed <= 0)
> +		return space_needed;
> +
> +	/*
> +	 * The buffer is not large enough to store all data. Expand
> +	 * the buffer and retry. The buffer is expanded with enough
> +	 * space to store all data.
> +	 */
> +	err = dbuffer_expand(dbuf, space_needed * 2);
> +	if (err) {
> +		WARN("failed to expand buffer\n");
> +		return -1;
> +	}
> +
> +	return dbuffer_vappendf_noexpand(dbuf, fmt, ap);
> +}

I don't quite get the need for all this dbuffer stuff.

The buffer only needs to contain the output for a single instruction,
right?  Is there any reason not to just make it a 1k char array which
gets appended via strncat()?  If it exceeds that, it could just print a
warning and truncate the string.

-- 
Josh

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ