This is an automated email from the ASF dual-hosted git repository.

mattyb149 pushed a commit to branch support/nifi-1.x
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/support/nifi-1.x by this push:
     new e5ebebdc29 NIFI-12750 ExecuteStreamCommand incorrectly decodes std 
error stream
e5ebebdc29 is described below

commit e5ebebdc294a8a1b8b7391e719c66cf45b00d464
Author: Jim Steinebrey <[email protected]>
AuthorDate: Fri Jun 21 13:04:14 2024 -0400

    NIFI-12750 ExecuteStreamCommand incorrectly decodes std error stream
    
    Signed-off-by: Matt Burgess <[email protected]>
---
 .../processors/standard/ExecuteStreamCommand.java  |  22 ++++++++++-----------
 .../src/test/java/TestLogStdErr.java               |   1 +
 .../standard/TestExecuteStreamCommand.java         |   2 ++
 .../resources/ExecuteCommand/TestLogStdErr.jar     | Bin 900 -> 995 bytes
 4 files changed, 13 insertions(+), 12 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ExecuteStreamCommand.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ExecuteStreamCommand.java
index 26a0d86922..d246dbf323 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ExecuteStreamCommand.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ExecuteStreamCommand.java
@@ -54,6 +54,7 @@ import org.apache.nifi.processor.io.InputStreamCallback;
 import org.apache.nifi.processor.util.StandardValidators;
 import org.apache.nifi.processors.standard.util.ArgumentUtils;
 import 
org.apache.nifi.processors.standard.util.SoftLimitBoundedByteArrayOutputStream;
+import org.apache.nifi.stream.io.LimitingInputStream;
 import org.apache.nifi.stream.io.StreamUtils;
 
 import java.io.BufferedInputStream;
@@ -64,6 +65,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.ProcessBuilder.Redirect;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -506,24 +508,20 @@ public class ExecuteStreamCommand extends 
AbstractProcessor {
 
             Map<String, String> attributes = new HashMap<>();
 
-            final StringBuilder strBldr = new StringBuilder();
-            try (final InputStream is = new FileInputStream(errorOut)) {
-                int c;
-                while ((c = is.read()) != -1) {
-                    strBldr.append((char) c);
-                }
-            } catch (IOException e) {
-                strBldr.append("Unknown...could not read Process's Std Error");
+            String stdErr = "";
+            try (final InputStream in = new BufferedInputStream(new 
LimitingInputStream(new FileInputStream(errorOut), 4000))) {
+                stdErr = IOUtils.toString(in, Charset.defaultCharset());
+            } catch (final Exception e) {
+                stdErr = "Unknown...could not read Process's Std Error due to 
" + e.getClass().getName() + ": " + e.getMessage();
             }
-            int length = Math.min(strBldr.length(), 4000);
-            attributes.put("execution.error", strBldr.substring(0, length));
+            attributes.put("execution.error", stdErr);
 
             final Relationship outputFlowFileRelationship = putToAttribute ? 
ORIGINAL_RELATIONSHIP : (exitCode != 0) ? NONZERO_STATUS_RELATIONSHIP : 
OUTPUT_STREAM_RELATIONSHIP;
             if (exitCode == 0) {
                 logger.info("Transferring {} to {}", outputFlowFile, 
outputFlowFileRelationship.getName());
             } else {
-                logger.error("Transferring {} to {}. Executable command {} 
ended in an error: {}",
-                        outputFlowFile, outputFlowFileRelationship.getName(), 
executeCommand, strBldr.toString());
+                logger.error("Transferring {} to {}. Executable command {} 
returned exitCode {} and error message: {}",
+                        outputFlowFile, outputFlowFileRelationship.getName(), 
executeCommand, exitCode, stdErr);
             }
 
             attributes.put("execution.status", Integer.toString(exitCode));
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/TestLogStdErr.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/TestLogStdErr.java
index a6c6a371bf..4203bf20c1 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/TestLogStdErr.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/TestLogStdErr.java
@@ -24,6 +24,7 @@ public class TestLogStdErr {
     public static void main(String[] args) throws IOException, 
URISyntaxException {
         char[] chars = new char[1024 * 1024];
         Arrays.fill(chars, 'f');
+        System.arraycopy("ÄÖÜäöüß".toCharArray(), 0, chars, 0, 7);
         System.err.println(new String(chars));
     }
 
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteStreamCommand.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteStreamCommand.java
index 3b0d29ca86..cedcc85397 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteStreamCommand.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteStreamCommand.java
@@ -297,6 +297,7 @@ public class TestExecuteStreamCommand {
         List<MockFlowFile> flowFiles = 
controller.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
         MockFlowFile flowFile = flowFiles.get(0);
         assertEquals(0, flowFile.getSize());
+        
assertTrue(flowFile.getAttribute("execution.error").contains("ÄÖÜäöüß"));
         
assertTrue(flowFile.getAttribute("execution.error").contains("fffffffffffffffffffffffffffffff"));
     }
 
@@ -329,6 +330,7 @@ public class TestExecuteStreamCommand {
         List<MockFlowFile> flowFiles = 
controller.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
         MockFlowFile flowFile = flowFiles.get(0);
         assertEquals(0, flowFile.getSize());
+        
assertTrue(flowFile.getAttribute("execution.error").contains("ÄÖÜäöüß"));
         
assertTrue(flowFile.getAttribute("execution.error").contains("fffffffffffffffffffffffffffffff"));
     }
 
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestLogStdErr.jar
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestLogStdErr.jar
index 321479dae4..cb202b5b47 100755
Binary files 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestLogStdErr.jar
 and 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestLogStdErr.jar
 differ

Reply via email to