Author: toad
Date: 2008-12-24 19:23:38 +0000 (Wed, 24 Dec 2008)
New Revision: 24783

Modified:
   branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java
Log:
Fix bucket leaks when fetching metadata.
removeFrom() where necessary.


Modified: branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java       
2008-12-24 19:14:34 UTC (rev 24782)
+++ branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java       
2008-12-24 19:23:38 UTC (rev 24783)
@@ -164,16 +164,19 @@
                        if(!ctx.followRedirects) {
                                onFailure(new 
FetchException(FetchException.INVALID_METADATA, "Told me not to follow 
redirects (splitfile block??)"), false, container, context);
                                data.free();
+                               if(persistent) data.removeFrom(container);
                                return;
                        }
                        if(parent.isCancelled()) {
                                onFailure(new 
FetchException(FetchException.CANCELLED), false, container, context);
                                data.free();
+                               if(persistent) data.removeFrom(container);
                                return;
                        }
                        if(data.size() > ctx.maxMetadataSize) {
                                onFailure(new 
FetchException(FetchException.TOO_BIG_METADATA), false, container, context);
                                data.free();
+                               if(persistent) data.removeFrom(container);
                                return;
                        }
                        // Parse metadata
@@ -184,14 +187,17 @@
                                        container.store(this);
                                wrapHandleMetadata(false, container, context);
                                data.free();
+                               if(persistent) data.removeFrom(container);
                        } catch (MetadataParseException e) {
                                onFailure(new 
FetchException(FetchException.INVALID_METADATA, e), false, container, context);
                                data.free();
+                               if(persistent) data.removeFrom(container);
                                return;
                        } catch (IOException e) {
                                // Bucket error?
                                onFailure(new 
FetchException(FetchException.BUCKET_ERROR, e), false, container, context);
                                data.free();
+                               if(persistent) data.removeFrom(container);
                                return;
                        }
                }
@@ -215,6 +221,7 @@
                        if(logMINOR)
                                Logger.minor(this, "Parent is cancelled");
                        result.asBucket().free();
+                       if(persistent) result.asBucket().removeFrom(container);
                        onFailure(new FetchException(FetchException.CANCELLED), 
false, container, context);
                        return;
                }
@@ -265,10 +272,12 @@
                                rcb.onFailure(new 
FetchException(FetchException.TOO_MANY_PATH_COMPONENTS, result.size(), (rcb == 
parent), result.getMimeType(), tryURI), this, container, context);
                        }
                        result.asBucket().free();
+                       if(persistent) result.asBucket().removeFrom(container);
                        return;
                } else if(result.size() > ctx.maxOutputLength) {
                        rcb.onFailure(new 
FetchException(FetchException.TOO_BIG, result.size(), (rcb == parent), 
result.getMimeType()), this, container, context);
                        result.asBucket().free();
+                       if(persistent) result.asBucket().removeFrom(container);
                } else {
                        rcb.onSuccess(result, this, container, context);
                }
@@ -375,6 +384,7 @@
                                if(metadataBucket != null) {
                                        try {
                                                metadata = 
Metadata.construct(metadataBucket);
+                                               metadataBucket.free();
                                        } catch (IOException e) {
                                                // Bucket error?
                                                throw new 
FetchException(FetchException.BUCKET_ERROR, e);
@@ -389,6 +399,8 @@
                                                        if(logMINOR) 
Logger.minor(this, "gotBucket on "+SingleFileFetcher.this+" 
persistent="+persistent);
                                                        try {
                                                                metadata = 
Metadata.construct(data);
+                                                               data.free();
+                                                               if(persistent) 
data.removeFrom(container);
                                                                
wrapHandleMetadata(true, container, context);
                                                        } catch 
(MetadataParseException e) {
                                                                // Invalid 
metadata
@@ -449,7 +461,7 @@
                                        final Bucket out;
                                        try {
                                                // Data will not be freed until 
client is finished with it.
-                                               if(returnBucket != null) {
+                                               if(returnBucket != null || 
persistent) {
                                                        out = returnBucket;
                                                        
BucketTools.copy(dataBucket, out);
                                                        dataBucket.free();
@@ -483,6 +495,8 @@
                                                                        out = 
returnBucket;
                                                                        
BucketTools.copy(data, out);
                                                                        
data.free();
+                                                                       
if(persistent)
+                                                                               
data.removeFrom(container);
                                                                } else {
                                                                        out = 
data;
                                                                }
@@ -834,6 +848,7 @@
                                return;
                        } finally {
                                result.asBucket().free();
+                               if(persistent) 
result.asBucket().removeFrom(container);
                        }
                        if(callback != null) return;
                        wrapHandleMetadata(true, container, context);
@@ -918,6 +933,8 @@
                                SingleFileFetcher.this.onFailure(new 
FetchException(FetchException.BUCKET_ERROR, e), false, container, context);
                        } finally {
                                result.asBucket().free();
+                               if(persistent)
+                                       result.asBucket().removeFrom(container);
                        }
                        if(!wasActive)
                                container.deactivate(SingleFileFetcher.this, 1);

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to