Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Fri, 19 Apr 2013 21:49:45 -0400
From: Rich Felker <dalias@...ifal.cx>
To: musl@...ts.openwall.com
Subject: Re: [patch] add ether_(aton, ntoa)

On Sun, Apr 14, 2013 at 11:10:55PM -0500, Strake wrote:
> +struct ether_addr *ether_aton_r (const char *x, struct ether_addr *p_a) {
> +	for (int ii = 0; ii < 6; ii++) {
> +		unsigned long int n;
> +		if (ii != 0) {
> +			if (x[0] != ':') return 0; /* bad format */
> +			else x++;
> +		}
> +		n = strtoul (x, &x, 16);

&x has the wrong type; strtoul requires char **, not const char **.
A separate temp var is required for the output, as in.

	char *y;
	n = strtoul (x, &y, 16);
	x = y;

or similar. As far as I know the naive cast one could make to "fix"
the type mismatch is not valid; it would be an aliasing violation.

> +		if (n > 0xFF) return 0; /* bad byte */
> +		(*p_a).ether_addr_octet[ii] = n;

Is there a reason you're using (*p_a). rather than p_a-> ?

Also, I'm not sure if this is worth changing or not, but usually we
avoid writing to output pointers except on success. For standard
interfaces this is a conformance issue, but for these it probably
doesn't matter.

> +char *ether_ntoa_r (const struct ether_addr *p_a, char *x) {
> +	char *y;
> +	y = x;
> +	for (int ii = 0; ii < 6; ii++) {
> +		x += sprintf (x, ii == 0 ? "%.2X" : ":%.2X", (*p_a).ether_addr_octet[ii]);

And again, why not p_a-> ?

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.