From 5fc725154001c6283315802e1a2193d51d00f9aa Mon Sep 17 00:00:00 2001 From: markrmiller Date: Sun, 6 May 2018 14:25:59 -0500 Subject: [PATCH] SOLR-12290: We must close ContentStreams because we don't know the source of the inputstream - use a CloseShield to prevent tripping our close assert in SolrDispatchFilter. --- .../org/apache/solr/handler/BlobHandler.java | 6 +- .../solr/handler/loader/CSVLoaderBase.java | 85 ++++++++++--------- .../solr/handler/loader/JavabinLoader.java | 16 +++- .../solr/servlet/SolrRequestParsers.java | 6 +- 4 files changed, 69 insertions(+), 44 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java index a9986573418..30301c0a46e 100644 --- a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java @@ -17,6 +17,7 @@ package org.apache.solr.handler; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.lang.invoke.MethodHandles; import java.math.BigInteger; @@ -108,8 +109,9 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial for (ContentStream stream : req.getContentStreams()) { ByteBuffer payload; - payload = SimplePostTool.inputStreamToByteArray(stream.getStream(), maxSize); - + try (InputStream is = stream.getStream()) { + payload = SimplePostTool.inputStreamToByteArray(is, maxSize); + } MessageDigest m = MessageDigest.getInstance("MD5"); m.update(payload.array(), payload.position(), payload.limit()); String md5 = new BigInteger(1, m.digest()).toString(16); diff --git a/solr/core/src/java/org/apache/solr/handler/loader/CSVLoaderBase.java b/solr/core/src/java/org/apache/solr/handler/loader/CSVLoaderBase.java index fd8935de1c8..b503fa3fefc 100644 --- a/solr/core/src/java/org/apache/solr/handler/loader/CSVLoaderBase.java +++ b/solr/core/src/java/org/apache/solr/handler/loader/CSVLoaderBase.java @@ -28,6 +28,7 @@ import org.apache.solr.update.*; import org.apache.solr.update.processor.UpdateRequestProcessor; import org.apache.solr.internal.csv.CSVStrategy; import org.apache.solr.internal.csv.CSVParser; +import org.apache.commons.io.IOUtils; import java.util.regex.Pattern; import java.util.List; @@ -314,48 +315,54 @@ abstract class CSVLoaderBase extends ContentStreamLoader { /** load the CSV input */ @Override - public void load(SolrQueryRequest req, SolrQueryResponse rsp, ContentStream stream, UpdateRequestProcessor processor) - throws IOException { + public void load(SolrQueryRequest req, SolrQueryResponse rsp, ContentStream stream, UpdateRequestProcessor processor) throws IOException { errHeader = "CSVLoader: input=" + stream.getSourceInfo(); - Reader reader = stream.getReader(); - if (skipLines > 0) { - if (!(reader instanceof BufferedReader)) { - reader = new BufferedReader(reader); - } - BufferedReader r = (BufferedReader) reader; - for (int i = 0; i < skipLines; i++) { - r.readLine(); - } - } - - CSVParser parser = new CSVParser(reader, strategy); - - // parse the fieldnames from the header of the file - if (fieldnames == null) { - fieldnames = parser.getLine(); - if (fieldnames == null) { - throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Expected fieldnames in CSV input"); - } - prepareFields(); - } - - // read the rest of the CSV file - for (;;) { - int line = parser.getLineNumber(); // for error reporting in MT mode - String[] vals = null; - try { - vals = parser.getLine(); - } catch (IOException e) { - // Catch the exception and rethrow it with more line information - input_err("can't read line: " + line, null, line, e); - } - if (vals == null) break; - - if (vals.length != fieldnames.length) { - input_err("expected " + fieldnames.length + " values but got " + vals.length, vals, line); + Reader reader = null; + try { + reader = stream.getReader(); + if (skipLines>0) { + if (!(reader instanceof BufferedReader)) { + reader = new BufferedReader(reader); + } + BufferedReader r = (BufferedReader)reader; + for (int i=0; i