mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-03-07 14:18:15 +08:00
ldap_pvt_runqueue_next_sched() may return a pointer to data that's freed by task run earlier (ITS#4517)
This commit is contained in:
parent
608c85a9f0
commit
af1f87b96d
@ -63,7 +63,7 @@ ldap_pvt_runqueue_remove(
|
|||||||
LDAP_F( struct re_s* )
|
LDAP_F( struct re_s* )
|
||||||
ldap_pvt_runqueue_next_sched(
|
ldap_pvt_runqueue_next_sched(
|
||||||
struct runqueue_s* rq,
|
struct runqueue_s* rq,
|
||||||
struct timeval** next_run
|
struct timeval* next_run
|
||||||
);
|
);
|
||||||
|
|
||||||
LDAP_F( void )
|
LDAP_F( void )
|
||||||
|
@ -99,20 +99,16 @@ ldap_pvt_runqueue_remove(
|
|||||||
struct re_s*
|
struct re_s*
|
||||||
ldap_pvt_runqueue_next_sched(
|
ldap_pvt_runqueue_next_sched(
|
||||||
struct runqueue_s* rq,
|
struct runqueue_s* rq,
|
||||||
struct timeval** next_run
|
struct timeval* next_run
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
struct re_s* entry;
|
struct re_s* entry;
|
||||||
|
|
||||||
entry = LDAP_STAILQ_FIRST( &rq->task_list );
|
entry = LDAP_STAILQ_FIRST( &rq->task_list );
|
||||||
if ( entry == NULL ) {
|
if ( entry == NULL || entry->next_sched.tv_sec == 0 ) {
|
||||||
*next_run = NULL;
|
|
||||||
return NULL;
|
|
||||||
} else if ( entry->next_sched.tv_sec == 0 ) {
|
|
||||||
*next_run = NULL;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
*next_run = &entry->next_sched;
|
*next_run = entry->next_sched;
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1729,7 +1729,7 @@ slapd_daemon_task(
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
struct timeval *tvp;
|
struct timeval *tvp;
|
||||||
|
|
||||||
struct timeval *cat;
|
struct timeval cat;
|
||||||
time_t tdelta = 1;
|
time_t tdelta = 1;
|
||||||
struct re_s* rtask;
|
struct re_s* rtask;
|
||||||
now = slap_get_time();
|
now = slap_get_time();
|
||||||
@ -1810,7 +1810,7 @@ slapd_daemon_task(
|
|||||||
|
|
||||||
ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
|
ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
|
||||||
rtask = ldap_pvt_runqueue_next_sched( &slapd_rq, &cat );
|
rtask = ldap_pvt_runqueue_next_sched( &slapd_rq, &cat );
|
||||||
while ( cat && cat->tv_sec && cat->tv_sec <= now ) {
|
while ( rtask && cat.tv_sec && cat.tv_sec <= now ) {
|
||||||
if ( ldap_pvt_runqueue_isrunning( &slapd_rq, rtask )) {
|
if ( ldap_pvt_runqueue_isrunning( &slapd_rq, rtask )) {
|
||||||
ldap_pvt_runqueue_resched( &slapd_rq, rtask, 0 );
|
ldap_pvt_runqueue_resched( &slapd_rq, rtask, 0 );
|
||||||
} else {
|
} else {
|
||||||
@ -1818,15 +1818,15 @@ slapd_daemon_task(
|
|||||||
ldap_pvt_runqueue_resched( &slapd_rq, rtask, 0 );
|
ldap_pvt_runqueue_resched( &slapd_rq, rtask, 0 );
|
||||||
ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
|
ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
|
||||||
ldap_pvt_thread_pool_submit( &connection_pool,
|
ldap_pvt_thread_pool_submit( &connection_pool,
|
||||||
rtask->routine, (void *) rtask );
|
rtask->routine, (void *) rtask );
|
||||||
ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
|
ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
|
||||||
}
|
}
|
||||||
rtask = ldap_pvt_runqueue_next_sched( &slapd_rq, &cat );
|
rtask = ldap_pvt_runqueue_next_sched( &slapd_rq, &cat );
|
||||||
}
|
}
|
||||||
ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
|
ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
|
||||||
|
|
||||||
if ( cat && cat->tv_sec ) {
|
if ( rtask && cat.tv_sec ) {
|
||||||
time_t diff = difftime( cat->tv_sec, now );
|
time_t diff = difftime( cat.tv_sec, now );
|
||||||
if ( diff == 0 ) diff = tdelta;
|
if ( diff == 0 ) diff = tdelta;
|
||||||
if ( tvp == NULL || diff < tv.tv_sec ) {
|
if ( tvp == NULL || diff < tv.tv_sec ) {
|
||||||
tv.tv_sec = diff;
|
tv.tv_sec = diff;
|
||||||
|
Loading…
Reference in New Issue
Block a user