There is a bug in processing the dfree cache time, which is associated with the
smbd idle timer. The idle timer call conn_idle_all(), which updates the
conn->lastused timestamp. The dfree cache time code in smbd/dfree.c depends on
conn->lastused being up to date to refresh the cached dfree value.
Unfortunately the conn_idle_all() returns early if any of the connection
structs is not idle, never updating any further conn->lastused timestamps. If
(as is common due to an IPC$ connection) there are more than one used
connection struct, then the conn->lastused timestamps after the IPC$ connection
in the connection list will never be updated.
Ensure we always update conn->lastused for all connections when calling
conn_idle_all().
Jeremy.
int deadtime = lp_deadtime()*60;
pipes_struct *plist = NULL;
connection_struct *conn;
+ bool ret = true;
if (deadtime <= 0)
deadtime = DEFAULT_SMBD_TIMEOUT;
if (conn->lastused != conn->lastused_count) {
conn->lastused = t;
conn->lastused_count = t;
+ age = 0;
}
/* close dirptrs on connections that are idle */
}
if (conn->num_files_open > 0 || age < deadtime) {
- return False;
+ ret = false;
}
}
for (plist = get_first_internal_pipe(); plist;
plist = get_next_internal_pipe(plist)) {
if (num_pipe_handles(plist->pipe_handles) != 0) {
- return False;
+ ret = false;
+ break;
}
}
- return True;
+ return ret;
}
/****************************************************************************