1
0
mirror of https://github.com/veracrypt/VeraCrypt.git synced 2025-11-12 19:38:26 -06:00

Windows: Better command line handling to make it more strict and robust. This avoids issues when using wrong syntax.

This commit is contained in:
Mounir IDRASSI
2015-04-26 15:57:43 +02:00
parent 9ccb8a97af
commit dc3bc64b86
4 changed files with 133 additions and 149 deletions

View File

@@ -7156,20 +7156,18 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
argumentspec as;
int nArgPos;
as.args = args;
as.arg_cnt = sizeof(args)/ sizeof(args[0]);
switch (GetArgumentID (&as, lpszCommandLineArgs[i], &nArgPos))
switch (GetArgumentID (&as, lpszCommandLineArgs[i]))
{
case OptionAuto:
{
char szTmp[32];
char szTmp[32] = {0};
bAuto = TRUE;
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs,
nArgPos, &i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
&i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
{
if (!_stricmp (szTmp, "devices"))
bAutoMountDevices = TRUE;
@@ -7177,6 +7175,8 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
bAutoMountFavorites = TRUE;
else if (!_stricmp (szTmp, "logon"))
LogOn = TRUE;
else
AbortProcess ("COMMAND_LINE_ERROR");
}
}
break;
@@ -7187,22 +7187,39 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
case OptionCache:
{
char szTmp[8];
char szTmp[8] = {0};
bCacheInDriver = TRUE;
GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs,
szTmp, sizeof (szTmp));
if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no"))
bCacheInDriver = FALSE;
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
szTmp, sizeof (szTmp)))
{
if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no"))
bCacheInDriver = FALSE;
else if (!_stricmp(szTmp,"y") || !_stricmp(szTmp,"yes"))
bCacheInDriver = FALSE;
else
AbortProcess ("COMMAND_LINE_ERROR");
}
}
break;
case CommandDismount:
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs,
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
szDriveLetter, sizeof (szDriveLetter)))
cmdUnmountDrive = toupper(szDriveLetter[0]) - 'A';
{
if ( (strlen(szDriveLetter) == 1)
|| (strlen(szDriveLetter) == 2 && szDriveLetter[1] == ':')
)
{
cmdUnmountDrive = toupper(szDriveLetter[0]) - 'A';
if ((cmdUnmountDrive < 0) || (cmdUnmountDrive > ('Z' - 'A')))
AbortProcess ("BAD_DRIVE_LETTER");
}
else
AbortProcess ("BAD_DRIVE_LETTER");
}
else
cmdUnmountDrive = -1;
@@ -7218,7 +7235,7 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
break;
case OptionKeyfile:
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, nArgPos, &i,
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i,
nNoCommandLineArgs, tmpPath, sizeof (tmpPath)))
{
KeyFile *kf;
@@ -7230,97 +7247,130 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
FirstCmdKeyFile = KeyFileAdd (FirstCmdKeyFile, kf);
}
}
else
AbortProcess ("COMMAND_LINE_ERROR");
break;
case OptionLetter:
GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs,
szDriveLetter, sizeof (szDriveLetter));
commandLineDrive = *szDriveLetter = (char) toupper (*szDriveLetter);
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
szDriveLetter, sizeof (szDriveLetter)))
{
if ( (strlen(szDriveLetter) == 1)
|| (strlen(szDriveLetter) == 2 && szDriveLetter[1] == ':')
)
{
commandLineDrive = *szDriveLetter = (char) toupper (*szDriveLetter);
if (commandLineDrive < 'C' || commandLineDrive > 'Z')
if (commandLineDrive < 'C' || commandLineDrive > 'Z')
AbortProcess ("BAD_DRIVE_LETTER");
}
else
AbortProcess ("BAD_DRIVE_LETTER");
}
else
AbortProcess ("BAD_DRIVE_LETTER");
break;
case OptionHistory:
{
char szTmp[8];
char szTmp[8] = {0};
bHistory = bHistoryCmdLine = TRUE;
GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs,
szTmp, sizeof (szTmp));
if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no"))
bHistory = FALSE;
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
szTmp, sizeof (szTmp)))
{
if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no"))
bHistory = FALSE;
else if (!_stricmp(szTmp,"y") || !_stricmp(szTmp,"yes"))
bHistory = TRUE;
else
AbortProcess ("COMMAND_LINE_ERROR");
}
}
break;
case OptionMountOption:
{
char szTmp[16];
char szTmp[16] = {0};
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs,
nArgPos, &i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
&i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
{
if (!_stricmp (szTmp, "ro") || !_stricmp (szTmp, "readonly"))
mountOptions.ReadOnly = TRUE;
if (!_stricmp (szTmp, "rm") || !_stricmp (szTmp, "removable"))
else if (!_stricmp (szTmp, "rm") || !_stricmp (szTmp, "removable"))
mountOptions.Removable = TRUE;
if (!_stricmp (szTmp, "ts") || !_stricmp (szTmp, "timestamp"))
else if (!_stricmp (szTmp, "ts") || !_stricmp (szTmp, "timestamp"))
mountOptions.PreserveTimestamp = FALSE;
if (!_stricmp (szTmp, "sm") || !_stricmp (szTmp, "system"))
else if (!_stricmp (szTmp, "sm") || !_stricmp (szTmp, "system"))
mountOptions.PartitionInInactiveSysEncScope = bPrebootPasswordDlgMode = TRUE;
if (!_stricmp (szTmp, "bk") || !_stricmp (szTmp, "headerbak"))
else if (!_stricmp (szTmp, "bk") || !_stricmp (szTmp, "headerbak"))
mountOptions.UseBackupHeader = TRUE;
if (!_stricmp (szTmp, "recovery"))
else if (!_stricmp (szTmp, "recovery"))
mountOptions.RecoveryMode = TRUE;
else
AbortProcess ("COMMAND_LINE_ERROR");
CmdMountOptions = mountOptions;
CmdMountOptionsValid = TRUE;
}
else
AbortProcess ("COMMAND_LINE_ERROR");
}
break;
case OptionPassword:
GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs,
(char *) CmdVolumePassword.Text, sizeof (CmdVolumePassword.Text));
CmdVolumePassword.Length = strlen ((char *) CmdVolumePassword.Text);
CmdVolumePasswordValid = TRUE;
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
(char *) CmdVolumePassword.Text, sizeof (CmdVolumePassword.Text)))
{
CmdVolumePassword.Length = strlen ((char *) CmdVolumePassword.Text);
CmdVolumePasswordValid = TRUE;
}
else
AbortProcess ("COMMAND_LINE_ERROR");
break;
case OptionVolume:
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, nArgPos, &i,
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i,
nNoCommandLineArgs, szFileName, sizeof (szFileName)))
{
RelativePath2Absolute (szFileName);
AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory);
CmdLineVolumeSpecified = TRUE;
}
else
AbortProcess ("COMMAND_LINE_ERROR");
break;
case OptionQuit:
{
char szTmp[32];
char szTmp[32] = {0};
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs,
nArgPos, &i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
&i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
{
if (!_stricmp (szTmp, "UAC")) // Used to indicate non-install elevation
break;
if (!_stricmp (szTmp, "preferences"))
else if (!_stricmp (szTmp, "preferences"))
{
Quit = TRUE;
UsePreferences = TRUE;
break;
}
if (!_stricmp (szTmp, "background"))
else if (!_stricmp (szTmp, "background"))
bEnableBkgTask = TRUE;
else
AbortProcess ("COMMAND_LINE_ERROR");
}
Quit = TRUE;
@@ -7333,10 +7383,10 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
break;
case OptionTokenLib:
if (GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs, SecurityTokenLibraryPath, sizeof (SecurityTokenLibraryPath)) == HAS_ARGUMENT)
if (GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs, SecurityTokenLibraryPath, sizeof (SecurityTokenLibraryPath)) == HAS_ARGUMENT)
InitSecurityTokenLibrary(hwndDlg);
else
Error ("COMMAND_LINE_ERROR", hwndDlg);
AbortProcess ("COMMAND_LINE_ERROR");
break;
@@ -7352,9 +7402,9 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
case OptionPkcs5:
{
char szTmp[32];
char szTmp[32] = {0};
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs,
nArgPos, &i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
&i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
{
if (_stricmp(szTmp, "sha512") == 0 || _stricmp(szTmp, "sha-512") == 0)
CmdVolumePkcs5 = SHA512;
@@ -7367,27 +7417,31 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
else
{
CmdVolumePkcs5 = 0;
Error ("COMMAND_LINE_ERROR", hwndDlg);
AbortProcess ("COMMAND_LINE_ERROR");
}
}
else
Error ("COMMAND_LINE_ERROR", hwndDlg);
AbortProcess ("COMMAND_LINE_ERROR");
}
break;
case OptionTrueCryptMode:
CmdVolumeTrueCryptMode = TRUE;
break;
// no option = file name
// no option = file name if there is only one argument
default:
{
strcpy_s (szFileName, array_capacity (szFileName), lpszCommandLineArgs[i]);
RelativePath2Absolute (szFileName);
if (nNoCommandLineArgs == 1)
{
strcpy_s (szFileName, array_capacity (szFileName), lpszCommandLineArgs[i]);
RelativePath2Absolute (szFileName);
CmdLineVolumeSpecified = TRUE;
AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory);
AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory);
}
else
AbortProcess ("COMMAND_LINE_ERROR");
}
}
}