fix: Add input validation and bounds checking to parsing methods (#990)

* fix: Resolved boundary condition issues in string processing

Addressed null and length checks during string splitting across multiple model classes to prevent potential null pointer exceptions and array out-of-bounds errors

* fix: Throw exceptions instead of silently returning when package manager output formats are invalid

Modified the _pacman, _opkg, and _apk parsing methods to throw exceptions when input formats are invalid, rather than silently returning, to prevent potential error handling issues.
This commit is contained in:
GT610
2026-01-06 23:47:49 +08:00
committed by GitHub
parent 06ed38ff45
commit 26efb8e185
5 changed files with 10 additions and 4 deletions

View File

@@ -149,10 +149,12 @@ abstract final class SSHConfig {
/// Extract jump host from ProxyJump or ProxyCommand /// Extract jump host from ProxyJump or ProxyCommand
static String? _extractJumpHost(String value) { static String? _extractJumpHost(String value) {
if (value.isEmpty) return null;
// For ProxyJump, the format is usually: user@host:port // For ProxyJump, the format is usually: user@host:port
// For ProxyCommand, it's more complex and might need custom parsing // For ProxyCommand, it's more complex and might need custom parsing
if (value.contains('@')) { if (value.contains('@')) {
return value.split(' ').first; final parts = value.split(' ');
return parts.isNotEmpty ? parts[0] : null;
} }
return null; return null;
} }

View File

@@ -62,6 +62,7 @@ class UpgradePkgInfo {
void _parsePacman(String raw) { void _parsePacman(String raw) {
final parts = raw.split(' '); final parts = raw.split(' ');
if (parts.length < 4) throw Exception('Invalid pacman output format');
package = parts[0]; package = parts[0];
nowVersion = parts[1]; nowVersion = parts[1];
newVersion = parts[3]; newVersion = parts[3];
@@ -70,6 +71,7 @@ class UpgradePkgInfo {
void _parseOpkg(String raw) { void _parseOpkg(String raw) {
final parts = raw.split(' - '); final parts = raw.split(' - ');
if (parts.length < 3) throw Exception('Invalid opkg output format');
package = parts[0]; package = parts[0];
nowVersion = parts[1]; nowVersion = parts[1];
newVersion = parts[2]; newVersion = parts[2];
@@ -80,6 +82,7 @@ class UpgradePkgInfo {
void _parseApk(String raw) { void _parseApk(String raw) {
final parts = raw.split(' '); final parts = raw.split(' ');
final len = parts.length; final len = parts.length;
if (len < 2) throw Exception('Invalid apk output format');
newVersion = parts[len - 1]; newVersion = parts[len - 1];
nowVersion = parts[0]; nowVersion = parts[0];
newVersion = newVersion.substring(0, newVersion.length - 1); newVersion = newVersion.substring(0, newVersion.length - 1);

View File

@@ -166,6 +166,7 @@ class SingleCpuCore extends TimeSeqIface<SingleCpuCore> {
final id = item.split(' ').firstOrNull; final id = item.split(' ').firstOrNull;
if (id == null) continue; if (id == null) continue;
final matches = item.replaceFirst(id, '').trim().split(' '); final matches = item.replaceFirst(id, '').trim().split(' ');
if (matches.length < 7) continue;
cpus.add( cpus.add(
SingleCpuCore( SingleCpuCore(
id, id,

View File

@@ -97,8 +97,8 @@ class Proc {
} }
String get binary { String get binary {
final parts = command.split(' '); final parts = command.trim().split(' ').where((e) => e.isNotEmpty).toList();
return parts[0]; return parts.isNotEmpty ? parts[0] : '';
} }
} }

View File

@@ -280,7 +280,7 @@ enum ContainerCmdType {
return switch (this) { return switch (this) {
ContainerCmdType.version => '$prefix version $_jsonFmt', ContainerCmdType.version => '$prefix version $_jsonFmt',
ContainerCmdType.ps => switch (type) { ContainerCmdType.ps => switch (type) {
/// TODO: Rollback to json format when permformance recovers. /// TODO: Rollback to json format when performance recovers.
/// Use [_jsonFmt] in Docker will cause the operation to slow down. /// Use [_jsonFmt] in Docker will cause the operation to slow down.
ContainerType.docker => ContainerType.docker =>
'$prefix ps -a --format "table {{printf \\"' '$prefix ps -a --format "table {{printf \\"'