[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: ws2_32: WS_get_local_ips: Fix sorting IP addresses by metric if two addresses have the same metr
From:       Ken Thomases <ken () codeweavers ! com>
Date:       2014-10-28 1:59:38
Message-ID: E49B5EEC-8CC9-4BFB-8D5E-9052A74745A3 () codeweavers ! com
[Download RAW message or body]

Hi,

On Oct 24, 2014, at 3:27 PM, Joachim Priesner <joachim.priesner@web.de> wrote:

> The previous implementation required the metrics to be mutually inequal
> (because of the "this_metric > last_metric" check). If the metrics were
> not mutually inequal, it would write only one address per metric value to the list
> and fill up the rest of the list with the magic loopback IP address 127.12.34.56.
> 
> I take it that this is not the expected behavior, please correct me if I'm wrong!

I was recently looking at this code and noticed the same problem.  Thanks for working \
on this.

I don't understand why the original code ever would have wanted to return the magic \
loopback address, other than to cover up the brokenness of the sort.  So, why do you \
still have that logic in there?

Each pass of the outer (i) loop can "consume" at most one entry in the list.  So, the \
inner (j) loop should always find a remaining lowest-metric entry.  lowest_metric_idx \
should never be -1 at the end of that loop and the magic address should never be \
used.

More simply, this is just an attempt to sort the routes.  None should be added and \
none should be removed (i.e. replaced with magic).  Since it's a sort, I recommend \
that this loop simply be replaced with an invocation of qsort() with an appropriate \
comparison function.  That's what's done in iphlpapi for similar situations.  (This \
can be conditioned on numroutes >= 2 to avoid the overhead when it's not necessary.)

After the routes are sorted, the addresses can be copied over to the h_addr_list with \
a much simpler loop.

-Ken


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic