← Commit list

7ec25148c0

alhudz
alhudz
2026-06-11
SUCCESS Duration: 369s

Subject

digest: flush proxy state on proxy or credential change

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

lib/http_digest.c+24 -15
@@ -62,6 +62,27 @@ CURLcode Curl_input_digest(struct Curl_easy *data,
return Curl_auth_decode_digest_http_message(header, digest);
}
+/* Flush the Digest state if it was created for a different origin or with
+ different credentials than the ones now in use, then link the current
+ ones. */
+static void digest_flush_stale(struct digestdata *digest,
+ struct Curl_peer *peer,
+ struct Curl_creds *creds)
+{
+ bool flush = FALSE;
+ if(digest->origin && !Curl_peer_same_destination(peer, digest->origin))
+ flush = TRUE;
+ else if(digest->creds && !Curl_creds_same(creds, digest->creds))
+ flush = TRUE;
+
+ if(flush)
+ /* flush Digest state */
+ Curl_auth_digest_cleanup(digest);
+
+ Curl_peer_link(&digest->origin, peer);
+ Curl_creds_link(&digest->creds, creds);
+}
+
CURLcode Curl_output_digest(struct Curl_easy *data,
bool proxy,
const unsigned char *request,
@@ -88,29 +109,17 @@ CURLcode Curl_output_digest(struct Curl_easy *data,
return CURLE_NOT_BUILT_IN;
#else
digest = &data->state.proxydigest;
+ digest_flush_stale(digest, data->conn->http_proxy.peer,
+ data->conn->http_proxy.creds);
allocuserpwd = &data->req.hd_proxy_auth;
creds = data->conn->http_proxy.creds;
authp = &data->state.authproxy;
#endif
}
else {
- bool flush = FALSE;
DEBUGASSERT(data->conn->origin);
- if(data->state.digest.origin &&
- !Curl_peer_same_destination(data->conn->origin,
- data->state.digest.origin))
- flush = TRUE;
- else if(data->state.digest.creds &&
- !Curl_creds_same(data->state.creds, data->state.digest.creds))
- flush = TRUE;
-
- if(flush)
- /* flush host Digest state */
- Curl_auth_digest_cleanup(&data->state.digest);
-
- Curl_peer_link(&data->state.digest.origin, data->conn->origin);
- Curl_creds_link(&data->state.digest.creds, data->state.creds);
digest = &data->state.digest;
+ digest_flush_stale(digest, data->conn->origin, data->state.creds);
allocuserpwd = &data->req.hd_auth;
creds = data->state.creds;
authp = &data->state.authhost;