Import of old SSLeay release: SSLeay 0.9.1b (unreleased)
[openssl.git] / crypto / bio / bio_lib.c
index 7a66b0892ed2a584b480c6a5413c7603a1ab3772..bee1f5d2e0d3c76e6715bcf07337ee420de50a6a 100644 (file)
@@ -167,6 +167,7 @@ int outl;
                }
 
        i=b->method->bread(b,out,outl);
+
        if (i > 0) b->num_read+=(unsigned long)i;
 
        if (cb != NULL)
@@ -204,9 +205,16 @@ int inl;
                }
 
        i=b->method->bwrite(b,in,inl);
+
        if (i > 0) b->num_write+=(unsigned long)i;
 
-       if (cb != NULL)
+       /* This is evil and not thread safe.  If the BIO has been freed,
+        * we must not call the callback.  The only way to be able to
+        * determine this is the reference count which is now invalid since
+        * the memory has been free()ed.
+        */
+       if (b->references <= 0) abort();
+       if (cb != NULL) /* && (b->references >= 1)) */
                i=(int)cb(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl,
                        0L,(long)i);
        return(i);