-stable review patch.  If anyone has any objections, please let us know.
------------------

From: David Miller <[EMAIL PROTECTED]>

When this code was converted to use sk_for_each() the
logic for the "best hash chain length" code was reversed,
breaking everything.

The original code was of the form:

                        size = 0;
                        do {
                                if (++size >= best_size_so_far)
                                        goto next;
                        } while ((sk = sk->next) != NULL);
                        best_size_so_far = size;
                        best = result;
                next:;

and this got converted into:

                        sk_for_each(sk2, node, head)
                                if (++size < best_size_so_far) {
                                        best_size_so_far = size;
                                        best = result;
                                }

Which does something very very different from the original.

Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
Signed-off-by: Chris Wright <[EMAIL PROTECTED]>
---
 net/ipv4/udp.c |   13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

--- linux-2.6.19.1.orig/net/ipv4/udp.c
+++ linux-2.6.19.1/net/ipv4/udp.c
@@ -167,11 +167,14 @@ int udp_get_port(struct sock *sk, unsign
                                goto gotit;
                        }
                        size = 0;
-                       sk_for_each(sk2, node, head)
-                               if (++size < best_size_so_far) {
-                                       best_size_so_far = size;
-                                       best = result;
-                               }
+                       sk_for_each(sk2, node, head) {
+                               if (++size >= best_size_so_far)
+                                       goto next;
+                       }
+                       best_size_so_far = size;
+                       best = result;
+               next:
+                       ;
                }
                result = best;
                for(i = 0; i < (1 << 16) / UDP_HTABLE_SIZE; i++, result += 
UDP_HTABLE_SIZE) {

--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to