If multiple accept's happen during a select, make sure it gets stored correctly, and does not clobber an existing open descriptor.

Signed-off-by: Love Hörnquist Åstrand <lha@h5l.org>
This commit is contained in:
Dana Koch
2012-11-17 08:09:45 +08:00
committed by Love Hörnquist Åstrand
parent 3ea8da179a
commit 3f71aca591

View File

@@ -824,6 +824,48 @@ handle_tcp(krb5_context context,
}
}
krb5_boolean
realloc_descrs(struct descr **d, unsigned int *ndescr)
{
struct descr *tmp;
size_t i;
tmp = realloc(*d, (*ndescr + 4) * sizeof(**d));
if(tmp == NULL)
return TRUE;
*d = tmp;
reinit_descrs (*d, *ndescr);
memset(*d + *ndescr, 0, 4 * sizeof(**d));
for(i = *ndescr; i < *ndescr + 4; i++)
init_descr (*d + i);
*ndescr += 4;
return FALSE;
}
int
next_min_free(krb5_context context, struct descr **d, unsigned int *ndescr)
{
size_t i;
int min_free;
for(i = 0; i < *ndescr; i++) {
int s = (*d + i)->s;
if(rk_IS_BAD_SOCKET(s))
return i;
}
min_free = *ndescr;
if(!realloc_descrs(d, ndescr)) {
min_free = -1;
krb5_warnx(context, "No memory");
}
return min_free;
}
void
loop(krb5_context context,
krb5_kdc_configuration *config)
@@ -862,22 +904,6 @@ loop(krb5_context context,
#endif
#endif
FD_SET(d[i].s, &fds);
} else if(min_free < 0 || i < (size_t)min_free)
min_free = i;
}
if(min_free == -1){
struct descr *tmp;
tmp = realloc(d, (ndescr + 4) * sizeof(*d));
if(tmp == NULL)
krb5_warnx(context, "No memory");
else {
d = tmp;
reinit_descrs (d, ndescr);
memset(d + ndescr, 0, 4 * sizeof(*d));
for(i = ndescr; i < ndescr + 4; i++)
init_descr (&d[i]);
min_free = ndescr;
ndescr += 4;
}
}
@@ -893,10 +919,12 @@ loop(krb5_context context,
default:
for(i = 0; i < ndescr; i++)
if(!rk_IS_BAD_SOCKET(d[i].s) && FD_ISSET(d[i].s, &fds)) {
if(d[i].type == SOCK_DGRAM)
handle_udp(context, config, &d[i]);
else if(d[i].type == SOCK_STREAM)
handle_tcp(context, config, d, i, min_free);
min_free = next_min_free(context, &d, &ndescr);
if(d[i].type == SOCK_DGRAM)
handle_udp(context, config, &d[i]);
else if(d[i].type == SOCK_STREAM)
handle_tcp(context, config, d, i, min_free);
}
}
}