Looking closer now that I'm awake... Howard Chu writes: >Hallvard B Furuseth wrote: >>Howard Chu writes: >>>> Keep the sock_errset() if returning LBER_DEFAULT and sblen< 0? >>> No. ber_int_sb_read() will cause errno to already be set if it cannot >>> fulfill the request. >> >> Sorry, I meant sblen>= 0 of course. That can be a read() result which >> does not set errno. > > No, doesn't matter. A blocking read that returns 0 means of course that the > connection was closed.
But the caller doesn't know that. What it knows is that ber_get_next() returned LBER_DEFAULT. Anyway, that part of the code seems to be gone now. > A non-blocking read that returns 0 will set errno. Not on my host (Linux). And not in the Posix spec that I can see. In any case, it looks like the error number handling is incomplete: ber_get_next() can do sock_errset(0) before calling ber_int_sb_read() and returning LBER_DEFAULT if zero result, however that function can set errno spuriously and then return zero. At least in an EINTR loop there or in sb_rdahead_read(). I don't know if the read OS call itself is one of the functions which can set errno (or WSASetLastError) spuriously on some OSes. ber_get_next() can return LBER_DEFAULT due to memory allocation error, I don't suppose that does sock_errset(). Haven't checked if all variants set errno either before failing. On the caller side, slapd/connection.c treats all other return values than LDAP_TAG_MESSAGE as LBER_DEFAULT and examines sock_errno(). libldap/result.c does Debug() before reading sock_errno(). Debug() can change errno. -- Hallvard
