summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-13 20:34:15 +0200
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-13 20:34:15 +0200
commit6221afe05e7499b3062111bda22e53752bac47bb (patch)
tree045c616ae4ca816455b89675fbf654eae4865fb5 /src/main
parent8f94145316a998867a7bb077cd869b896dde48c5 (diff)
Added ScanHostException to wrap lower level Exceptions and also encode
host info in it.
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/it_jaros/jns/scan/Scanner.java10
-rw-r--r--src/main/java/com/it_jaros/jns/scan/engine/ScanHostException.java7
-rw-r--r--src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java17
-rw-r--r--src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java9
4 files changed, 32 insertions, 11 deletions
diff --git a/src/main/java/com/it_jaros/jns/scan/Scanner.java b/src/main/java/com/it_jaros/jns/scan/Scanner.java
index f081f29..76a802e 100644
--- a/src/main/java/com/it_jaros/jns/scan/Scanner.java
+++ b/src/main/java/com/it_jaros/jns/scan/Scanner.java
@@ -58,7 +58,15 @@ public class Scanner implements AutoCloseable {
if (poll instanceof PollState.Success<ScanResult>(ScanResult value)) {
consumer.accept(value);
} else if (poll instanceof PollState.Failure<ScanResult>(Throwable error)) {
- System.err.printf("runScan(): ScanHostTask() failed with error %s -> %s%n", error.getClass().getSimpleName(), error.getMessage());
+ if (error instanceof RejectedExecutionException) {
+ // happens when strg-c is pressed
+ continue;
+ }
+ if (error instanceof ScanHostException) {
+ System.err.printf("runScan(): ScanHostTask(%s) failed with error %s -> %s%n", error.getMessage(), error.getCause().getClass().getSimpleName(), error.getCause().getMessage());
+ } else {
+ System.err.printf("runScan(): ScanHostTask() failed with error %s -> %s%n", error.getClass().getSimpleName(), error.getCause().getMessage());
+ }
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
diff --git a/src/main/java/com/it_jaros/jns/scan/engine/ScanHostException.java b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostException.java
new file mode 100644
index 0000000..cc05b55
--- /dev/null
+++ b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostException.java
@@ -0,0 +1,7 @@
+package com.it_jaros.jns.scan.engine;
+
+public class ScanHostException extends Exception {
+ public ScanHostException(String host, Exception e) {
+ super(host, e);
+ }
+}
diff --git a/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java
index 24928d9..675dadd 100644
--- a/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java
+++ b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java
@@ -6,6 +6,7 @@ import com.it_jaros.jns.scan.domain.PortResult;
import com.it_jaros.jns.scan.domain.PortState;
import com.it_jaros.jns.scan.domain.ScanResult;
+import java.net.InetAddress;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@@ -13,10 +14,11 @@ import java.util.concurrent.TimeUnit;
public class ScanHostTask implements Callable<ScanResult> {
+ private final CancelledToken cancelledToken;
+ private InetAddress hostAddress;
private final Scan scan;
- private final String host; // input parameter
private final ScanExecutionContext context;
- private final CancelledToken cancelledToken;
+ private final String host; // input parameter
private final boolean disableOnlineCheck;
private final int maxWorkersPerHost;
private final PortResultAccumulator accumulator;
@@ -32,13 +34,16 @@ public class ScanHostTask implements Callable<ScanResult> {
}
@Override
- public ScanResult call() {
+ public ScanResult call() throws Exception {
try {
scan.hostStart();
if (context.cancelledToken().isCancelled()) {
return ScanResult.empty(host);
}
+ this.hostAddress = InetAddress.getByName(host);
return scanHostPorts();
+ } catch (Exception e) {
+ throw new ScanHostException(host, e);
} finally {
scan.hostFinish();
}
@@ -58,7 +63,7 @@ public class ScanHostTask implements Callable<ScanResult> {
ProducerState<PortResult> state = new ProducerThread(context).startProducer(
portRange.iterator(),
maxWorkersPerHost,
- port -> new ScanPortTask(host, port, context)
+ port -> new ScanPortTask(hostAddress, port, context)
);
// consumer is the main thread
@@ -71,7 +76,7 @@ public class ScanHostTask implements Callable<ScanResult> {
if (poll instanceof PollState.Success<PortResult>(PortResult value)) {
accumulator.add(value);
} else if (poll instanceof PollState.Failure(Throwable error)) {
- System.err.printf("scanHostPorts(%s): ScanPortTask() failed for with error %s -> %s%n", host, error.getClass().getSimpleName(), error.getMessage());
+ System.err.printf("scanHostPorts(%s): ScanPortTask() failed with error %s -> %s%n", host, error.getClass().getSimpleName(), error.getMessage());
}
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
@@ -83,7 +88,7 @@ public class ScanHostTask implements Callable<ScanResult> {
private boolean checkHostOnline() {
try {
- PortResult result = new ScanPortTask(host, 7, context).call();
+ PortResult result = new ScanPortTask(hostAddress, 7, context).call();
Exception exception = result.getException();
accumulator.add(result);
if (exception == null && !result.getState().equals(PortState.FILTERED)) {
diff --git a/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java b/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java
index b6c5964..5809275 100644
--- a/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java
+++ b/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java
@@ -7,6 +7,7 @@ import com.it_jaros.jns.scan.domain.PortState;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.ConnectException;
+import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
@@ -23,13 +24,13 @@ public class ScanPortTask implements Callable<PortResult> {
private final PortScanRateLimiter portScanRateLimiter; // per-host shared limiter
private final Scan scan;
private final Semaphore socketLimit;
- private final String host;
+ private final InetAddress inetAddress;
private final boolean bannerRecognition;
private final int port;
private final long timeoutInNanos;
- ScanPortTask(String host, int port, ScanExecutionContext context) {
- this.host = host;
+ ScanPortTask(InetAddress inetAddress, int port, ScanExecutionContext context) {
+ this.inetAddress = inetAddress;
this.port = port;
this.bannerRecognition = context.scanOptions().bannerRecognition();
this.cancelledToken = context.cancelledToken();
@@ -61,7 +62,7 @@ public class ScanPortTask implements Callable<PortResult> {
result.setState(PortState.UNKNOWN);
try(SocketChannel socketChannel = SocketChannel.open()) {
socketChannel.configureBlocking(false);
- socketChannel.connect(new InetSocketAddress(host, port));
+ socketChannel.connect(new InetSocketAddress(inetAddress, port));
final long deadlineNanos = System.nanoTime() + timeoutInNanos;
final long waitInNanos = TimeUnit.MILLISECONDS.toNanos(1000);
boolean isConnected = socketChannel.finishConnect();