From 66b5dc2e9cb07bedbc5d8fe3250dcb54df11660f Mon Sep 17 00:00:00 2001 From: William McCusker Date: Fri, 24 Apr 2020 08:42:47 -0700 Subject: [PATCH] Fix for #693 input stream resource leak CacheResourceLoader will now close the input stream after reading in all of the contents. --- .../v2/api/loader/CacheResourceLoader.java | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/yagi/src/main/java/org/raml/v2/api/loader/CacheResourceLoader.java b/yagi/src/main/java/org/raml/v2/api/loader/CacheResourceLoader.java index a92d8654..673e366c 100644 --- a/yagi/src/main/java/org/raml/v2/api/loader/CacheResourceLoader.java +++ b/yagi/src/main/java/org/raml/v2/api/loader/CacheResourceLoader.java @@ -16,7 +16,6 @@ package org.raml.v2.api.loader; import java.io.ByteArrayInputStream; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; @@ -62,24 +61,34 @@ public InputStream fetchResource(String resourceName, ResourceUriCallback callba return toInputStreamOrNull(resourceByteArray); } - InputStream resource; - URI uriCallback = null; - if (resourceLoader instanceof ResourceLoaderExtended) + InputStream resource = null; + try { - resource = ((ResourceLoaderExtended) resourceLoader).fetchResource(resourceName, callback); - uriCallback = ((ResourceLoaderExtended) resourceLoader).getUriCallBackParam(); + URI uriCallback = null; + if (resourceLoader instanceof ResourceLoaderExtended) + { + resource = ((ResourceLoaderExtended) resourceLoader).fetchResource(resourceName, callback); + uriCallback = ((ResourceLoaderExtended) resourceLoader).getUriCallBackParam(); + } + else + { + resource = resourceLoader.fetchResource(resourceName); + } + + // we want to cache results even if they are null + final byte[] resourceByteArray = resource == null ? null : IOUtils.toByteArray(resource); + resources.put(resourceName, Pair.of(resourceByteArray, uriCallback)); + + return toInputStreamOrNull(resourceByteArray); } - else + finally { - resource = resourceLoader.fetchResource(resourceName); + if (resource != null) + { + resource.close(); + } } - // we want to cache results even if they are null - final byte[] resourceByteArray = resource == null ? null : IOUtils.toByteArray(resource); - resources.put(resourceName, Pair.of(resourceByteArray, uriCallback)); - - return toInputStreamOrNull(resourceByteArray); - } catch (final IOException e) {