apache / apache/maven-wrapper

mvnw.cmd crashes with "Cannot index into a null array" on 32-bit System Profile path (Jenkins service)

Open
#395 4 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
Java
Stars
254
Forks
78
Avg merge
5h 26m
Merged PRs (30d)
2

Description

### Affected version

3.3.3

### Bug description

## Description

In `mvnw.cmd`, the logic introduced by PR #143 to handle symlinks attempts to access an array index on the `Target` property without checking if it is null.

`mvnw.cmd` fails immediately upon execution with a "Cannot index into a null array" error. This issue specifically occurs when the script runs under the **Local System account** in a **32-bit process** (typical for Jenkins Agents running as a Windows Service), where the default `.m2` home resolves to the System Profile directory.

## Error Log

```Plaintext
icm : Cannot index into a null array
At line:1 char:81
+ ... 'mvnw.cmd'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Invoke-Command], RuntimeException
+ FullyQualifiedErrorId : NullArray,Microsoft.PowerShell.Commands.InvokeCommandCommand
```

## Environment

- **OS:** Windows Server 2022
- **Process Architecture:** 32-bit (x86)
- **User:** `NT AUTHORITY\SYSTEM`
- **Target Path:** `C:\WINDOWS\system32\config\systemprofile\.m2`
- **PowerShell:** 5.1

## Root Cause Analysis

The script contains the following logic to handle symlinks:

```PowerShell
if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { ... }
```

We verified the behavior of the `Target` property on this specific environment:

1. **Standard Paths (e.g., Workspace drive):** The `Target` property returns an **empty collection**. Accessing `[0]` returns `$null` safely (in PowerShell 5.1).
2. **System Profile Path (`.m2`):** When accessing the `.m2` directory in the System Profile from a 32-bit process, the `Target` property returns **strictly `$null`**.

Since `mvnw.cmd` defaults `MAVEN_M2_PATH` to the user home (System Profile), the script attempts to access index `[0]` on `$null`, causing a fatal `RuntimeException`.

## Verification Code & Result

We ran the following diagnostic inside the failing Jenkins environment, specifically targeting the `.m2` directory:

```PowerShell
$basePath = $env:USERPROFILE
$m2Path = Join-Path $basePath ".m2"

# Ensure .m2 exists for testing
if (-not (Test-Path -Path $m2Path)) { New-Item -Path $m2Path -ItemType Directory | Out-Null }

$prop = (Get-Item $m2Path).Target

Write-Host "Testing Path: $m2Path"
Write-Host "Is Null? : " ($prop -eq $null)
try { $null = $prop[0]; Write-Host "Safe" } catch { Write-Host "CRASH" }
```

**Output:**

```
Testing Path: C:\WINDOWS\system32\config\systemprofile\.m2
Is Null? : True
CRASH
```

## Proposed Fix

The script must check if the `Target` property is not null before attempting to index it.

**Suggested Change:**

```PowerShell
$m2Item = Get-Item $MAVEN_M2_PATH

# Safe check: Ensure property exists and is not null before indexing
if ($m2Item.PSObject.Properties['Target'] -ne $null -and $m2Item.Target -ne $null) {
$MAVEN_WRAPPER_DISTS = $m2Item.Target + "/wrapper/dists"
} else {
$MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists"
}
```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.