Buy commercial curl support from WolfSSL. 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
himself.
Re: core dump on curl function call
- Contemporary messages sorted: [ by date ] [ by thread ] [ by subject ] [ by author ] [ by messages with attachments ]
From: treesa fairy joseph via curl-library <curl-library_at_lists.haxx.se>
Date: Mon, 28 Feb 2022 13:02:06 +0530
Hello,
The below is the core dump, for the above sample program.
GNU gdb (Cavium Inc. Version 0.99 build 440) 7.8.50.20140823-cvs
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "aarch64-thunderx-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.cavium.com/support.html>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from curl_sample_type1...done.
warning: core file may not match specified executable file.
[New LWP 7954]
[New LWP 7953]
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".
Core was generated by `./curl_sample_type1'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000000000042bb48 in singlesocket (multi=0xffff740024d8,
data=0xffff740008c8) at multi.c:2806
2806 multi.c: No such file or directory.
(gdb) bt
#0 0x000000000042bb48 in singlesocket (multi=0xffff740024d8,
data=0xffff740008c8) at multi.c:2806
#1 0x00000000004280f8 in curl_multi_remove_handle
(multi=0xffff740024d8, data=0xffff740008c8)
at multi.c:809
#2 0x0000000000402cec in easy_perform (data=0xffff740008c8,
events=false) at easy.c:686
#3 0x0000000000402d20 in curl_easy_perform (data=0xffff740008c8) at easy.c:701
#4 0x0000000000401c18 in pull_one_url (url=0x7a5488) at multithread_type1.c:342
#5 0x000000000071c018 in start_thread (arg=0x0) at pthread_create.c:335
#6 0x00000000007577d8 in thread_start () at
../sysdeps/unix/sysv/linux/aarch64/clone.S:94
(gdb) full bt
Undefined command: "full". Try "help".
(gdb) bt full
#0 0x000000000042bb48 in singlesocket (multi=0xffff740024d8,
data=0xffff740008c8) at multi.c:2806
j = 0
stillused = false
socks = {-1, -1, -1, -1, -1}
i = 81326
entry = 0x0
s = 0
num = 0
curraction = 0
actions = {4427656, 0, 2077615200, 65535, 4574260}
__PRETTY_FUNCTION__ = "singlesocket"
#1 0x00000000004280f8 in curl_multi_remove_handle
(multi=0xffff740024d8, data=0xffff740008c8)
at multi.c:809
easy = 0xffff740008c8
premature = false
easy_owns_conn = false
e = 0x1600000000
#2 0x0000000000402cec in easy_perform (data=0xffff740008c8,
events=false) at easy.c:686
multi = 0xffff740024d8
mcode = CURLM_OK
result = CURLE_HTTP_RETURNED_ERROR
pipe_st = {old_pipe_act = {__sigaction_handler = {sa_handler =
0x0, sa_sigaction = 0x0},
sa_mask = {__val = {0, 9232388042942056450,
281472759358576, 281472759358576,
281472627908192, 281472627908192, 0, 281472627907776,
281472759358528, 4378944,
25769828978, 36305904856, 281472759358576,
281472627902664, 281472759358528,
4378924}}, sa_flags = 0, sa_restorer = 0x0}, no_signal = false}
#3 0x0000000000402d20 in curl_easy_perform (data=0xffff740008c8) at easy.c:701
No locals.
#4 0x0000000000401c18 in pull_one_url (url=0x7a5488) at multithread_type1.c:342
header_chunk = {memory = 0x0, size = 0}
slist = 0xffff740022e8
msg = 0x7a5678 "Field=1&Field=2&Field=3"
curl = 0xffff740008c8
chunk = {memory = 0x0, size = 0}
str = 0x0
arr = '\000' <repeats 511 times>
token = 0x0
---Type <return> to continue, or q <return> to quit---
On Mon, Feb 28, 2022 at 12:57 PM treesa fairy joseph <treesafj_at_gmail.com> wrote:
>
> curl-library <curl-library_at_lists.haxx.se>
>
> On Mon, Feb 28, 2022 at 12:12 PM treesa fairy joseph <treesafj_at_gmail.com> wrote:
> >
> > Hello Daniel,
> > Could not come back to this issue, for a while. Right now, back on this problem.
> > The below shows the sample program which also generates the seg flt
> >
> >
> >
> > /***************************************************************************
> > * _ _ ____ _
> > * Project ___| | | | _ \| |
> > * / __| | | | |_) | |
> > * | (__| |_| | _ <| |___
> > * \___|\___/|_| \_\_____|
> > *
> > * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel_at_haxx.se>, et al.
> > *
> > * This software is licensed as described in the file COPYING, which
> > * you should have received as part of this distribution. The terms
> > * are also available at https://curl.haxx.se/docs/copyright.html.
> > *
> > * You may opt to use, copy, modify, merge, publish, distribute and/or sell
> > * copies of the Software, and permit persons to whom the Software is
> > * furnished to do so, under the terms of the COPYING file.
> > *
> > * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
> > * KIND, either express or implied.
> > *
> > ***************************************************************************/
> > /* <DESC>
> > * A multi-threaded example that uses pthreads to fetch several files at once
> > * </DESC>
> > */
> >
> > #include <stdio.h>
> > #include <pthread.h>
> > #include <curl/curl.h>
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <string.h>
> > #include <curl/curl.h>
> > #include <openssl/x509v3.h>
> > #include <openssl/x509_vfy.h>
> > #include <openssl/crypto.h>
> > #include <openssl/lhash.h>
> > #include <openssl/objects.h>
> > #include <openssl/err.h>
> > #include <openssl/evp.h>
> > #include <openssl/x509.h>
> > #include <openssl/pkcs12.h>
> > #include <openssl/bio.h>
> > #include <openssl/ssl.h>
> > #include <openssl/ossl_typ.h>
> > //#include <crypto/internal/x509_int.h>
> > #include <crypto/include/internal/x509_int.h>
> >
> > #define NUMT 1
> > typedef struct MemoryStruct
> > {
> > unsigned char *memory;
> > size_t size;
> > } memory_struct_t;
> > #define ZERO_NULL 0
> >
> >
> > typedef struct sslctxparm_st {
> > unsigned char *p12file;
> > const char *pst;
> > PKCS12 *p12;
> > EVP_PKEY *pkey;
> > X509 *usercert;
> > STACK_OF(X509) * ca;
> > CURL *curl;
> > BIO *errorbio;
> > int accesstype;
> > int verbose;
> >
> > } sslctxparm;
> >
> > /*
> > List of URLs to fetch.
> >
> > If you intend to use a SSL-based protocol here you might need to setup TLS
> > library mutex callbacks as described here:
> >
> > https://curl.haxx.se/libcurl/c/threadsafe.html
> >
> > */
> >
> > /********************************************************************************
> > * Function Name : ipr_cwmp_WriteMemoryCallback
> > *
> > * Description :
> > *
> > *
> > * Returns :
> > *
> > *******************************************************************************/
> >
> > size_t ipr_cwmp_WriteMemoryCallback(void *contents,
> > size_t size,
> > size_t nmemb,
> > void *userp)
> > {
> > size_t realsize = size * nmemb;
> > struct MemoryStruct *mem = (struct MemoryStruct *)userp;
> > mem->memory = realloc(mem->memory, mem->size + realsize + 1 );
> > if (mem->memory == NULL)
> > {
> > /* out of memory! */
> > printf("Exiting the function ipr_cwmp_WriteMemoryCallback 101 \n");
> > exit(1);
> > }
> > memcpy(&(mem->memory[mem->size]), contents, realsize);
> > mem->size += realsize;
> > mem->memory[mem->size] = 0;
> > printf("Exiting the function ipr_cwmp_WriteMemoryCallback 100 \n");
> > return realsize;
> > }
> >
> >
> > /* This is an application verification call back, it does not
> > perform any addition verification but tries to find a URL
> > in the presented certificate. If found, this will become
> > the URL to be used in the POST.
> > */
> > static int ssl_app_verify_callback(X509_STORE_CTX *ctx, void *arg)
> > {
> > sslctxparm * p = (sslctxparm *) arg;
> > int ok;
> >
> > if(p->verbose > 2)
> > BIO_printf(p->errorbio, "entering ssl_app_verify_callback\n");
> >
> > ok = X509_verify_cert(ctx);
> > if(ok && ctx->cert) {
> > unsigned char *accessinfo;
> > if(p->verbose > 1)
> > X509_print_ex(p->errorbio, ctx->cert, 0, 0);
> >
> > // accessinfo = my_get_ext(ctx->cert, p->accesstype, NID_sinfo_access);
> > // if(accessinfo) {
> > // if(p->verbose)
> > // BIO_printf(p->errorbio, "Setting URL from SIA to:
> > %s\n", accessinfo);
> > //
> > // curl_easy_setopt(p->curl, CURLOPT_URL, accessinfo);
> > // }
> > // else if(accessinfo = my_get_ext(ctx->cert, p->accesstype,
> > // NID_info_access)) {
> > // if(p->verbose)
> > // BIO_printf(p->errorbio, "Setting URL from AIA to:
> > %s\n", accessinfo);
> > //
> > // curl_easy_setopt(p->curl, CURLOPT_URL, accessinfo);
> > // }
> > }
> > if(p->verbose > 2)
> > BIO_printf(p->errorbio, "leaving ssl_app_verify_callback with
> > %d\n", ok);
> >
> > return ok;
> > }
> >
> > /*************************************************************************************************
> > * Function Name : ipr_cwmp_sslctxfun
> > *
> > * Description : This is an example of an curl SSL initialisation
> > call back. The callback sets:
> > * a private key and certificate
> > * a trusted ca certificate
> > * a preferred cipherlist
> > * an application verification callback (the function above)
> > * Returns : CURLcode
> > *
> > ***************************************************************************************************/
> >
> > static CURLcode ipr_cwmp_sslctxfun(void* sslctx, void* parm)
> > {
> > SSL_CTX* ctx = (SSL_CTX *) sslctx ;
> > SSL_CTX_set_cert_verify_callback(ctx, ssl_app_verify_callback, parm);
> > //SSL_CTX_set_cert_verify_callback(ctx,
> > ipr_cwmp_ssl_app_verify_callback, parm);
> > //changed this to supress the warning for ssl prototype of this function
> > return CURLE_OK ;
> > }
> > /***************************************************************************************************/
> >
> >
> > const char * const urls[NUMT]= {
> > "https://192.168.66.116:8443/acs/AcsServlet"
> > //"https://192.168.16.233:8443/acs/AcsServlet",
> > //"ftp://cool.haxx.se/",
> > //"https://www.cag.se/",
> > //"www.haxx.se"
> > };
> > //curl_easy_setopt(curl, CURLOPT_SSLCERT,"client-2048.crt");
> > //curl_easy_setopt(curl, CURLOPT_SSLKEY,"client-2048.key");
> >
> > static void *pull_one_url(void *url)
> > {
> > struct MemoryStruct header_chunk = {0};
> > struct curl_slist *slist = NULL;
> > static const char *msg = "Field=1&Field=2&Field=3";
> > CURL *curl;
> > struct MemoryStruct chunk = {0};
> > /*SPR 17929 changes start*/
> > char * str = NULL;
> > char arr[512];
> > memset(arr, '\0', 512);
> > char * token = NULL;
> > /*SPR 17929 changes end*/
> >
> > chunk.memory = NULL; /* will be grown as needed by the realloc above */
> > chunk.size = 0;
> >
> > curl = curl_easy_init();
> > curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
> > //curl_easy_setopt(curl,CURLOPT_RESOLVE, host);
> > curl_easy_setopt(curl, CURLOPT_URL, url);
> > curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L);
> > /* get verbose debug output please */
> > curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
> > curl_easy_setopt(curl, CURLOPT_POST, 1);
> > curl_easy_setopt(curl, CURLOPT_POSTFIELDS,(char *)msg);
> >
> > slist = NULL;
> > slist = curl_slist_append(NULL, "Content-Type: text/xml;
> > UInt8set=utf-8\nSOAPAction:");
> > curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt");
> > curl_easy_setopt(curl, CURLOPT_COOKIE, "cookie.txt");
> > if (header_chunk.size)
> > {
> > str = strstr((char *)header_chunk.memory, "JSESSIONID=");
> > printf("Extracted JSESSIONID \n");
> > }
> >
> > if ((header_chunk.size) && (str!= NULL))
> > {
> > token = strtok(str + 11, ";");
> > memset(arr,0x00,512);
> > sprintf(arr, "Cookie: JSESSIONID=%s",token);
> > printf("Token has value %s \n",arr);
> > slist = curl_slist_append(slist,arr);
> > printf("Added httpHeader \n");
> > }
> > curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
> > if(0 == header_chunk.size)
> > {
> > curl_easy_setopt(curl, CURLOPT_HEADERDATA,(void *)&header_chunk);
> > }
> >
> > curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, ipr_cwmp_sslctxfun);
> > //curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun);
> > curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ipr_cwmp_WriteMemoryCallback);
> > /* we pass our 'chunk' struct to the callback function */
> > //coverity fix
> > curl_easy_setopt(curl, CURLOPT_WRITEDATA,(void *)&chunk);
> > curl_easy_setopt(curl, CURLOPT_SSLKEY,"./tls_files/enodeb-new.key.pem");
> > curl_easy_setopt(curl, CURLOPT_SSLCERT,"./tls_files/enodeb.cert.pem");
> > //curl_easy_setopt(curl, CURLOPT_SSLKEY, g_ipr_cwmp_pClientKeyFile);
> > /* set the file with the certs vaildating the server */
> > //curl_easy_setopt(curl, CURLOPT_SSLCERT, g_ipr_cwmp_pClientCertFile);
> > /* disconnect if we can't validate server's cert */
> > curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,1L);
> > curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
> > curl_easy_setopt(curl,CURLOPT_CAINFO,"./tls_files/ca-chain.cert.pem");
> > curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1L);
> > curl_easy_setopt(curl,CURLOPT_MAXREDIRS,5L);
> > curl_easy_setopt(curl,CURLOPT_POSTREDIR,CURL_REDIR_POST_ALL);
> > curl_easy_setopt(curl, CURLOPT_POST, 1);
> >
> > //coverity fix
> > //curl_easy_setopt(curl, CURLOPT_POSTFIELDS,(char *)msg);
> > //curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt");
> > //curl_easy_setopt(curl, CURLOPT_COOKIE, "cookie.txt");
> > curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST);
> > curl_easy_setopt (curl, CURLOPT_USERNAME
> > ,"BaseStationClass-002488-1114B00001");
> > curl_easy_setopt (curl, CURLOPT_PASSWORD ,"abcd1234");
> > // curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION,
> > ipr_cwmp_sslctxfun) ;
> >
> >
> >
> > curl_easy_perform(curl); /* ignores error */
> > curl_easy_cleanup(curl);
> >
> > return NULL;
> > }
> >
> >
> > /*
> > int pthread_create(pthread_t *new_thread_ID,
> > const pthread_attr_t *attr,
> > void * (*start_func)(void *), void *arg);
> > */
> >
> > int main(int argc, char **argv)
> > {
> > pthread_t tid[NUMT];
> > int i;
> >
> > /* Must initialize libcurl before any threads are started */
> > curl_global_init(CURL_GLOBAL_ALL);
> >
> > for(i = 0; i< NUMT; i++) {
> > int error = pthread_create(&tid[i],
> > NULL, /* default attributes please */
> > pull_one_url,
> > (void *)urls[i]);
> > if(0 != error)
> > fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
> > else
> > fprintf(stderr, "Thread %d, gets %s\n", i, urls[i]);
> > }
> >
> > /* now wait for all threads to terminate */
> > for(i = 0; i< NUMT; i++) {
> > pthread_join(tid[i], NULL);
> > fprintf(stderr, "Thread %d terminated\n", i);
> > }
> > curl_global_cleanup();
> > return 0;
> > }
> >
> >
> > On Fri, Oct 1, 2021 at 8:29 PM Daniel Stenberg <daniel_at_haxx.se> wrote:
> > >
> > > On Fri, 1 Oct 2021, treesa fairy joseph wrote:
> > >
> > > > #0 0x00000000005377c4 in Curl_hash_clean_with_criterium (h=0xffff7c0a4d50,
> > > > user=0xffff8b28d970,
> > > > comp=0x4ba604 <hostcache_timestamp_remove>) at hash.c:243
> > > > 243 hash.c: No such file or directory.
> > > > (gdb) bt
> > > > #0 0x00000000005377c4 in Curl_hash_clean_with_criterium (h=0xffff7c0a4d50,
> > > > user=0xffff8b28d970,
> > > > comp=0x4ba604 <hostcache_timestamp_remove>) at hash.c:243
> > >
> > > This issue shows the typical signs of a threading problem. Make sure that
> > > your application and threading follow the advice here:
> > >
> > > https://curl.se/libcurl/c/threadsafe.html
> > >
> > > In particular the dont-use-the-same-handle-twice rule.
> > >
> > > If that doesn't help, then I'd advice you to start trying to create a separate
> > > stand-alone example code that reproduces the problem that you can share with
> > > us.
> > >
> > > --
> > >
> > > / daniel.haxx.se
> > > | Commercial curl support up to 24x7 is available!
> > > | Private help, bug fixes, support, ports, new features
> > > | https://curl.se/support.html
Date: Mon, 28 Feb 2022 13:02:06 +0530
Hello,
The below is the core dump, for the above sample program.
GNU gdb (Cavium Inc. Version 0.99 build 440) 7.8.50.20140823-cvs
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "aarch64-thunderx-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.cavium.com/support.html>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from curl_sample_type1...done.
warning: core file may not match specified executable file.
[New LWP 7954]
[New LWP 7953]
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".
Core was generated by `./curl_sample_type1'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000000000042bb48 in singlesocket (multi=0xffff740024d8,
data=0xffff740008c8) at multi.c:2806
2806 multi.c: No such file or directory.
(gdb) bt
#0 0x000000000042bb48 in singlesocket (multi=0xffff740024d8,
data=0xffff740008c8) at multi.c:2806
#1 0x00000000004280f8 in curl_multi_remove_handle
(multi=0xffff740024d8, data=0xffff740008c8)
at multi.c:809
#2 0x0000000000402cec in easy_perform (data=0xffff740008c8,
events=false) at easy.c:686
#3 0x0000000000402d20 in curl_easy_perform (data=0xffff740008c8) at easy.c:701
#4 0x0000000000401c18 in pull_one_url (url=0x7a5488) at multithread_type1.c:342
#5 0x000000000071c018 in start_thread (arg=0x0) at pthread_create.c:335
#6 0x00000000007577d8 in thread_start () at
../sysdeps/unix/sysv/linux/aarch64/clone.S:94
(gdb) full bt
Undefined command: "full". Try "help".
(gdb) bt full
#0 0x000000000042bb48 in singlesocket (multi=0xffff740024d8,
data=0xffff740008c8) at multi.c:2806
j = 0
stillused = false
socks = {-1, -1, -1, -1, -1}
i = 81326
entry = 0x0
s = 0
num = 0
curraction = 0
actions = {4427656, 0, 2077615200, 65535, 4574260}
__PRETTY_FUNCTION__ = "singlesocket"
#1 0x00000000004280f8 in curl_multi_remove_handle
(multi=0xffff740024d8, data=0xffff740008c8)
at multi.c:809
easy = 0xffff740008c8
premature = false
easy_owns_conn = false
e = 0x1600000000
#2 0x0000000000402cec in easy_perform (data=0xffff740008c8,
events=false) at easy.c:686
multi = 0xffff740024d8
mcode = CURLM_OK
result = CURLE_HTTP_RETURNED_ERROR
pipe_st = {old_pipe_act = {__sigaction_handler = {sa_handler =
0x0, sa_sigaction = 0x0},
sa_mask = {__val = {0, 9232388042942056450,
281472759358576, 281472759358576,
281472627908192, 281472627908192, 0, 281472627907776,
281472759358528, 4378944,
25769828978, 36305904856, 281472759358576,
281472627902664, 281472759358528,
4378924}}, sa_flags = 0, sa_restorer = 0x0}, no_signal = false}
#3 0x0000000000402d20 in curl_easy_perform (data=0xffff740008c8) at easy.c:701
No locals.
#4 0x0000000000401c18 in pull_one_url (url=0x7a5488) at multithread_type1.c:342
header_chunk = {memory = 0x0, size = 0}
slist = 0xffff740022e8
msg = 0x7a5678 "Field=1&Field=2&Field=3"
curl = 0xffff740008c8
chunk = {memory = 0x0, size = 0}
str = 0x0
arr = '\000' <repeats 511 times>
token = 0x0
---Type <return> to continue, or q <return> to quit---
On Mon, Feb 28, 2022 at 12:57 PM treesa fairy joseph <treesafj_at_gmail.com> wrote:
>
> curl-library <curl-library_at_lists.haxx.se>
>
> On Mon, Feb 28, 2022 at 12:12 PM treesa fairy joseph <treesafj_at_gmail.com> wrote:
> >
> > Hello Daniel,
> > Could not come back to this issue, for a while. Right now, back on this problem.
> > The below shows the sample program which also generates the seg flt
> >
> >
> >
> > /***************************************************************************
> > * _ _ ____ _
> > * Project ___| | | | _ \| |
> > * / __| | | | |_) | |
> > * | (__| |_| | _ <| |___
> > * \___|\___/|_| \_\_____|
> > *
> > * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel_at_haxx.se>, et al.
> > *
> > * This software is licensed as described in the file COPYING, which
> > * you should have received as part of this distribution. The terms
> > * are also available at https://curl.haxx.se/docs/copyright.html.
> > *
> > * You may opt to use, copy, modify, merge, publish, distribute and/or sell
> > * copies of the Software, and permit persons to whom the Software is
> > * furnished to do so, under the terms of the COPYING file.
> > *
> > * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
> > * KIND, either express or implied.
> > *
> > ***************************************************************************/
> > /* <DESC>
> > * A multi-threaded example that uses pthreads to fetch several files at once
> > * </DESC>
> > */
> >
> > #include <stdio.h>
> > #include <pthread.h>
> > #include <curl/curl.h>
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <string.h>
> > #include <curl/curl.h>
> > #include <openssl/x509v3.h>
> > #include <openssl/x509_vfy.h>
> > #include <openssl/crypto.h>
> > #include <openssl/lhash.h>
> > #include <openssl/objects.h>
> > #include <openssl/err.h>
> > #include <openssl/evp.h>
> > #include <openssl/x509.h>
> > #include <openssl/pkcs12.h>
> > #include <openssl/bio.h>
> > #include <openssl/ssl.h>
> > #include <openssl/ossl_typ.h>
> > //#include <crypto/internal/x509_int.h>
> > #include <crypto/include/internal/x509_int.h>
> >
> > #define NUMT 1
> > typedef struct MemoryStruct
> > {
> > unsigned char *memory;
> > size_t size;
> > } memory_struct_t;
> > #define ZERO_NULL 0
> >
> >
> > typedef struct sslctxparm_st {
> > unsigned char *p12file;
> > const char *pst;
> > PKCS12 *p12;
> > EVP_PKEY *pkey;
> > X509 *usercert;
> > STACK_OF(X509) * ca;
> > CURL *curl;
> > BIO *errorbio;
> > int accesstype;
> > int verbose;
> >
> > } sslctxparm;
> >
> > /*
> > List of URLs to fetch.
> >
> > If you intend to use a SSL-based protocol here you might need to setup TLS
> > library mutex callbacks as described here:
> >
> > https://curl.haxx.se/libcurl/c/threadsafe.html
> >
> > */
> >
> > /********************************************************************************
> > * Function Name : ipr_cwmp_WriteMemoryCallback
> > *
> > * Description :
> > *
> > *
> > * Returns :
> > *
> > *******************************************************************************/
> >
> > size_t ipr_cwmp_WriteMemoryCallback(void *contents,
> > size_t size,
> > size_t nmemb,
> > void *userp)
> > {
> > size_t realsize = size * nmemb;
> > struct MemoryStruct *mem = (struct MemoryStruct *)userp;
> > mem->memory = realloc(mem->memory, mem->size + realsize + 1 );
> > if (mem->memory == NULL)
> > {
> > /* out of memory! */
> > printf("Exiting the function ipr_cwmp_WriteMemoryCallback 101 \n");
> > exit(1);
> > }
> > memcpy(&(mem->memory[mem->size]), contents, realsize);
> > mem->size += realsize;
> > mem->memory[mem->size] = 0;
> > printf("Exiting the function ipr_cwmp_WriteMemoryCallback 100 \n");
> > return realsize;
> > }
> >
> >
> > /* This is an application verification call back, it does not
> > perform any addition verification but tries to find a URL
> > in the presented certificate. If found, this will become
> > the URL to be used in the POST.
> > */
> > static int ssl_app_verify_callback(X509_STORE_CTX *ctx, void *arg)
> > {
> > sslctxparm * p = (sslctxparm *) arg;
> > int ok;
> >
> > if(p->verbose > 2)
> > BIO_printf(p->errorbio, "entering ssl_app_verify_callback\n");
> >
> > ok = X509_verify_cert(ctx);
> > if(ok && ctx->cert) {
> > unsigned char *accessinfo;
> > if(p->verbose > 1)
> > X509_print_ex(p->errorbio, ctx->cert, 0, 0);
> >
> > // accessinfo = my_get_ext(ctx->cert, p->accesstype, NID_sinfo_access);
> > // if(accessinfo) {
> > // if(p->verbose)
> > // BIO_printf(p->errorbio, "Setting URL from SIA to:
> > %s\n", accessinfo);
> > //
> > // curl_easy_setopt(p->curl, CURLOPT_URL, accessinfo);
> > // }
> > // else if(accessinfo = my_get_ext(ctx->cert, p->accesstype,
> > // NID_info_access)) {
> > // if(p->verbose)
> > // BIO_printf(p->errorbio, "Setting URL from AIA to:
> > %s\n", accessinfo);
> > //
> > // curl_easy_setopt(p->curl, CURLOPT_URL, accessinfo);
> > // }
> > }
> > if(p->verbose > 2)
> > BIO_printf(p->errorbio, "leaving ssl_app_verify_callback with
> > %d\n", ok);
> >
> > return ok;
> > }
> >
> > /*************************************************************************************************
> > * Function Name : ipr_cwmp_sslctxfun
> > *
> > * Description : This is an example of an curl SSL initialisation
> > call back. The callback sets:
> > * a private key and certificate
> > * a trusted ca certificate
> > * a preferred cipherlist
> > * an application verification callback (the function above)
> > * Returns : CURLcode
> > *
> > ***************************************************************************************************/
> >
> > static CURLcode ipr_cwmp_sslctxfun(void* sslctx, void* parm)
> > {
> > SSL_CTX* ctx = (SSL_CTX *) sslctx ;
> > SSL_CTX_set_cert_verify_callback(ctx, ssl_app_verify_callback, parm);
> > //SSL_CTX_set_cert_verify_callback(ctx,
> > ipr_cwmp_ssl_app_verify_callback, parm);
> > //changed this to supress the warning for ssl prototype of this function
> > return CURLE_OK ;
> > }
> > /***************************************************************************************************/
> >
> >
> > const char * const urls[NUMT]= {
> > "https://192.168.66.116:8443/acs/AcsServlet"
> > //"https://192.168.16.233:8443/acs/AcsServlet",
> > //"ftp://cool.haxx.se/",
> > //"https://www.cag.se/",
> > //"www.haxx.se"
> > };
> > //curl_easy_setopt(curl, CURLOPT_SSLCERT,"client-2048.crt");
> > //curl_easy_setopt(curl, CURLOPT_SSLKEY,"client-2048.key");
> >
> > static void *pull_one_url(void *url)
> > {
> > struct MemoryStruct header_chunk = {0};
> > struct curl_slist *slist = NULL;
> > static const char *msg = "Field=1&Field=2&Field=3";
> > CURL *curl;
> > struct MemoryStruct chunk = {0};
> > /*SPR 17929 changes start*/
> > char * str = NULL;
> > char arr[512];
> > memset(arr, '\0', 512);
> > char * token = NULL;
> > /*SPR 17929 changes end*/
> >
> > chunk.memory = NULL; /* will be grown as needed by the realloc above */
> > chunk.size = 0;
> >
> > curl = curl_easy_init();
> > curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
> > //curl_easy_setopt(curl,CURLOPT_RESOLVE, host);
> > curl_easy_setopt(curl, CURLOPT_URL, url);
> > curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L);
> > /* get verbose debug output please */
> > curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
> > curl_easy_setopt(curl, CURLOPT_POST, 1);
> > curl_easy_setopt(curl, CURLOPT_POSTFIELDS,(char *)msg);
> >
> > slist = NULL;
> > slist = curl_slist_append(NULL, "Content-Type: text/xml;
> > UInt8set=utf-8\nSOAPAction:");
> > curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt");
> > curl_easy_setopt(curl, CURLOPT_COOKIE, "cookie.txt");
> > if (header_chunk.size)
> > {
> > str = strstr((char *)header_chunk.memory, "JSESSIONID=");
> > printf("Extracted JSESSIONID \n");
> > }
> >
> > if ((header_chunk.size) && (str!= NULL))
> > {
> > token = strtok(str + 11, ";");
> > memset(arr,0x00,512);
> > sprintf(arr, "Cookie: JSESSIONID=%s",token);
> > printf("Token has value %s \n",arr);
> > slist = curl_slist_append(slist,arr);
> > printf("Added httpHeader \n");
> > }
> > curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
> > if(0 == header_chunk.size)
> > {
> > curl_easy_setopt(curl, CURLOPT_HEADERDATA,(void *)&header_chunk);
> > }
> >
> > curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, ipr_cwmp_sslctxfun);
> > //curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun);
> > curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ipr_cwmp_WriteMemoryCallback);
> > /* we pass our 'chunk' struct to the callback function */
> > //coverity fix
> > curl_easy_setopt(curl, CURLOPT_WRITEDATA,(void *)&chunk);
> > curl_easy_setopt(curl, CURLOPT_SSLKEY,"./tls_files/enodeb-new.key.pem");
> > curl_easy_setopt(curl, CURLOPT_SSLCERT,"./tls_files/enodeb.cert.pem");
> > //curl_easy_setopt(curl, CURLOPT_SSLKEY, g_ipr_cwmp_pClientKeyFile);
> > /* set the file with the certs vaildating the server */
> > //curl_easy_setopt(curl, CURLOPT_SSLCERT, g_ipr_cwmp_pClientCertFile);
> > /* disconnect if we can't validate server's cert */
> > curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,1L);
> > curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
> > curl_easy_setopt(curl,CURLOPT_CAINFO,"./tls_files/ca-chain.cert.pem");
> > curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1L);
> > curl_easy_setopt(curl,CURLOPT_MAXREDIRS,5L);
> > curl_easy_setopt(curl,CURLOPT_POSTREDIR,CURL_REDIR_POST_ALL);
> > curl_easy_setopt(curl, CURLOPT_POST, 1);
> >
> > //coverity fix
> > //curl_easy_setopt(curl, CURLOPT_POSTFIELDS,(char *)msg);
> > //curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt");
> > //curl_easy_setopt(curl, CURLOPT_COOKIE, "cookie.txt");
> > curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST);
> > curl_easy_setopt (curl, CURLOPT_USERNAME
> > ,"BaseStationClass-002488-1114B00001");
> > curl_easy_setopt (curl, CURLOPT_PASSWORD ,"abcd1234");
> > // curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION,
> > ipr_cwmp_sslctxfun) ;
> >
> >
> >
> > curl_easy_perform(curl); /* ignores error */
> > curl_easy_cleanup(curl);
> >
> > return NULL;
> > }
> >
> >
> > /*
> > int pthread_create(pthread_t *new_thread_ID,
> > const pthread_attr_t *attr,
> > void * (*start_func)(void *), void *arg);
> > */
> >
> > int main(int argc, char **argv)
> > {
> > pthread_t tid[NUMT];
> > int i;
> >
> > /* Must initialize libcurl before any threads are started */
> > curl_global_init(CURL_GLOBAL_ALL);
> >
> > for(i = 0; i< NUMT; i++) {
> > int error = pthread_create(&tid[i],
> > NULL, /* default attributes please */
> > pull_one_url,
> > (void *)urls[i]);
> > if(0 != error)
> > fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
> > else
> > fprintf(stderr, "Thread %d, gets %s\n", i, urls[i]);
> > }
> >
> > /* now wait for all threads to terminate */
> > for(i = 0; i< NUMT; i++) {
> > pthread_join(tid[i], NULL);
> > fprintf(stderr, "Thread %d terminated\n", i);
> > }
> > curl_global_cleanup();
> > return 0;
> > }
> >
> >
> > On Fri, Oct 1, 2021 at 8:29 PM Daniel Stenberg <daniel_at_haxx.se> wrote:
> > >
> > > On Fri, 1 Oct 2021, treesa fairy joseph wrote:
> > >
> > > > #0 0x00000000005377c4 in Curl_hash_clean_with_criterium (h=0xffff7c0a4d50,
> > > > user=0xffff8b28d970,
> > > > comp=0x4ba604 <hostcache_timestamp_remove>) at hash.c:243
> > > > 243 hash.c: No such file or directory.
> > > > (gdb) bt
> > > > #0 0x00000000005377c4 in Curl_hash_clean_with_criterium (h=0xffff7c0a4d50,
> > > > user=0xffff8b28d970,
> > > > comp=0x4ba604 <hostcache_timestamp_remove>) at hash.c:243
> > >
> > > This issue shows the typical signs of a threading problem. Make sure that
> > > your application and threading follow the advice here:
> > >
> > > https://curl.se/libcurl/c/threadsafe.html
> > >
> > > In particular the dont-use-the-same-handle-twice rule.
> > >
> > > If that doesn't help, then I'd advice you to start trying to create a separate
> > > stand-alone example code that reproduces the problem that you can share with
> > > us.
> > >
> > > --
> > >
> > > / daniel.haxx.se
> > > | Commercial curl support up to 24x7 is available!
> > > | Private help, bug fixes, support, ports, new features
> > > | https://curl.se/support.html
-- Unsubscribe: https://lists.haxx.se/listinfo/curl-library Etiquette: https://curl.haxx.se/mail/etiquette.htmlReceived on 2022-02-28