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

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new 049efc03b4 extra hardening for comma separated values, fixes #6764 
(#6781)
049efc03b4 is described below

commit 049efc03b406018804c82d821651d69aff76461e
Author: Hans Van Akelyen <[email protected]>
AuthorDate: Fri Mar 13 16:16:52 2026 +0100

    extra hardening for comma separated values, fixes #6764 (#6781)
---
 .../main/java/org/apache/hop/run/HopRunBase.java   | 47 +++++++++++++++++++++-
 1 file changed, 45 insertions(+), 2 deletions(-)

diff --git a/engine/src/main/java/org/apache/hop/run/HopRunBase.java 
b/engine/src/main/java/org/apache/hop/run/HopRunBase.java
index 263e2e6251..b78d56d48a 100644
--- a/engine/src/main/java/org/apache/hop/run/HopRunBase.java
+++ b/engine/src/main/java/org/apache/hop/run/HopRunBase.java
@@ -20,6 +20,8 @@ package org.apache.hop.run;
 
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import lombok.Getter;
 import lombok.Setter;
@@ -95,7 +97,9 @@ public abstract class HopRunBase implements Runnable, 
IHasHopMetadataProvider {
 
   @CommandLine.Option(
       names = {"-p", "--parameters"},
-      description = "A list of PARAMETER=VALUE pairs")
+      description =
+          "A list of PARAMETER=VALUE pairs (default separator: comma). "
+              + "For values containing the separator, wrap in double quotes, 
e.g. -p 'key1=\"value1,value2\"'")
   protected String[] parameters = null;
 
   @CommandLine.Option(
@@ -435,6 +439,41 @@ public abstract class HopRunBase implements Runnable, 
IHasHopMetadataProvider {
     return filename.toLowerCase().endsWith(".hwf");
   }
 
+  /**
+   * Split a string by the given separator, but do not split on separators 
that appear inside
+   * double-quoted sections. This allows values like key1="value1,value2" to 
be kept as one pair.
+   *
+   * @param s the string to split (e.g. key1="value1,value2",key2=value2)
+   * @param separator the separator character(s) between pairs (e.g. ",")
+   * @return array of pair strings (e.g. ["key1=\"value1,value2\"", 
"key2=value2"])
+   */
+  protected static String[] splitParameterPairsRespectingQuotes(String s, 
String separator) {
+    if (s == null || separator == null || separator.isEmpty()) {
+      return s == null ? new String[0] : new String[] {s};
+    }
+    List<String> pairs = new ArrayList<>();
+    StringBuilder current = new StringBuilder();
+    boolean inQuotes = false;
+    int i = 0;
+    while (i < s.length()) {
+      char c = s.charAt(i);
+      if (c == '"') {
+        inQuotes = !inQuotes;
+        current.append(c);
+        i++;
+      } else if (!inQuotes && s.substring(i).startsWith(separator)) {
+        pairs.add(current.toString().trim());
+        current.setLength(0);
+        i += separator.length();
+      } else {
+        current.append(c);
+        i++;
+      }
+    }
+    pairs.add(current.toString().trim());
+    return pairs.toArray(new String[0]);
+  }
+
   /** Set the variables and parameters */
   protected void parseParametersAndVariables(
       CommandLine cmd,
@@ -447,7 +486,11 @@ public abstract class HopRunBase implements Runnable, 
IHasHopMetadataProvider {
         parametersSeparator = parametersSeparator == null ? "," : 
parametersSeparator;
 
         for (String parameter : parameters) {
-          for (String singleParameter : parameter.split(parametersSeparator)) {
+          for (String singleParameter :
+              splitParameterPairsRespectingQuotes(parameter, 
parametersSeparator)) {
+            if (singleParameter.isEmpty()) {
+              continue;
+            }
             String[] split = singleParameter.split("=", 2);
             String key = split.length > 0 ? split[0] : null;
             String value = split.length > 1 ? split[1] : null;

Reply via email to