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

tballison pushed a commit to branch branch_3x
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/branch_3x by this push:
     new d47243907b TIKA-XXXX: keep gdalinfo from opening files and URLs named 
in the document (#3560)
d47243907b is described below

commit d47243907b16c20904c69f281e97341c4dac2383
Author: Tim Allison <[email protected]>
AuthorDate: Fri Nov 6 14:59:31 2026 -0500

    TIKA-XXXX: keep gdalinfo from opening files and URLs named in the document 
(#3560)
    
    Backport of #3516. Add VRT and GTI to GDAL_SKIP and set
      CPL_VSIL_CURL_ALLOWED_FILENAME empty for the gdalinfo process, so a
      FITS-headed VRT or GTI cannot make gdalinfo fetch URLs.
    
    Generated-by: Claude Code Co-Authored-By: Claude Opus 5.5 
<[email protected]>
    
    Co-authored-by: Naveed <[email protected]>
---
 .../org/apache/tika/parser/gdal/GDALParser.java    | 12 ++++-
 .../apache/tika/parser/gdal/TestGDALParser.java    | 58 ++++++++++++++++++++++
 2 files changed, 69 insertions(+), 1 deletion(-)

diff --git 
a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/gdal/GDALParser.java
 
b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/gdal/GDALParser.java
index 42a6652d2a..f784411f04 100644
--- 
a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/gdal/GDALParser.java
+++ 
b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/gdal/GDALParser.java
@@ -185,6 +185,14 @@ public class GDALParser implements Parser {
         return args;
     }
 
+    // VRT and GTI open any file whose header merely contains their XML, so a 
document of a
+    // type routed here can name other files or URLs for gdalinfo to open.
+    static void restrictEnvironment(Map<String, String> env) {
+        env.merge("GDAL_SKIP", "VRT GTI", (operatorSkip, skip) -> operatorSkip 
+ " " + skip);
+        // the input is always a local file, so no /vsicurl/ name needs to open
+        env.put("CPL_VSIL_CURL_ALLOWED_FILENAME", "");
+    }
+
     @Override
     public Set<MediaType> getSupportedTypes(ParseContext context) {
         return SUPPORTED_TYPES;
@@ -206,7 +214,9 @@ public class GDALParser implements Parser {
         String[] runCommand = buildCommandLine(this.command, 
tis.getFile().getPath());
 
         long localTimeoutMillis = TikaTaskTimeout.getTimeoutMillis(context, 
timeoutMs);
-        FileProcessResult result = ProcessUtils.execute(new 
ProcessBuilder(runCommand),
+        ProcessBuilder pb = new ProcessBuilder(runCommand);
+        restrictEnvironment(pb.environment());
+        FileProcessResult result = ProcessUtils.execute(pb,
                 localTimeoutMillis, maxStdOut, maxStdErr);
 
         metadata.set(ExternalProcess.IS_TIMEOUT, result.isTimeout());
diff --git 
a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/test/java/org/apache/tika/parser/gdal/TestGDALParser.java
 
b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/test/java/org/apache/tika/parser/gdal/TestGDALParser.java
index fb8e294087..80a3d4ee27 100644
--- 
a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/test/java/org/apache/tika/parser/gdal/TestGDALParser.java
+++ 
b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/test/java/org/apache/tika/parser/gdal/TestGDALParser.java
@@ -23,11 +23,21 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 import static org.junit.jupiter.api.Assumptions.assumeTrue;
 
+import java.io.IOException;
 import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.junit.jupiter.api.Test;
 
 import org.apache.tika.TikaTest;
+import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.external.ExternalParser;
@@ -179,4 +189,52 @@ public class TestGDALParser extends TikaTest {
         assertArrayEquals(new String[]{"gdalinfo", path},
                 GDALParser.buildCommandLine(new GDALParser().getCommand(), 
path));
     }
+
+    @Test
+    public void testDocumentCannotPointGdalinfoAtAUrl() throws Exception {
+        assumeTrue(canRun());
+        try (ServerSocket listener = new ServerSocket(0, 50, 
InetAddress.getLoopbackAddress())) {
+            AtomicInteger connections = new AtomicInteger();
+            Thread acceptor = new Thread(() -> {
+                while (true) {
+                    try (Socket s = listener.accept()) {
+                        connections.incrementAndGet();
+                    } catch (IOException e) {
+                        return;
+                    }
+                }
+            });
+            acceptor.setDaemon(true);
+            acceptor.start();
+
+            String url = "/vsicurl/http://127.0.0.1:"; + 
listener.getLocalPort() + "/from-document";
+            // a FITS header is what routes the file to GDALParser
+            String fitsHeader = String.format(Locale.ROOT, "%-80s%-80s%n",
+                    "SIMPLE  =                    T", "END");
+            String[] documents = {
+                    fitsHeader + "<VRTDataset rasterXSize=\"1\" 
rasterYSize=\"1\">"
+                            + "<VRTRasterBand dataType=\"Byte\" 
band=\"1\"><SimpleSource>"
+                            + "<SourceFilename relativeToVRT=\"0\">" + url + 
"</SourceFilename>"
+                            + 
"<SourceBand>1</SourceBand></SimpleSource></VRTRasterBand>"
+                            + "</VRTDataset>\n",
+                    fitsHeader + "<GDALTileIndexDataset><IndexDataset>" + url
+                            + "</IndexDataset></GDALTileIndexDataset>\n"};
+            for (String document : documents) {
+                try (TikaInputStream tis = TikaInputStream.get(
+                        document.getBytes(StandardCharsets.US_ASCII))) {
+                    new GDALParser().parse(tis, new BodyContentHandler(), new 
Metadata(),
+                            new ParseContext());
+                }
+            }
+            assertEquals(0, connections.get());
+        }
+    }
+
+    @Test
+    public void testOperatorGdalSkipIsKept() {
+        Map<String, String> env = new HashMap<>(Map.of("GDAL_SKIP", "JPEG"));
+        GDALParser.restrictEnvironment(env);
+        assertEquals("JPEG VRT GTI", env.get("GDAL_SKIP"));
+        assertEquals("", env.get("CPL_VSIL_CURL_ALLOWED_FILENAME"));
+    }
 }

Reply via email to