mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 14:21:25 +02:00
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:
parent
ebe62d645b
commit
bd57a9f977
@ -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_ */
|
||||
|
@ -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;
|
||||
|
10
src/hash.c
10
src/hash.c
@ -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--) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user