]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/cyrus.c
ITS#3212: sasl_encode/decode 64-bit clean bug
[openldap] / libraries / libldap / cyrus.c
index d98b534863e7272ab4cf2a457597e753db1ef9f9..2c55ce0d21f2936309bdb3e79d988c3c8c91eb9a 100644 (file)
@@ -306,10 +306,14 @@ sb_sasl_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
        }
 
        /* Decode the packet */
-       ret = sasl_decode( p->sasl_context, p->sec_buf_in.buf_base,
-               p->sec_buf_in.buf_end,
-               (SASL_CONST char **)&p->buf_in.buf_base,
-               (unsigned *)&p->buf_in.buf_end );
+       {
+               unsigned tmpsize = p->buf_in.buf_end;
+               ret = sasl_decode( p->sasl_context, p->sec_buf_in.buf_base,
+                       p->sec_buf_in.buf_end,
+                       (SASL_CONST char **)&p->buf_in.buf_base,
+                       (unsigned *)&tmpsize );
+               p->buf_in.buf_end = tmpsize;
+       }
 
        /* Drop the packet from the input buffer */
        sb_sasl_drop_packet( &p->sec_buf_in, sbiod->sbiod_sb->sb_debug );
@@ -358,11 +362,18 @@ sb_sasl_write( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
 #else
        ber_pvt_sb_buf_destroy( &p->buf_out );
 #endif
-       if ( len > *p->sasl_maxbuf - 100 )
+       if ( len > *p->sasl_maxbuf - 100 ) {
                len = *p->sasl_maxbuf - 100;    /* For safety margin */
-       ret = sasl_encode( p->sasl_context, buf, len,
-               (SASL_CONST char **)&p->buf_out.buf_base,
-               (unsigned *)&p->buf_out.buf_size );
+       }
+
+       {
+               unsigned tmpsize = p->buf_out.buf_size;
+               ret = sasl_encode( p->sasl_context, buf, len,
+                       (SASL_CONST char **)&p->buf_out.buf_base,
+                       &tmpsize );
+               p->buf_out.buf_size = tmpsize;
+       }
+
        if ( ret != SASL_OK ) {
                ber_log_printf( LDAP_DEBUG_ANY, sbiod->sbiod_sb->sb_debug,
                        "sb_sasl_write: failed to encode packet: %s\n",