Hello,

I'm trying to integrgate BIO_s_mem with BIO_base64. If I do a BIO_push(),
then write to the returned value, the data is base64 encoded ok and I can
retreive it using the ctrl supplied pointer. However, when I try the
reverse, (read, thereby invoking a decode) I get no output.

Specifically, I create a new BIO_s_mem. Write to it with either BIO_puts or
BIO_write. Then do a BIO_push(b64bio, mbio). Then BIO_read(b64bio, mybuf,
len). It returns -1. When I ask if I should retry it says yes, but there is
no output on the second call either.

After I set debugging on, I noticed it was doing two internal reads, the
first one returned the correct number of bytes from the memory buffer, then
it did another one. This second read returned -1. This doesn't seem to
happen on write(encode). 

Here is the debug output:
puts
BIO[08049CC8]:puts() - memory buffer
BIO[08049CC8]:puts return 12
push
BIO[08049D20]:ctrl(6) - base64 encoding
BIO[08049CC8]:ctrl(6) - memory buffer
BIO[08049CC8]:ctrl return 0
BIO[08049D20]:ctrl return 0
read
BIO[08049D20]:read(0,12) - base64 encoding
BIO[08049CC8]:read(-1,1024) - memory buffer
BIO[08049CC8]:read return 12
BIO[08049CC8]:read(-1,1024) - memory buffer              // Notice this
second read (still in the mem BIO.)
BIO[08049CC8]:read return -1
BIO[08049D20]:read return -1
retry
BIO[08049D20]:read(0,12) - base64 encoding
BIO[08049CC8]:read(-1,1024) - memory buffer
BIO[08049CC8]:read return -1
BIO[08049D20]:read return -1
prints ilen -1

Here is the relevant code.

        mbuf = (unsigned char*)malloc(len);
        mbio = BIO_new(BIO_s_mem());
        b64bio = BIO_new(BIO_f_base64());

        BIO_set_callback(mbio, BIO_debug_callback);
        BIO_set_callback(b64bio, BIO_debug_callback);
        
        fprintf(stderr, "puts\n");
        BIO_puts(mbio, buf);
        fprintf(stderr, "push\n");
        bio = BIO_push(b64bio, mbio);
        fprintf(stderr, "read\n");
        

        ilen = BIO_read(bio, mbuf, len);
        if (ilen == -1)
        {
                if (BIO_should_retry(bio))
                {
                        fprintf(stderr, "retry\n");
                        ilen = BIO_read(bio, mbuf, len);
                }
                else 
                        fprintf(stderr,"should not retry\n");
        }
        fprintf(stderr, "prints ilen %d\n", ilen);




I'm running Mandrake 7.1 with gcc 2.95/

Does anybody know why this is happening?

Thanks

Ed.

P.s. here is th debug from the write operation.

BIO[08049D58]:ctrl(6) - base64 encoding
BIO[08049D00]:ctrl(6) - memory buffer
BIO[08049D00]:ctrl return 0
BIO[08049D58]:ctrl return 0
BIO[08049D58]:write(0,8) - base64 encoding
BIO[08049D58]:write return 8
BIO[08049D58]:ctrl(11) - base64 encoding
BIO[08049D00]:write(-1,13) - memory buffer
BIO[08049D00]:write return 13
BIO[08049D00]:ctrl(11) - memory buffer
BIO[08049D00]:ctrl return 1
BIO[08049D58]:ctrl return 1
BIO[08049D00]:ctrl(3) - memory buffer
BIO[08049D00]:ctrl return 13





Ed Howland
Director, Unix Development
StreamSearch.com
(314) 746-1827
(314) 406-6836 (mobile)




______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to