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, <dan...@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 <dan...@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.html

Reply via email to