On 06/20/2012 06:17 PM, oh...@cox.net wrote:
> 
> Hi Ben and Daniel,
> 
> I must be doing wrong.  After I added code to strip the begin and end lines, 
> I get a segfault when I test.
> 
> I notice that the apr_cpystrn() doesn't include a pool parameter, so I guess 
> it's just moving the char strings in memory that already exists in the pool?
> 
> Here's the code I have thus far:
> 
>     const char * ssl_client_cert;
>     const char * ssl_client_cert_after_remove_begin;
>     const char * ssl_client_cert_after_remove_end;
>     int end_of_cert;
>     
>     printf("SSL_CLIENT_CERT=[%s]\n", apr_table_get(r->subprocess_env, 
> "SSL_CLIENT_CERT"));
>     ssl_client_cert = apr_table_get(r->subprocess_env, "SSL_CLIENT_CERT");
> 
>     printf("printf ssl_client_cert=[%s]\n", ssl_client_cert);
>     printf("ssl_client_cert + 27=[%s]\n", ssl_client_cert+27);
> 
> // SEGFAULT after here...
> 
>     end_of_cert = strlen(ssl_client_cert);
>     apr_cpystrn(ssl_client_cert_after_remove_begin, ssl_client_cert+27, 
> end_of_cert-27  );
>     end_of_cert = strlen(ssl_client_cert);
> 
>     printf("printf ssl_client_cert_after_remove_begin=[%d]-[%s]\n", 
> end_of_cert, ssl_client_cert_after_remove_begin);
>     end_of_cert = strlen(ssl_client_cert_after_remove_begin);
>     apr_cpystrn(ssl_client_cert_after_remove_end, 
> ssl_client_cert_after_remove_begin+21, end_of_cert-21);
> 
>     printf("printf ssl_client_cert_after_remove_end=[%d]-[%s]\n", 
> end_of_cert, ssl_client_cert_after_remove_end);
> 
> Thanks,
> Jim
> 
> 
apr_cpystrn expects the destination to be already allocated space of the
correct size.

You need to either allocate the space for your char* yourself via
apr_palloc or apr_pcalloc, or use apr_pstrndup instead, if you expect
httpd to handle the memory management.

With regards,
Daniel.

Reply via email to