When receiving the final certificate, it need to be loaded by
ssl_sock_load_pem_into_ckch(). However this function will remove any
existing private key in the struct ckch_store.
In order to fix the issue, the ptr to the key is swapped with a NULL
ptr, and restored once the new certificate is commited.
However there is a discrepancy when there is an error in
ssl_sock_load_pem_into_ckch() fails and the pointer is lost.
This patch fixes the issue by restoring the pointer in the error path.
This must fix issue #2933.
struct http_hdr *hdrs, *hdr;
struct buffer *t1 = NULL, *t2 = NULL;
int ret = 1;
- EVP_PKEY *key;
+ EVP_PKEY *key = NULL;
hc = ctx->hc;
if (!hc)
/* restore the key */
ctx->store->data->key = key;
+ key = NULL;
if (acme_update_certificate(task, ctx, errmsg) != 0)
goto error;
ret = 0;
error:
+ if (key)
+ ctx->store->data->key = key;
free_trash_chunk(t1);
free_trash_chunk(t2);
httpclient_destroy(hc);