authd: fix auth->cid type sizes

* long is too small on 32-bit systems, use unsigned long long if we want
  to check for out of range values
* UINT32_MAX is a valid cid, and 0 isn't
* make auth->cid a uint32_t not uint16_t
This commit is contained in:
Simon Arlott 2016-05-01 11:12:34 +01:00
parent a4da4fe574
commit 2392770f4d
No known key found for this signature in database
GPG key ID: C8975F2043CA5D24
3 changed files with 12 additions and 11 deletions

View file

@ -53,7 +53,7 @@ static void
handle_stat(int parc, char *parv[])
{
authd_stat_handler handler;
long lrid;
unsigned long long rid;
if(parc < 3)
{
@ -61,16 +61,16 @@ handle_stat(int parc, char *parv[])
return;
}
if((lrid = strtol(parv[1], NULL, 16)) > UINT32_MAX)
if((rid = strtoull(parv[1], NULL, 16)) > UINT32_MAX)
{
warn_opers(L_CRIT, "BUG: handle_stat got a rid that was too large: %lx", lrid);
warn_opers(L_CRIT, "BUG: handle_stat got a rid that was too large: %s", parv[1]);
return;
}
if (!(handler = authd_stat_handlers[(unsigned char)parv[2][0]]))
return;
handler((uint32_t)lrid, parv[2][0]);
handler((uint32_t)rid, parv[2][0]);
}
static void

View file

@ -280,10 +280,10 @@ static void
start_auth(const char *cid, const char *l_ip, const char *l_port, const char *c_ip, const char *c_port)
{
struct auth_client *auth;
long lcid = strtol(cid, NULL, 16);
unsigned long long lcid = strtoull(cid, NULL, 16);
rb_dlink_node *ptr;
if(lcid >= UINT32_MAX)
if(lcid == 0 || lcid > UINT32_MAX)
return;
auth = rb_malloc(sizeof(struct auth_client));
@ -293,7 +293,7 @@ start_auth(const char *cid, const char *l_ip, const char *l_port, const char *c_
rb_dictionary_add(auth_clients, RB_UINT_TO_POINTER(auth->cid), auth);
else
{
warn_opers(L_CRIT, "provider: duplicate client added via start_auth: %x", auth->cid);
warn_opers(L_CRIT, "provider: duplicate client added via start_auth: %s", cid);
exit(EX_PROVIDER_ERROR);
}
@ -357,7 +357,7 @@ void
handle_cancel_connection(int parc, char *parv[])
{
struct auth_client *auth;
long lcid;
unsigned long long lcid;
if(parc < 2)
{
@ -365,9 +365,10 @@ handle_cancel_connection(int parc, char *parv[])
exit(EX_PROVIDER_ERROR);
}
if((lcid = strtol(parv[1], NULL, 16)) > UINT32_MAX)
lcid = strtoull(parv[1], NULL, 16);
if(lcid == 0 || lcid > UINT32_MAX)
{
warn_opers(L_CRIT, "provider: got a request to cancel a connection that can't exist: %lx", lcid);
warn_opers(L_CRIT, "provider: got a request to cancel a connection that can't exist: %s", parv[1]);
exit(EX_PROVIDER_ERROR);
}

View file

@ -44,7 +44,7 @@ struct auth_client_data
struct auth_client
{
uint16_t cid; /* Client ID */
uint32_t cid; /* Client ID */
char l_ip[HOSTIPLEN + 1]; /* Listener IP address */
uint16_t l_port; /* Listener port */