From e45a528809abfd9248d66a5e054d2e9f338b4038 Mon Sep 17 00:00:00 2001 From: Konrad Kleine Date: Wed, 26 Feb 2020 10:00:43 -0500 Subject: [PATCH] debuginfod: file:// URLs: handle curl resp. code When file:// is used for DEBUGINFOD_URLS, then the response code for a successful server query is 0 and not 200. Using file:// can be helpful when you want to test your debuginfod-client integration against a mocked file tree that mimics the HTTP URLs from the debuginfod server. This way you don't have to run the debuginfod server at all. Fixes https://sourceware.org/bugzilla/show_bug.cgi?id=25600 Signed-off-by: Konrad Kleine --- ChangeLog | 8 ++++++++ debuginfod/debuginfod-client.c | 36 ++++++++++++++++++++++------------ tests/run-debuginfod-find.sh | 18 ++++++++++++++++- 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 96d61403..4260dd72 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2020-02-26 Konrad Kleine + + * debuginfod/debuginfod-client.c: handle curl's response code correctly when + DEBUGINFOD_URLS begin with file:// + + * tests/run-debuginfod-find.sh: added tests for DEBUGINFOD_URLS beginning + with "file://" + 2020-02-03 Frank Ch. Eigler * configure.ac: Tolerate CXX= for debuginfod configuration. diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c index 186aa90a..4ab54593 100644 --- a/debuginfod/debuginfod-client.c +++ b/debuginfod/debuginfod-client.c @@ -716,20 +716,30 @@ debuginfod_query_server (debuginfod_client *c, else { /* Query completed without an error. Confirm that the - response code is 200 and set verified_handle. */ - long resp_code = 500; - CURLcode curl_res; - - curl_res = curl_easy_getinfo(target_handle, - CURLINFO_RESPONSE_CODE, - &resp_code); - - if (curl_res == CURLE_OK - && resp_code == 200 - && msg->easy_handle != NULL) + response code is 200 when using HTTP/HTTPS and 0 when using + file:// and set verified_handle. */ + + if (msg->easy_handle != NULL) { - verified_handle = msg->easy_handle; - break; + char *effective_url = NULL; + long resp_code = 500; + CURLcode ok1 = curl_easy_getinfo(target_handle, CURLINFO_EFFECTIVE_URL, &effective_url); + CURLcode ok2 = curl_easy_getinfo(target_handle, CURLINFO_RESPONSE_CODE, &resp_code); + if(ok1 == CURLE_OK && ok2 == CURLE_OK && effective_url) + { + if (strncmp(effective_url, "http", 4) == 0) + if(resp_code == 200) + { + verified_handle = msg->easy_handle; + break; + } + if (strncmp(effective_url, "file", 4) == 0) + if(resp_code == 0) + { + verified_handle = msg->easy_handle; + break; + } + } } } } diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh index 2964e7c0..0facc555 100755 --- a/tests/run-debuginfod-find.sh +++ b/tests/run-debuginfod-find.sh @@ -40,7 +40,7 @@ cleanup() if [ $PID2 -ne 0 ]; then kill $PID2; wait $PID2; fi if [ $PID3 -ne 0 ]; then kill $PID3; wait $PID3; fi - rm -rf F R D L Z ${PWD}/.client_cache* + rm -rf F R D L Z ${PWD}/mocktree ${PWD}/.client_cache* exit_cleanup } @@ -396,4 +396,20 @@ kill -int $PID3 wait $PID3 PID3=0 +######################################################################## +# Test fetching a file using file:// . No debuginfod server needs to be run for +# this test. +local_dir=${PWD}/mocktree/buildid/aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd/source/my/path +mkdir -p ${local_dir} +echo "int main() { return 0; }" > ${local_dir}/main.c + +# first test that is doesn't work, when no DEBUGINFOD_URLS is set +DEBUGINFOD_URLS="" +testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c && false || true + +# Now test is with proper DEBUGINFOD_URLS +DEBUGINFOD_URLS="file://${PWD}/mocktree/" +filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c` +cmp $filename ${local_dir}/main.c + exit 0 -- 2.24.1