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"));
+ }
}