BUG/MEDIUM: backend: Update hash to use unsigned int throughout

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.
This commit is contained in:
Dan Dubovik 2014-07-08 08:51:03 -07:00 committed by Willy Tarreau
parent ebe62d645b
commit bd57a9f977
3 changed files with 15 additions and 15 deletions

View 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_ */

View 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;

View 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--) {