Thread (16 messages) 16 messages, 5 authors, 2020-04-22

Re: [PATCH 5/5] sysctl: pass kernel pointers to ->proc_handler

From: Christoph Hellwig <hch@lst.de>
Date: 2020-04-22 06:09:31
Also in: bpf, linux-fsdevel, linux-mm, lkml

On Wed, Apr 22, 2020 at 03:46:26AM +0100, Al Viro wrote:
quoted
Better allocate count + 1 bytes here, that way a lot of insanity in the
instances can be simply converted to snprintf().  Yes, I know it'll bring
the Church Of Avoiding The Abomination Of Sprintf out of the woodwork,
but...
FWIW, consider e.g. net/sunrpc/sysctl.c:

Nevermind that the read side should be simply
		int err = proc_douintvec(table, write, buffer, lenp, ppos);
		/* Display the RPC tasks on writing to rpc_debug */
		if (!err && strcmp(table->procname, "rpc_debug") == 0)
			rpc_show_tasks(&init_net);
		return err;
the write side would become
		len = snprintf(buffer, *lenp + 1, "0x%04x\n",
				*(unsigned int *)table->data);
		if (len > *lenp)
			len = *lenp;
		*lenp -= len;
		*ppos += len;
		return 0;
and I really wonder if lifting the trailing boilerplate into the caller would've
been better.  Note that e.g. gems like
                        if (!first)
                                err = proc_put_char(&buffer, &left, '\t');
                        if (err)
                                break;
                        err = proc_put_long(&buffer, &left, lval, neg);
                        if (err)
                                break;
are due to lack of snprintf-to-user; now, lose the "to user" part and we suddenly
can be rid of that stuff...
That sounds pretty sensible, but can we do that as an extra step?
That is in merge window N just move to passing kernel pointers, check
for fall out.  In merge window N + 1 start allocatin the extra byte and
switch at least the common helpers for snprintf?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help