From fb56a273b1f2b3a99dc1d1a0850378ab7625e6b9 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Wed, 12 Mar 2014 14:32:34 +0100 Subject: dirmngr: Detect dead keyservers and try another one. * dirmngr/ks-action.c (ks_action_resolve): Rename var for clarity. (ks_action_search, ks_action_put): Ditto. (ks_action_get): Consult only the first server which retruned some data. * dirmngr/ks-engine-hkp.c (SEND_REQUEST_RETRIES): New. (map_host): Add arg CTRL and call dirmngr_tick. (make_host_part): Add arg CTRL. (mark_host_dead): Allow the use of an URL. (handle_send_request_error): New. (ks_hkp_search, ks_hkp_get, ks_hkp_put): Mark host dead and retry on error. --- dirmngr/ks-action.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) (limited to 'dirmngr/ks-action.c') diff --git a/dirmngr/ks-action.c b/dirmngr/ks-action.c index dfeb862f6..495f7fa93 100644 --- a/dirmngr/ks-action.c +++ b/dirmngr/ks-action.c @@ -120,21 +120,21 @@ gpg_error_t ks_action_resolve (ctrl_t ctrl) { gpg_error_t err = 0; - int any = 0; + int any_server = 0; uri_item_t uri; for (uri = ctrl->keyservers; !err && uri; uri = uri->next) { if (uri->parsed_uri->is_http) { - any = 1; + any_server = 1; err = ks_hkp_resolve (ctrl, uri->parsed_uri); if (err) break; } } - if (!any) + if (!any_server) err = gpg_error (GPG_ERR_NO_KEYSERVER); return err; } @@ -146,7 +146,7 @@ gpg_error_t ks_action_search (ctrl_t ctrl, strlist_t patterns, estream_t outfp) { gpg_error_t err = 0; - int any = 0; + int any_server = 0; uri_item_t uri; estream_t infp; @@ -163,7 +163,7 @@ ks_action_search (ctrl_t ctrl, strlist_t patterns, estream_t outfp) { if (uri->parsed_uri->is_http) { - any = 1; + any_server = 1; err = ks_hkp_search (ctrl, uri->parsed_uri, patterns->d, &infp); if (!err) { @@ -174,7 +174,7 @@ ks_action_search (ctrl_t ctrl, strlist_t patterns, estream_t outfp) } } - if (!any) + if (!any_server) err = gpg_error (GPG_ERR_NO_KEYSERVER); return err; } @@ -187,7 +187,8 @@ ks_action_get (ctrl_t ctrl, strlist_t patterns, estream_t outfp) { gpg_error_t err = 0; gpg_error_t first_err = 0; - int any = 0; + int any_server = 0; + int any_data = 0; strlist_t sl; uri_item_t uri; estream_t infp; @@ -205,7 +206,7 @@ ks_action_get (ctrl_t ctrl, strlist_t patterns, estream_t outfp) { if (uri->parsed_uri->is_http) { - any = 1; + any_server = 1; for (sl = patterns; !err && sl; sl = sl->next) { err = ks_hkp_get (ctrl, uri->parsed_uri, sl->d, &infp); @@ -224,17 +225,21 @@ ks_action_get (ctrl_t ctrl, strlist_t patterns, estream_t outfp) err = copy_stream (infp, outfp); /* Reading from the keyserver should never fail, thus return this error. */ + if (!err) + any_data = 1; es_fclose (infp); infp = NULL; } } } + if (any_data) + break; /* Stop loop after a keyserver returned something. */ } - if (!any) + if (!any_server) err = gpg_error (GPG_ERR_NO_KEYSERVER); - else if (!err && first_err) - err = first_err; /* fixme: Do we really want to do that? */ + else if (!err && first_err && !any_data) + err = first_err; return err; } @@ -302,14 +307,14 @@ ks_action_put (ctrl_t ctrl, const void *data, size_t datalen) { gpg_error_t err = 0; gpg_error_t first_err = 0; - int any = 0; + int any_server = 0; uri_item_t uri; for (uri = ctrl->keyservers; !err && uri; uri = uri->next) { if (uri->parsed_uri->is_http) { - any = 1; + any_server = 1; err = ks_hkp_put (ctrl, uri->parsed_uri, data, datalen); if (err) { @@ -319,9 +324,9 @@ ks_action_put (ctrl_t ctrl, const void *data, size_t datalen) } } - if (!any) + if (!any_server) err = gpg_error (GPG_ERR_NO_KEYSERVER); else if (!err && first_err) - err = first_err; /* fixme: Do we really want to do that? */ + err = first_err; return err; } -- cgit v1.2.3