Buy commercial curl support. We
help you work out your issues, debug your libcurl applications, use the API,
port to new platforms, add new features and more. With a team lead by the
curl founder Daniel himself.
libcurl 8.18.0 returns "out-of-memory" error on set accept encoding option with all value if built with no compression
- Contemporary messages sorted: [ by date ] [ by thread ] [ by subject ] [ by author ] [ by messages with attachments ]
From: Dmitry Karpov via curl-library <curl-library_at_lists.haxx.se>
Date: Thu, 5 Mar 2026 04:57:37 +0000
Hi All,
When trying libcurl 8.18.0 in our application, I noticed that curl_easy_setopt() returns CURLE_OUT_OF_MEMORY for CURLOPT_ACCEPT_ENCODING option with “” value (all available)
libcurl was built without compression libraries (zlib etc).
curl_easy_setopt(easy, CURLOPT_ACCEPT_ENCODING, ""); // returns CURLE_OUT_OF_MEMORY
The previous releases (i.e. 8.6.0) returned CURLE_OK, and the performed transfers had "Accept-Encoding: identity" header.
I looked into the code and the issue is in the following code in \lib\setopt.c
case CURLOPT_ACCEPT_ENCODING:
...
if(ptr && !*ptr) {
ptr = Curl_get_content_encodings();
if(ptr) {
curlx_free(s->str[STRING_ENCODING]);
s->str[STRING_ENCODING] = ptr;
}
else
result = CURLE_OUT_OF_MEMORY;
return result;
}
return Curl_setstropt(&s->str[STRING_ENCODING], ptr);
The problem is that the Curl_get_content_encodings() function returns NULL if libcurl is built without compression libraries because it skips over the CONTENT_ENCODING_DEFAULT("identity"),
If we look into the Curl_get_content_encodings() code:
char *Curl_get_content_encodings(void)
{
struct dynbuf enc;
const struct Curl_cwtype * const *cep;
CURLcode result = CURLE_OK;
curlx_dyn_init(&enc, 255);
for(cep = general_unencoders; *cep && !result; cep++) {
const struct Curl_cwtype *ce = *cep;
if(!curl_strequal(ce->name, CONTENT_ENCODING_DEFAULT)) {
if(curlx_dyn_len(&enc))
result = curlx_dyn_addn(&enc, ", ", 2);
if(!result)
result = curlx_dyn_add(&enc, ce->name);
}
}
if(!result)
return curlx_dyn_ptr(&enc);
return NULL;
}
we will see that if the general_unencoders contains only " identity", then the curlx_dyn_ptr(&enc) will return NULL.
To fix the problem, we need to add "identity" to the enc buffer if no encoding strings were added to it in the for-loop, like:
if(!result) {
if (!enc.bufr)
curlx_dyn_add(&enc, CONTENT_ENCODING_DEFAULT);
return curlx_dyn_ptr(&enc);
}
Thanks,
Dmitry Karpov
Date: Thu, 5 Mar 2026 04:57:37 +0000
Hi All,
When trying libcurl 8.18.0 in our application, I noticed that curl_easy_setopt() returns CURLE_OUT_OF_MEMORY for CURLOPT_ACCEPT_ENCODING option with “” value (all available)
libcurl was built without compression libraries (zlib etc).
curl_easy_setopt(easy, CURLOPT_ACCEPT_ENCODING, ""); // returns CURLE_OUT_OF_MEMORY
The previous releases (i.e. 8.6.0) returned CURLE_OK, and the performed transfers had "Accept-Encoding: identity" header.
I looked into the code and the issue is in the following code in \lib\setopt.c
case CURLOPT_ACCEPT_ENCODING:
...
if(ptr && !*ptr) {
ptr = Curl_get_content_encodings();
if(ptr) {
curlx_free(s->str[STRING_ENCODING]);
s->str[STRING_ENCODING] = ptr;
}
else
result = CURLE_OUT_OF_MEMORY;
return result;
}
return Curl_setstropt(&s->str[STRING_ENCODING], ptr);
The problem is that the Curl_get_content_encodings() function returns NULL if libcurl is built without compression libraries because it skips over the CONTENT_ENCODING_DEFAULT("identity"),
If we look into the Curl_get_content_encodings() code:
char *Curl_get_content_encodings(void)
{
struct dynbuf enc;
const struct Curl_cwtype * const *cep;
CURLcode result = CURLE_OK;
curlx_dyn_init(&enc, 255);
for(cep = general_unencoders; *cep && !result; cep++) {
const struct Curl_cwtype *ce = *cep;
if(!curl_strequal(ce->name, CONTENT_ENCODING_DEFAULT)) {
if(curlx_dyn_len(&enc))
result = curlx_dyn_addn(&enc, ", ", 2);
if(!result)
result = curlx_dyn_add(&enc, ce->name);
}
}
if(!result)
return curlx_dyn_ptr(&enc);
return NULL;
}
we will see that if the general_unencoders contains only " identity", then the curlx_dyn_ptr(&enc) will return NULL.
To fix the problem, we need to add "identity" to the enc buffer if no encoding strings were added to it in the for-loop, like:
if(!result) {
if (!enc.bufr)
curlx_dyn_add(&enc, CONTENT_ENCODING_DEFAULT);
return curlx_dyn_ptr(&enc);
}
Thanks,
Dmitry Karpov
-- Unsubscribe: https://lists.haxx.se/mailman/listinfo/curl-library Etiquette: https://curl.se/mail/etiquette.htmlReceived on 2026-03-05