Is kfw thread safe ?

Markus Moeller huaraz at moeller.plus.com
Sun Sep 9 09:13:28 EDT 2007


I have an application running on w2k3 compiled with VisualStudio 2005 
Express Edition which calls gss_init_sec_context from different threads with 
a memory cache and I get from time to time the following if I run it under 
debug in VS 2005:

First-chance exception at 0x77e55e02 in thread_test.exe: 0x000006D9: There 
are no more endpoints available from the endpoint mapper.

One sample trace is:

  kernel32.dll!77e55e02()
  [Frames below may be incorrect and/or missing, no symbols loaded for 
kernel32.dll]
  kernel32.dll!77e55e02()
  rpcrt4.dll!77c71abe()
  rpcrt4.dll!77c71122()
  rpcrt4.dll!77c84664()
  rpcrt4.dll!77c848aa()
  rpcrt4.dll!77ce2125()
  ntdll.dll!7c821b84()
  ntdll.dll!7c821b84()
> krb5_32.dll!asn1_decode_principal_name(code_buffer_rep * buf=0x00000774, 
> krb5_principal_data * * val=0x00000000)  Line 382 + 0x1b bytes C
  kernel32.dll!77e6bad8()
  ntdll.dll!7c8302b3()
  ntdll.dll!7c82f9c1()
  ntdll.dll!7c8302e7()
  ntdll.dll!7c82fadf()
  ntdll.dll!7c82fb23()
  ws2_32.dll!71c07ebc()
  ws2_32.dll!71c03717()
  ws2_32.dll!71c035b3()
  ntdll.dll!7c8302b3()
  ntdll.dll!7c82f9c1()
  ntdll.dll!7c82f9dd()
  ws2_32.dll!71c07959()
  ntdll.dll!7c8302e7()
  ntdll.dll!7c82fadf()
  ntdll.dll!7c82fb23()
  ws2_32.dll!71c07039()
  ntdll.dll!7c8302e7()
  ntdll.dll!7c82fadf()
  ntdll.dll!7c82fb23()
  mswsock.dll!71b23f4b()
  mswsock.dll!71b23f4b()
  mswsock.dll!71b24206()
  mswsock.dll!71b2423a()
  ntdll.dll!7c82fb23()
  hnetcfg.dll!5f2a2acf()
  hnetcfg.dll!5f29c464()
  mswsock.dll!71b2217f()
  ntdll.dll!7c8213e4()
  mswsock.dll!71b21aba()
  mswsock.dll!71b23f4b()
  mswsock.dll!71b24891()
  ws2help.dll!71bf17fc()
  mswsock.dll!71b26493()
  mswsock.dll!71b22767()
  ws2help.dll!71bf17fc()
  mswsock.dll!71b26599()
  ws2_32.dll!71c039ce()
  krb5_32.dll!start_connection(conn_state * state=0x003d9ec8, select_state * 
selstate=0x00e604c8, sendto_callback_info * callback_info=0x00000000, 
_krb5_data * callback_buffer=0x00000000)  Line 631 + 0x15 bytes C
  krb5_32.dll!maybe_send(conn_state * conn=0x003d9ec8, select_state * 
selstate=0x00e604c8, sendto_callback_info * callback_info=0x00000000, 
_krb5_data * callback_buffer=0x00000000)  Line 748 + 0x11 bytes C
  krb5_32.dll!krb5int_sendto(_krb5_context * context=0x003dfa10, const 
_krb5_data * message=0x003d7558, const addrlist * addrs=0x00beede8, 
sendto_callback_info * callback_info=0x00000000, _krb5_data * 
reply=0x00beef9c, sockaddr * localaddr=0x00000000, int * 
localaddrlen=0x00000000, sockaddr * remoteaddr=0x00000000, int * 
remoteaddrlen=0x00000000, int * addr_used=0x00beeddc)  Line 1180 + 0x28 
bytes C
  krb5_32.dll!krb5_sendto_kdc(_krb5_context * context=0x003dfa10, const 
_krb5_data * message=0x003d7558, const _krb5_data * realm=0x003d72dc, 
_krb5_data * reply=0x00beef9c, int * use_master=0x00beee78, int tcp_only=0) 
Line 385 + 0x20 bytes C
  krb5_32.dll!krb5_send_tgs(_krb5_context * context=0x003dfa10, int 
kdcoptions=8388608, const _krb5_ticket_times * timestruct=0x00bef048, const 
int * ktypes=0x00000000, const krb5_principal_data * sname=0x003d72d8, 
_krb5_address * const * addrs=0x003d74e8, _krb5_authdata * const * 
authorization_data=0x00000000, _krb5_pa_data * const * padata=0x00000000, 
const _krb5_data * second_ticket=0x00000000, _krb5_creds * 
in_cred=0x00bef214, _krb5_response * rep=0x00beef94)  Line 267 + 0x26 bytes 
C
  krb5_32.dll!krb5_get_cred_via_tkt(_krb5_context * context=0x003dfa10, 
_krb5_creds * tkt=0x00bef214, int kdcoptions=8388608, _krb5_address * const 
* address=0x003d74e8, _krb5_creds * in_cred=0x00bef02c, _krb5_creds * * 
out_cred=0x003d7050)  Line 220 + 0x40 bytes C
  krb5_32.dll!try_kdc(tr_state * ts=0x00bef198, _krb5_creds * 
tgtq=0x00bef0e0)  Line 498 + 0x57 bytes C
  krb5_32.dll!next_closest_tgt(tr_state * ts=0x00bef198, krb5_principal_data 
* client=0x003dde60)  Line 580 + 0xc bytes C
  krb5_32.dll!do_traversal(_krb5_context * ctx=0x003dfa10, _krb5_ccache * 
ccache=0x003dd160, krb5_principal_data * client=0x003dde60, 
krb5_principal_data * server=0x003dde88, _krb5_creds * 
out_cc_tgt=0x00bef32c, _krb5_creds * * out_tgt=0x00bef328, _krb5_creds * * * 
out_kdc_tgts=0x00bef4d0)  Line 722 + 0xe bytes C
  krb5_32.dll!krb5_get_cred_from_kdc_opt(_krb5_context * context=0x003dfa10, 
_krb5_ccache * ccache=0x003dd160, _krb5_creds * in_cred=0x00bef598, 
_krb5_creds * * out_cred=0x00bef674, _krb5_creds * * * tgts=0x00bef4d0, int 
kdcopt=0)  Line 856 + 0x22 bytes C
  krb5_32.dll!krb5_get_cred_from_kdc(_krb5_context * context=0x003dfa10, 
_krb5_ccache * ccache=0x003dd160, _krb5_creds * in_cred=0x00bef598, 
_krb5_creds * * out_cred=0x00bef674, _krb5_creds * * * tgts=0x00bef4d0) 
Line 1186 + 0x16 bytes C
  krb5_32.dll!krb5_get_credentials(_krb5_context * context=0x003dfa10, int 
options=0, _krb5_ccache * ccache=0x003dd160, _krb5_creds * 
in_creds=0x00bef598, _krb5_creds * * out_creds=0x00bef674)  Line 144 + 0x15 
bytes C
  gssapi32.dll!get_credentials()  Line 118 + 0x17 bytes C
  gssapi32.dll!new_connection(unsigned int * minor_status=0x00befbe0, 
_krb5_gss_cred_id_rec * cred=0x003d7940, gss_ctx_id_struct * * 
context_handle=0x003db528, gss_name_struct * target_name=0x003d7b30, 
gss_OID_desc_struct * mech_type=0x003d7f98, unsigned int req_flags=32, 
unsigned int time_req=0, gss_channel_bindings_struct * 
input_chan_bindings=0x00000000, gss_buffer_desc_struct * 
input_token=0x00000000, gss_OID_desc_struct * * actual_mech_type=0x003d7e1c, 
gss_buffer_desc_struct * output_token=0x00bef984, unsigned int * 
ret_flags=0x003d7e14, unsigned int * time_rec=0x00000000, _krb5_context * 
context=0x003dfa10, int default_mech=0)  Line 540 + 0x1e bytes C
  gssapi32.dll!krb5_gss_init_sec_context(unsigned int * 
minor_status=0x00befbe0, gss_cred_id_struct * 
claimant_cred_handle=0x00000000, gss_ctx_id_struct * * 
context_handle=0x003db528, gss_name_struct * target_name=0x003d7b30, 
gss_OID_desc_struct * mech_type=0x003d7f98, unsigned int req_flags=32, 
unsigned int time_req=0, gss_channel_bindings_struct * 
input_chan_bindings=0x00000000, gss_buffer_desc_struct * 
input_token=0x00000000, gss_OID_desc_struct * * actual_mech_type=0x003d7e1c, 
gss_buffer_desc_struct * output_token=0x00bef984, unsigned int * 
ret_flags=0x003d7e14, unsigned int * time_rec=0x00000000)  Line 948 + 0x32 
bytes C
  gssapi32.dll!k5glue_init_sec_context(void * ctx=0x00000000, unsigned int * 
minor_status=0x00befbe0, gss_cred_id_struct * 
claimant_cred_handle=0x00000000, gss_ctx_id_struct * * 
context_handle=0x003db528, gss_name_struct * target_name=0x003d7b30, 
gss_OID_desc_struct * mech_type=0x003d7f98, unsigned int req_flags=32, 
unsigned int time_req=0, gss_channel_bindings_struct * 
input_chan_bindings=0x00000000, gss_buffer_desc_struct * 
input_token=0x00000000, gss_OID_desc_struct * * actual_mech_type=0x003d7e1c, 
gss_buffer_desc_struct * output_token=0x00bef984, unsigned int * 
ret_flags=0x003d7e14, unsigned int * time_rec=0x00000000)  Line 680 + 0x2c 
bytes C
  gssapi32.dll!gss_init_sec_context(unsigned int * minor_status=0x00befbe0, 
gss_cred_id_struct * claimant_cred_handle=0x00000000, gss_ctx_id_struct * * 
context_handle=0x003d7df0, gss_name_struct * target_name=0x003d78a8, 
gss_OID_desc_struct * req_mech_type=0x003d7f98, unsigned int req_flags=32, 
unsigned int time_req=0, gss_channel_bindings_struct * 
input_chan_bindings=0x00000000, gss_buffer_desc_struct * 
input_token=0x00000000, gss_OID_desc_struct * * actual_mech_type=0x003d7e1c, 
gss_buffer_desc_struct * output_token=0x00bef984, unsigned int * 
ret_flags=0x003d7e14, unsigned int * time_rec=0x00000000)  Line 225 + 0x37 
bytes C
  gssapi32.dll!init_ctx_call_init(unsigned int * minor_status=0x00befbe0, 
spnego_gss_ctx_id_rec * sc=0x003d7de0, gss_cred_id_struct * 
claimant_cred_handle=0x00000000, gss_name_struct * target_name=0x003d78a8, 
unsigned int req_flags=0, unsigned int time_req=0, gss_buffer_desc_struct * 
mechtok_in=0x00000000, gss_OID_desc_struct * * actual_mech=0x00000000, 
gss_buffer_desc_struct * mechtok_out=0x00bef984, unsigned int * 
ret_flags=0x00000000, unsigned int * time_rec=0x00000000, unsigned int * 
negState=0x00bef998, send_token_flag * send_token=0x00bef9a4)  Line 699 + 
0x3e bytes C
  gssapi32.dll!spnego_gss_init_sec_context(void * ct=0x00000000, unsigned 
int * minor_status=0x00befbe0, gss_cred_id_struct * 
claimant_cred_handle=0x00000000, gss_ctx_id_struct * * 
context_handle=0x003d77a0, gss_name_struct * target_name=0x003d78a8, 
gss_OID_desc_struct * mech_type=0x004b6048, unsigned int req_flags=0, 
unsigned int time_req=0, gss_channel_bindings_struct * 
input_chan_bindings=0x00000000, gss_buffer_desc_struct * 
input_token=0x00befbc8, gss_OID_desc_struct * * actual_mech=0x00000000, 
gss_buffer_desc_struct * output_token=0x00befbc0, unsigned int * 
ret_flags=0x00000000, unsigned int * time_rec=0x00000000)  Line 808 + 0x2f 
bytes C
  gssapi32.dll!gss_init_sec_context(unsigned int * minor_status=0x00befbe0, 
gss_cred_id_struct * claimant_cred_handle=0x00000000, gss_ctx_id_struct * * 
context_handle=0x00befbdc, gss_name_struct * target_name=0x003d7278, 
gss_OID_desc_struct * req_mech_type=0x004b6048, unsigned int req_flags=0, 
unsigned int time_req=0, gss_channel_bindings_struct * 
input_chan_bindings=0x00000000, gss_buffer_desc_struct * 
input_token=0x00befbc8, gss_OID_desc_struct * * actual_mech_type=0x00000000, 
gss_buffer_desc_struct * output_token=0x00befbc0, unsigned int * 
ret_flags=0x00000000, unsigned int * time_rec=0x00000000)  Line 225 + 0x37 
bytes C
  thread_test.exe!auth_call(char * server=0x009e3100, int gssapi=1, int 
debug=1, int logging=1, int thread=9)  Line 228 + 0x2e bytes C
  thread_test.exe!ConnectionHandler(void * threadarg=0x009e63f8)  Line 599 + 
0x29 bytes C
  kernel32.dll!77e6608b()


I run the same application on Unix and don't see these errors.

Thank you
Markus 






More information about the Kerberos mailing list