Call ERR_clear_error() before while loop and call
ERR_get_error_line_data in a loop till it returns 0 inside
SSL_ERROR_SYSCALL case. This may give you some idea on what went
wrong.

JB

On 8/11/05, Michael <[EMAIL PROTECTED]> wrote:
> On 8/11/05, David Schwartz <[EMAIL PROTECTED]> wrote:
> 
> <snip>
> 
> > > My code uses blocking sockets, has the SSL_CTX
> > > SSL_MODE_ENABLE_PARTIAL_WRITE option set and loops on the ssl_read but
> > > the socket is closed after the first 32k is sent.
> > >
> > > Why, if a message block size is 16k, does the first 32k of a message
> > > get written/read, then the socket dropped?
> 
> <snip>
> 
> >         Give us example code or more detailed information about what you 
> > mean by
> > "the socket dropped" and how you determined that.
> >         My bet is simply that there's a bug in your code. With non-blocking
> > sockets, you have to test the return value of SSL_read and properly handle
> > partial or failed sends. You may get a failed send if there was insufficient
> > space to fit a single block of protocol data (or if protocol data was sent
> > that corresponds to zero bytes of application data!). You may get a partial
> > send.
> 
> Thanks for your reply David - I think you're probably right about my code! ;-)
> 
> Upon your suggestion I added some more cases to test the return code
> of ssl_write and found that I am getting a SSL_ERROR_SYSCALL after the
> first 32 bytes.
> 
> Here is is the code. As mentioned before, I have the SSL_CTX set with
> partial writes enabled, the main write loop is as follows (for
> clarity,I've removed all the tests of ssl_write other than those that
> get called).
> 
> --start------------
> char error_str[BUFF_SIZE]
> char out_buf[BUFFSIZE];
> int sent_bytes=0;
> int offset=0;
> int bytes_to_send = <length of data in out_buf>
> 
> fprintf(stderr, "- Attempting to write %d bytes\n", bytes_to_send);
> 
> while(bytes_to_send){
> 
>    sent_bytes = SSL_write(p_ssl, out_buf+offset, bytes_to_send);
> 
>    switch(SSL_get_error(p_ssl, sent_bytes)) {
>        case SSL_ERROR_NONE:
>            bytes_to_send -= sent_bytes;
>            offset += sent_bytes;
>            fprintf(stderr, "- Written %d bytes\n", sent_bytes);
>            break;
>        case SSL_ERROR_SYSCALL:
>            error_str = Err_error_string(Err_get_error());
>            fprintf(stderr, "- SSL_ERROR_SYSCALL: %s\n", error_str);
>            return false; // exit routine
>        default:
>            fprintf(stderr, "- SSL_write reports %d\n", sent_bytes);
>            return false; // exit routine
>    }
> }
> --end--------------
> 
> When I try and write more than 32k I get the following messages...
> 
> - Attempting to write 59266 bytes
> - Written 16384 bytes
> - Written 16384 bytes
> - SSL_ERROR_SYSCALL: error:00000000:lib(0):func(0):reason(0)
> 
> I have SSL_load_error_strings() earlier in my code, but don't get any
> more information than this.
> 
> I'm still at a loss as to whats happening here, but many thanks for
> your help in getting this far.
> 
> Michael.
> ______________________________________________________________________
> OpenSSL Project                                 http://www.openssl.org
> User Support Mailing List                    openssl-users@openssl.org
> Automated List Manager                           [EMAIL PROTECTED]
>
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to