Re: avoid sending pointer values in struct passwd

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

 



On Wed, 25 Nov 2020, Damien Miller wrote:

> +		    (r = sshbuf_put_u64(b, pwent->id < 0 ? \
> +		    -pwent->id : pwent->id)) != 0) \

*cough* -2⁶³ will trigger UB/IB on this.


Since sender and recipient are on the same system, you can just…

union a64bitquantity {
	uint64_t u;
	int64_t i;
}

#define PUTPW(b, id) do {				\
	unsigned char issigned = pwent->id < 0;		\
	union a64bitquantity q;				\
							\
	if (issigned)					\
		q.i = pwent->id;			\
	else						\
		q.u = pwent->id;			\
							\
	if ((r = sshbuf_put_u8(b, issigned)) != 0 ||	\
	    (r = sshbuf_put_u64(b, q.u)) != 0)		\
		fatal_fr(r, "assemble pw %s", #id);	\
} while (/* CONSTCOND */ 0)

#define GETPW(b, id) do {				\
	unsigned char issigned;				\
	union a64bitquantity q;				\
							\
	if ((r = sshbuf_get_u8(b, &issigned)) != 0 ||	\
	    (r = sshbuf_get_u64(b, &q.u)) != 0)		\
		fatal_fr(r, "parse pw %s", #id);	\
	/* don’t use a ternary expression here */	\
	if (issigned)					\
		pwent->id = q.i;			\
	else						\
		pwent->id = q.u;			\
} while (/* CONSTCOND */ 0)

Use of such a union is AFAIR safe.

Using a ternary operation could trigger UB/IB by
trying to bring the operands to the same type.


It might actually be easier to try and find out whether
the type is signed or not. I don’t know of a good method,
“the ’net” suggests:

#define	ISUNSIGNED(T)	((T)-1 > 0)

This, unfortunately, doesn’t work as a compile-time check.
But we can do this during configure time:

~ $ gcc -DI='<stdlib.h>' -DT=size_t -c a.c
~ $ gcc -DI='<stdlib.h>' -DT=ssize_t -c a.c
a.c: In function ‘foo’:
a.c:4:6: error: size of array ‘statictest’ is negative
    4 |  int statictest[((T)-1 > 0) ? 1 : -1];
      |      ^~~~~~~~~~
1|~ $ cat a.c
#include I

int foo(void) {
	int statictest[((T)-1 > 0) ? 1 : -1];
	return (0);
}
~ $

Check whether this compiles to set preprocessor
definitions, then use the to select the suitable
function to pass the value.

This is what I feel is safest; ofc YMMV…

bye,
//mirabilos
-- 
tarent solutions GmbH
Rochusstraße 2-4, D-53123 Bonn • http://www.tarent.de/
Tel: +49 228 54881-393 • Fax: +49 228 54881-235
HRB 5168 (AG Bonn) • USt-ID (VAT): DE122264941
Geschäftsführer: Dr. Stefan Barth, Kai Ebenrett, Boris Esser, Alexander Steeg

*************************************************

Mit unserem Consulting bieten wir Unternehmen maßgeschneiderte Angebote in
Form von Beratung, Trainings sowie Workshops in den Bereichen
Softwaretechnologie, IT Strategie und Architektur, Innovation und Umsetzung
sowie Agile Organisation.

Besuchen Sie uns auf https://www.tarent.de/consulting .
Wir freuen uns auf Ihren Kontakt.

*************************************************
_______________________________________________
openssh-unix-dev mailing list
openssh-unix-dev@xxxxxxxxxxx
https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev




[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux