diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/smbldap.h | 6 | ||||
-rw-r--r-- | source3/lib/smbldap.c | 40 |
2 files changed, 26 insertions, 20 deletions
diff --git a/source3/include/smbldap.h b/source3/include/smbldap.h index 69b4153f28..060fcc21eb 100644 --- a/source3/include/smbldap.h +++ b/source3/include/smbldap.h @@ -153,7 +153,7 @@ int smbldap_modify(struct smbldap_state *ldap_state, struct smbldap_state { LDAP *ldap_struct; pid_t pid; - time_t last_ping; + time_t last_ping; /* monotonic */ /* retrive-once info */ const char *uri; @@ -166,11 +166,11 @@ struct smbldap_state { unsigned int num_failures; - time_t last_use; + time_t last_use; /* monotonic */ struct event_context *event_context; struct timed_event *idle_event; - struct timeval last_rebind; + struct timeval last_rebind; /* monotonic */ }; /* struct used by both pdb_ldap.c and pdb_nds.c */ diff --git a/source3/lib/smbldap.c b/source3/lib/smbldap.c index 996c1c4c85..67e3d4dc1b 100644 --- a/source3/lib/smbldap.c +++ b/source3/lib/smbldap.c @@ -958,6 +958,7 @@ static int rebindproc_with_state (LDAP * ld, char **whop, char **credp, int *methodp, int freeit, void *arg) { struct smbldap_state *ldap_state = arg; + struct timespec ts; /** @TODO Should we be doing something to check what servers we rebind to? Could we get a referral to a machine that we don't want to give our @@ -990,7 +991,8 @@ static int rebindproc_with_state (LDAP * ld, char **whop, char **credp, *methodp = LDAP_AUTH_SIMPLE; } - GetTimeOfDay(&ldap_state->last_rebind); + clock_gettime_mono(&ts); + ldap_state->last_rebind = convert_timespec_to_timeval(ts); return 0; } @@ -1010,6 +1012,7 @@ static int rebindproc_connect_with_state (LDAP *ldap_struct, struct smbldap_state *ldap_state = (struct smbldap_state *)arg; int rc; + struct timespec ts; int version; DEBUG(5,("rebindproc_connect_with_state: Rebinding to %s as \"%s\"\n", @@ -1042,7 +1045,8 @@ static int rebindproc_connect_with_state (LDAP *ldap_struct, DEBUG(10,("rebindproc_connect_with_state: " "setting last_rebind timestamp " "(req: 0x%02x)\n", (unsigned int)request)); - GetTimeOfDay(&ldap_state->last_rebind); + clock_gettime_mono(&ts); + ldap_state->last_rebind = convert_timespec_to_timeval(ts); break; default: ZERO_STRUCT(ldap_state->last_rebind); @@ -1168,7 +1172,7 @@ static int smbldap_connect_system(struct smbldap_state *ldap_state, LDAP * ldap_ static void smbldap_idle_fn(struct event_context *event_ctx, struct timed_event *te, - struct timeval now, + struct timeval now_abs, void *private_data); /********************************************************************** @@ -1180,7 +1184,7 @@ static int smbldap_open(struct smbldap_state *ldap_state) bool reopen = False; SMB_ASSERT(ldap_state); - if ((ldap_state->ldap_struct != NULL) && ((ldap_state->last_ping + SMBLDAP_DONT_PING_TIME) < time(NULL))) { + if ((ldap_state->ldap_struct != NULL) && ((ldap_state->last_ping + SMBLDAP_DONT_PING_TIME) < time_mono(NULL))) { #ifdef HAVE_UNIXSOCKET struct sockaddr_un addr; @@ -1204,7 +1208,7 @@ static int smbldap_open(struct smbldap_state *ldap_state) ldap_state->ldap_struct = NULL; ldap_state->last_ping = (time_t)0; } else { - ldap_state->last_ping = time(NULL); + ldap_state->last_ping = time_mono(NULL); } } @@ -1224,7 +1228,7 @@ static int smbldap_open(struct smbldap_state *ldap_state) } - ldap_state->last_ping = time(NULL); + ldap_state->last_ping = time_mono(NULL); ldap_state->pid = sys_getpid(); TALLOC_FREE(ldap_state->idle_event); @@ -1274,7 +1278,7 @@ static void gotalarm_sig(int dummy) static int another_ldap_try(struct smbldap_state *ldap_state, int *rc, int *attempts, time_t endtime) { - time_t now = time(NULL); + time_t now = time_mono(NULL); int open_rc = LDAP_SERVER_DOWN; if (*rc != LDAP_SERVER_DOWN) @@ -1347,7 +1351,7 @@ static int smbldap_search_ext(struct smbldap_state *ldap_state, int rc = LDAP_SERVER_DOWN; int attempts = 0; char *utf8_filter; - time_t endtime = time(NULL)+lp_ldap_timeout(); + time_t endtime = time_mono(NULL)+lp_ldap_timeout(); struct timeval timeout; size_t converted_size; @@ -1358,11 +1362,12 @@ static int smbldap_search_ext(struct smbldap_state *ldap_state, if (ldap_state->last_rebind.tv_sec > 0) { struct timeval tval; + struct timespec ts; int64_t tdiff = 0; int sleep_time = 0; - ZERO_STRUCT(tval); - GetTimeOfDay(&tval); + clock_gettime_mono(&ts); + tval = convert_timespec_to_timeval(ts); tdiff = usec_time_diff(&tval, &ldap_state->last_rebind); tdiff /= 1000; /* Convert to milliseconds. */ @@ -1545,7 +1550,7 @@ int smbldap_modify(struct smbldap_state *ldap_state, const char *dn, LDAPMod *at int rc = LDAP_SERVER_DOWN; int attempts = 0; char *utf8_dn; - time_t endtime = time(NULL)+lp_ldap_timeout(); + time_t endtime = time_mono(NULL)+lp_ldap_timeout();; size_t converted_size; SMB_ASSERT(ldap_state); @@ -1589,7 +1594,7 @@ int smbldap_add(struct smbldap_state *ldap_state, const char *dn, LDAPMod *attrs int rc = LDAP_SERVER_DOWN; int attempts = 0; char *utf8_dn; - time_t endtime = time(NULL)+lp_ldap_timeout(); + time_t endtime = time_mono(NULL)+lp_ldap_timeout();; size_t converted_size; SMB_ASSERT(ldap_state); @@ -1633,7 +1638,7 @@ int smbldap_delete(struct smbldap_state *ldap_state, const char *dn) int rc = LDAP_SERVER_DOWN; int attempts = 0; char *utf8_dn; - time_t endtime = time(NULL)+lp_ldap_timeout(); + time_t endtime = time_mono(NULL)+lp_ldap_timeout();; size_t converted_size; SMB_ASSERT(ldap_state); @@ -1679,7 +1684,7 @@ int smbldap_extended_operation(struct smbldap_state *ldap_state, { int rc = LDAP_SERVER_DOWN; int attempts = 0; - time_t endtime = time(NULL)+lp_ldap_timeout(); + time_t endtime = time_mono(NULL)+lp_ldap_timeout(); if (!ldap_state) return (-1); @@ -1726,7 +1731,7 @@ int smbldap_search_suffix (struct smbldap_state *ldap_state, static void smbldap_idle_fn(struct event_context *event_ctx, struct timed_event *te, - struct timeval now, + struct timeval now_abs, void *private_data) { struct smbldap_state *state = (struct smbldap_state *)private_data; @@ -1738,12 +1743,13 @@ static void smbldap_idle_fn(struct event_context *event_ctx, return; } - if ((state->last_use+SMBLDAP_IDLE_TIME) > now.tv_sec) { + if ((state->last_use+SMBLDAP_IDLE_TIME) > time_mono(NULL)) { DEBUG(10,("ldap connection not idle...\n")); + /* this needs to be made monotonic clock aware inside tevent: */ state->idle_event = event_add_timed( event_ctx, NULL, - timeval_add(&now, SMBLDAP_IDLE_TIME, 0), + timeval_add(&now_abs, SMBLDAP_IDLE_TIME, 0), smbldap_idle_fn, private_data); return; |