Here is what I have tried. This is the processing of the failing ldap_result():
(gdb) c
Continuing.
Breakpoint 3, ldap_is_read_ready (ld=0x7f48f3a170a0, sb=0x7f48f3a22580) at ../../../libraries/libldap/os-ip.c:1005
1005 sip = (struct selectinfo *)ld->ld_selectinfo;
(gdb) n
1007 if (ber_sockbuf_ctrl( sb, LBER_SB_OPT_DATA_READY, NULL ))
(gdb)
1010 ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_FD, &sd );
(gdb)
1016 for(i=0; i < sip->si_maxfd; i++) {
(gdb)
1017 if( sip->si_fds[i].fd == sd ) {
(gdb)
1018 return sip->si_fds[i].revents & POLL_READ;
(gdb) p sip->si_fds[0].revents
$14 = 4
(gdb) bt full
#0 ldap_is_read_ready (ld=0x7f48f3a170a0, sb=0x7f48f3a22580) at ../../../libraries/libldap/os-ip.c:1018
i = 0
sip = 0x7f48f3a2f590
sd = 17
#1 0x00007f48f17ab743 in wait4msg (ld=0x7f48f3a170a0, msgid=-1, all=0, timeout=0x7fff16e75da0, result=0x7fff16e75d60)
at ../../../libraries/libldap/result.c:357
lnext = 0x0
serviced = 0
lc_ready = 1
rc = -2
tv = {tv_sec = 0, tv_usec = 0}
tv0 = {tv_sec = 0, tv_usec = 0}
start_time_tv = {tv_sec = 1329407008, tv_usec = 270973}
tvp = 0x7fff16e75c70
lc = 0x7f48f3a2db80
__PRETTY_FUNCTION__ = "wait4msg"
#2 0x00007f48f17aaf0e in ldap_result (ld=0x7f48f3a170a0, msgid=-1, all=0, timeout=0x7fff16e75da0, result=0x7fff16e75d60)
at ../../../libraries/libldap/result.c:117
rc = 32584
__PRETTY_FUNCTION__ = "ldap_result"
#3 0x00007f48e6da897e in sdap_process_result (ev=0x7f48f39f94d0, pvt=0x7f48f3a38b70) at src/providers/ldap/sdap_async.c:179
sh = 0x7f48f3a38b70
no_timeout = {tv_sec = 0, tv_usec = 0}
te = 0x7f48f3a2cab0
msg = 0x0
ret = 101
__FUNCTION__ = "sdap_process_result"
#4 0x00007f48e6da8594 in sdap_ldap_next_result (ev=0x7f48f39f94d0, te=0x7f48f3a2cab0, tv=..., pvt=0x7f48f3a38b70)
at src/providers/ldap/sdap_async.c:159
No locals.
#5 0x00007f48f2f19310 in tevent_common_loop_timer_delay (ev=ev@entry=0x7f48f39f94d0) at ../tevent_timed.c:254
current_time = {tv_sec = 0, tv_usec = 0}
te = 0x7f48f3a2cab0
#6 0x00007f48f2f189ec in std_event_loop_once (ev=0x7f48f39f94d0, location=<optimized out>) at ../tevent_standard.c:558
std_ev = 0x7f48f39f9590
tval = {tv_sec = 0, tv_usec = 0}
#7 0x00007f48f2f15cb0 in _tevent_loop_once (ev=ev@entry=0x7f48f39f94d0,
location=location@entry=0x7f48f37e52e7 "src/util/server.c:572") at ../tevent.c:504
ret = <optimized out>
nesting_stack_ptr = 0x0
#8 0x00007f48f2f15e3b in tevent_common_loop_wait (ev=0x7f48f39f94d0, location=0x7f48f37e52e7 "src/util/server.c:572")
at ../tevent.c:605
ret = <optimized out>
#9 0x00007f48f37b8a85 in server_loop (main_ctx=0x7f48f39fa640) at src/util/server.c:572
No locals.
#10 0x00007f48f3779a88 in main (argc=5, argv=0x7fff16e763a8) at src/providers/data_provider_be.c:2003
opt = -1
pc = 0x7f48f39f8010
be_domain = 0x7f48f39f8420 "foo"
srv_name = 0x7f48f39f80d0 "sssd[be[foo]]"
main_ctx = 0x7f48f39fa640
confdb_path = 0x7f48f39f8140 "config/domain/foo"
ret = 0
long_options = {{longName = 0x0, shortName = 0 '\000', argInfo = 4, arg = 0x7f48f2d06200, val = 0,
descrip = 0x7f48f37dcb7c "Help options:", argDescrip = 0x0}, {longName = 0x7f48f37dcb8a "debug-level",
shortName = 100 'd', argInfo = 2, arg = 0x7f48f39f4738, val = 0, descrip = 0x7f48f37dcb96 "Debug level",
argDescrip = 0x0}, {longName = 0x7f48f37dcba2 "debug-to-files", shortName = 102 'f', argInfo = 0, arg = 0x7f48f39f473c,
val = 0, descrip = 0x7f48f37dcbb8 "Send the debug output to files instead of stderr", argDescrip = 0x0}, {
longName = 0x7f48f37dcbe9 "debug-timestamps", shortName = 0 '\000', argInfo = 2, arg = 0x7f48f39f4598, val = 0,
descrip = 0x7f48f37dcbfa "Add debug timestamps", argDescrip = 0x0}, {longName = 0x7f48f37dcc0f "debug-microseconds",
shortName = 0 '\000', argInfo = 2, arg = 0x7f48f39f459c, val = 0,
descrip = 0x7f48f37dcc28 "Show timestamps with microseconds", argDescrip = 0x0}, {longName = 0x7f48f37dcc4a "domain",
shortName = 0 '\000', argInfo = 1, arg = 0x7fff16e76058, val = 0,
descrip = 0x7f48f37dcc58 "Domain of the information provider (mandatory)", argDescrip = 0x0}, {longName = 0x0,
shortName = 0 '\000', argInfo = 0, arg = 0x0, val = 0, descrip = 0x0, argDescrip = 0x0}}
__FUNCTION__ = "main"
(gdb) fin
Run till exit from #0 ldap_is_read_ready (ld=0x7f48f3a170a0, sb=0x7f48f3a22580) at ../../../libraries/libldap/os-ip.c:1028
wait4msg (ld=0x7f48f3a170a0, msgid=-1, all=0, timeout=0x7fff16e75da0, result=0x7fff16e75d60)
at ../../../libraries/libldap/result.c:356
356 if ( lc->lconn_status == LDAP_CONNST_CONNECTED &&
Value returned is $15 = 0
(gdb) c
Continuing.
Breakpoint 2, wait4msg (ld=0x7f48f3a170a0, msgid=-1, all=0, timeout=0x7fff16e75da0, result=0x7fff16e75d60)
at ../../../libraries/libldap/result.c:378
378 rc = -1;
As you may see, there is only a POLLOUT flag set:
> (gdb) p sip->si_fds[0].revents
> $14 = 4
/usr/include/bits/poll.h:
> #define POLLOUT 0x004 /* Writing now will not block. */
So I believe, that there is some other problem, because lc_ready is 1. And
without the reverted patch, the operation would just keep looping with
LDAP_MSG_X_KEEP_LOOKING. (Or will timeout alternatively.)