]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: backend: Update hash to use unsigned int throughout
authorDan Dubovik <ddubovik@godaddy.com>
Tue, 8 Jul 2014 15:51:03 +0000 (08:51 -0700)
committerWilly Tarreau <w@1wt.eu>
Tue, 8 Jul 2014 20:00:21 +0000 (22:00 +0200)
When we were generating a hash, it was done using an unsigned long.  When the hash was used
to select a backend, it was sent as an unsigned int.  This made it difficult to predict which
backend would be selected.

This patch updates get_hash, and the hash methods to use an unsigned int, to remain consistent
throughout the codebase.

This fix should be backported to 1.5 and probably in part to 1.4.

include/common/hash.h
src/backend.c
src/hash.c

index 379bf898c1df0fcaf3c33367420f6cadcfd93a27..7039ba507f5a16836e9d778dfda1d362d8af0f12 100644 (file)
@@ -22,8 +22,8 @@
 #ifndef _COMMON_HASH_H_
 #define _COMMON_HASH_H_
 
-unsigned long hash_djb2(const char *key, int len);
-unsigned long hash_wt6(const char *key, int len);
-unsigned long hash_sdbm(const char *key, int len);
+unsigned int hash_djb2(const char *key, int len);
+unsigned int hash_wt6(const char *key, int len);
+unsigned int hash_sdbm(const char *key, int len);
 
 #endif /* _COMMON_HASH_H_ */
index 5ddb88c4de21369cf508e1587bfb19e914bcccba..a96b767323d55bd16ea50a2ab9a2718138158a40 100644 (file)
@@ -63,9 +63,9 @@ int be_lastsession(const struct proxy *be)
 }
 
 /* helper function to invoke the correct hash method */
-static unsigned long gen_hash(const struct proxy* px, const char* key, unsigned long len)
+static unsigned int gen_hash(const struct proxy* px, const char* key, unsigned long len)
 {
-       unsigned long hash;
+       unsigned int hash;
 
        switch (px->lbprm.algo & BE_LB_HASH_FUNC) {
        case BE_LB_HFCN_DJB2:
@@ -183,7 +183,7 @@ struct server *get_server_sh(struct proxy *px, const char *addr, int len)
  */
 struct server *get_server_uh(struct proxy *px, char *uri, int uri_len)
 {
-       unsigned long hash = 0;
+       unsigned int hash = 0;
        int c;
        int slashes = 0;
        const char *start, *end;
@@ -232,7 +232,7 @@ struct server *get_server_uh(struct proxy *px, char *uri, int uri_len)
  */
 struct server *get_server_ph(struct proxy *px, const char *uri, int uri_len)
 {
-       unsigned long hash = 0;
+       unsigned int hash = 0;
        const char *start, *end;
        const char *p;
        const char *params;
@@ -294,7 +294,7 @@ struct server *get_server_ph(struct proxy *px, const char *uri, int uri_len)
  */
 struct server *get_server_ph_post(struct session *s)
 {
-       unsigned long    hash = 0;
+       unsigned int hash = 0;
        struct http_txn *txn  = &s->txn;
        struct channel   *req = s->req;
        struct http_msg *msg  = &txn->req;
@@ -372,7 +372,7 @@ struct server *get_server_ph_post(struct session *s)
  */
 struct server *get_server_hh(struct session *s)
 {
-       unsigned long    hash = 0;
+       unsigned int hash = 0;
        struct http_txn *txn  = &s->txn;
        struct proxy    *px   = s->be;
        unsigned int     plen = px->hh_len;
@@ -444,7 +444,7 @@ struct server *get_server_hh(struct session *s)
 /* RDP Cookie HASH.  */
 struct server *get_server_rch(struct session *s)
 {
-       unsigned long    hash = 0;
+       unsigned int hash = 0;
        struct proxy    *px   = s->be;
        unsigned long    len;
        int              ret;
index 034685efd538373ac8ea8bc89f5d2ae5c28e63b5..aa236cbb0054d0f56f4c5950d5bb7591fe068917 100644 (file)
@@ -17,7 +17,7 @@
 #include <common/hash.h>
 
 
-unsigned long hash_wt6(const char *key, int len)
+unsigned int hash_wt6(const char *key, int len)
 {
        unsigned h0 = 0xa53c965aUL;
        unsigned h1 = 0x5ca6953aUL;
@@ -44,9 +44,9 @@ unsigned long hash_wt6(const char *key, int len)
        return h0 ^ h1;
 }
 
-unsigned long hash_djb2(const char *key, int len)
+unsigned int hash_djb2(const char *key, int len)
 {
-       unsigned long hash = 5381;
+       unsigned int hash = 5381;
 
        /* the hash unrolled eight times */
        for (; len >= 8; len -= 8) {
@@ -72,9 +72,9 @@ unsigned long hash_djb2(const char *key, int len)
        return hash;
 }
 
-unsigned long hash_sdbm(const char *key, int len)
+unsigned int hash_sdbm(const char *key, int len)
 {
-       unsigned long hash = 0;
+       unsigned int hash = 0;
        int c;
 
        while (len--) {