[prev in list] [next in list] [prev in thread] [next in thread] 

List:       apr-dev
Subject:    RE: How to convert char[] to char*?
From:       "Bennett, Tony" <Bennett.Tony () con-way ! com>
Date:       2013-05-29 22:32:29
Message-ID: 9E085D377965634187A85638358AE61101FD5049D9 () DCXPRCL017 ! cnf ! prod ! cnf ! com
[Download RAW message or body]

Just a wild guess, but you may be accessing beyond the end of the buffer...

You do: apr_status_t rv = apr_socket_recv(sock, buf, &len);

which requests "len" number of bytes, being placed into "buf".
What happens if you get "len" then try to format it using 

   apr_psprintf(r->pool, "---%s---", bufp)  

apr_psprintf() assumes bufp is a string... that is a NULL terminated string,
but you did not guarantee that "len" number of bytes in "buf"
has a NULL following it.



-----Original Message-----
From: Graf László [mailto:grafl@datatrans.hu] 
Sent: Wednesday, May 29, 2013 3:06 PM
To: Ben Reser
Cc: dev
Subject: Re: How to convert char[] to char*?

Hi Ben,

this is my code snippet and if I enable the commented line then I get an 
Apache error

AH00052: child pid 24982 exit signal Segmentation fault (11)

The snippet:

static apr_status_t do_client_task(apr_socket_t *sock, const char 
*filepath, request_rec *r)
{
     apr_status_t rv;
     const char *req_hdr = apr_pstrcat(r->pool, "GET /", filepath, " 
HTTP/1.0" CRLF_STR CRLF_STR, NULL);
     apr_size_t len = strlen(req_hdr);
     rv = apr_socket_send(sock, req_hdr, &len);
     if (rv != APR_SUCCESS) {
         return rv;
     }

     {
         char buf[BUFSIZE];
         apr_size_t len = sizeof(buf);
         char *bufp = 0;
         while (1) {
             apr_status_t rv = apr_socket_recv(sock, buf, &len);
             if (rv == APR_EOF || len == 0) {
                 break;
             }
             bufp = apr_palloc(r->pool, len);
             bufp = buf;
             ap_log_perror(APLOG_MARK, APLOG_NOTICE, 0, r->pool, 
apr_psprintf(r->pool, "---%s---", bufp));
             // ap_rputs(apr_psprintf(r->pool, "---%s---<br/>\n", bufp), r);
         }
     }
     return rv;
}


A hint would help me a lot. Thank you.

Best regards,
grafl







On 2013-05-27 23:25, Ben Reser wrote:
> On Mon, May 27, 2013 at 1:21 PM, Graf László<grafl@datatrans.hu>  wrote:
>> I have a handler module which reads the HTTP response from a remote web
>> server.
>> In this module I have a
>>
>> char[] buf
>>
>> and it contains the bytes red using apr_socket_recv. With
>>
>> ap_log_perror(APLOG_MARK, APLOG_NOTICE, 0, r->pool, apr_psprintf(r->pool,
>> "<%s>", buf));
>>
>> I can see the buf's content in the error_log but the
>>
>> ap_rputs(apr_psprintf(r->pool, "%s", (char *)buf), r);
>>
>> fails. How can I convert this array to a char* to be able to put the HTTP
>> response in the handler's request using ap_rputs?
> You haven't given enough info to answer your question.  However, this
> is really a question of how to write C so I'd point you to references
> on C.
>
> See this question on Stack Overflow:
> http://stackoverflow.com/questions/1790704/difference-between-square-brackets-and-asterisk
>
> (that question is about C++ but as far as I know there's no difference
> between the two in this case)
>
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic