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.