https://git.reactos.org/?p=reactos.git;a=commitdiff;h=71197535a1031eb137700…
commit 71197535a1031eb137700d9ba0821210edeb51be
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Thu Jul 25 18:57:23 2024 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Wed Jul 31 11:41:24 2024 +0200
[SETUPLIB][USETUP] Improve IsValidInstallDirectory() behaviour (#7187)
CORE-6149, CORE-6179, CORE-9529
See also commits d329fbebf (r66995), 7c3f4c94a (r68307), and 16daf6700.
The function verifies that each path component of the directory is
a valid 8.3 name, not . or .. nor empty. This behaviour is compatible
with what can be observed from Windows XP/2003 installer.
(To reliably test this with the Windows installer, you need to modify
the TXTSETUP.SIF DefaultPath value in the [SetupData] section.)
---
base/setup/lib/setuplib.c | 100 ++++++++++++++++++++++++++++++++++------------
1 file changed, 74 insertions(+), 26 deletions(-)
diff --git a/base/setup/lib/setuplib.c b/base/setup/lib/setuplib.c
index 22ec4afc3fe..9fb91b24f80 100644
--- a/base/setup/lib/setuplib.c
+++ b/base/setup/lib/setuplib.c
@@ -712,51 +712,99 @@ InitSystemPartition(
return TRUE;
}
+
+#define IS_PATH_SEPARATOR(c) ((c) == L'\\' || (c) == L'/')
+
+/**
+ * @brief
+ * Verify whether the given directory is suitable for ReactOS installation.
+ * Each path component must be a valid 8.3 name.
+ **/
BOOLEAN
IsValidInstallDirectory(
_In_ PCWSTR InstallDir)
{
- UINT i, Length;
+ PCWCH p;
+
+ /* As with the NT installer, fail if the path is empty or "\\" */
+ p = InstallDir;
+ if (!*p || (IS_PATH_SEPARATOR(*p) && !*(p + 1)))
+ return FALSE;
- Length = wcslen(InstallDir);
+ /* The path must contain only valid characters (alpha-numeric,
+ * '.', '\\', '-' and '_'). Spaces are not accepted. */
+ for (p = InstallDir; *p; ++p)
+ {
+ if (!IS_VALID_INSTALL_PATH_CHAR(*p))
+ return FALSE;
+ }
- // TODO: Add check for 8.3 too.
+ /*
+ * Loop over each path component and verify that each is a valid 8.3 name.
+ */
+ for (p = InstallDir; *p;)
+ {
+ PCWSTR Path;
+ SIZE_T Length;
+ UNICODE_STRING Name;
+ BOOLEAN IsNameLegal, SpacesInName;
+
+ /* Skip any first separator */
+ if (IS_PATH_SEPARATOR(*p))
+ ++p;
+
+ /* Now skip past the path component until we reach the next separator */
+ Path = p;
+ while (*p && !IS_PATH_SEPARATOR(*p))
+ ++p;
+ if (p == Path)
+ {
+ /* Succeed if nothing else follows this separator; otherwise
+ * it's a separator and consecutive ones are not supported */
+ return (!*p);
+ }
- /* Path must be at least 2 characters long */
-// if (Length < 2)
-// return FALSE;
+ /* Calculate the path component length */
+ Length = p - Path;
- /* Path must start with a backslash */
-// if (InstallDir[0] != L'\\')
-// return FALSE;
+ /* As with the NT installer, fail for '.' and '..';
+ * RtlIsNameLegalDOS8Dot3() would succeed otherwise */
+ if ((Length == 1 && *Path == '.') || (Length == 2 && *Path == '.' && *(Path + 1) == '.'))
+ return FALSE;
- /* Path must not end with a backslash */
- if (InstallDir[Length - 1] == L'\\')
- return FALSE;
+ /* As with the NT installer, allow _only ONE trailing_ dot in
+ * the path component (but not 2 or more), by reducing Length
+ * in that case; RtlIsNameLegalDOS8Dot3() would fail otherwise */
+ if (Length > 1 && *(p - 2) != L'.' && *(p - 1) == L'.')
+ --Length;
- /* Path must not contain whitespace characters */
- for (i = 0; i < Length; i++)
- {
- if (iswspace(InstallDir[i]))
+ if (Length == 0)
return FALSE;
- }
- /* Path component must not end with a dot */
- for (i = 0; i < Length; i++)
- {
- if (InstallDir[i] == L'\\' && i > 0)
+ /* Verify that the path component is a valid 8.3 name */
+ // if (Length > 8+1+3)
+ // return FALSE;
+ Name.Length = Name.MaximumLength = (USHORT)(Length * sizeof(WCHAR));
+ Name.Buffer = (PWCHAR)Path;
+ SpacesInName = FALSE;
+ IsNameLegal = RtlIsNameLegalDOS8Dot3(&Name, NULL, &SpacesInName);
+
+ /* If it isn't legal or contain spaces, fail */
+ if (!IsNameLegal || SpacesInName)
{
- if (InstallDir[i - 1] == L'.')
- return FALSE;
+ DPRINT("'%wZ' is %s 8.3 filename %s spaces\n",
+ &Name,
+ (IsNameLegal ? "a valid" : "an invalid"),
+ (SpacesInName ? "with" : "without"));
+ return FALSE;
}
+ /* Go to the next path component */
}
- if (InstallDir[Length - 1] == L'.')
- return FALSE;
-
return TRUE;
}
+
NTSTATUS
InitDestinationPaths(
IN OUT PUSETUP_DATA pSetupData,
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=785cc2159853702aad4ab…
commit 785cc2159853702aad4abad22167f220d55a0f64
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Thu Jul 25 18:57:23 2024 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Wed Jul 31 11:40:21 2024 +0200
[SETUPLIB][USETUP] Move IsValidPath() back into setuplib for reusability (#7186)
Reverts the IsValidPath() move done in commit 9c64b57dc.
- Turn IsValidPath() into a IsValidInstallDirectory() helper function
available in the setuplib, so that it can also be used in the GUI setup.
- Introduce a IS_VALID_INSTALL_PATH_CHAR() macro.
---
base/setup/lib/setuplib.c | 45 +++++++++++++++++++++++++++++++++++++
base/setup/lib/setuplib.h | 7 ++++++
base/setup/usetup/usetup.c | 55 +++++-----------------------------------------
3 files changed, 58 insertions(+), 49 deletions(-)
diff --git a/base/setup/lib/setuplib.c b/base/setup/lib/setuplib.c
index 2e915c52580..22ec4afc3fe 100644
--- a/base/setup/lib/setuplib.c
+++ b/base/setup/lib/setuplib.c
@@ -712,6 +712,51 @@ InitSystemPartition(
return TRUE;
}
+BOOLEAN
+IsValidInstallDirectory(
+ _In_ PCWSTR InstallDir)
+{
+ UINT i, Length;
+
+ Length = wcslen(InstallDir);
+
+ // TODO: Add check for 8.3 too.
+
+ /* Path must be at least 2 characters long */
+// if (Length < 2)
+// return FALSE;
+
+ /* Path must start with a backslash */
+// if (InstallDir[0] != L'\\')
+// return FALSE;
+
+ /* Path must not end with a backslash */
+ if (InstallDir[Length - 1] == L'\\')
+ return FALSE;
+
+ /* Path must not contain whitespace characters */
+ for (i = 0; i < Length; i++)
+ {
+ if (iswspace(InstallDir[i]))
+ return FALSE;
+ }
+
+ /* Path component must not end with a dot */
+ for (i = 0; i < Length; i++)
+ {
+ if (InstallDir[i] == L'\\' && i > 0)
+ {
+ if (InstallDir[i - 1] == L'.')
+ return FALSE;
+ }
+ }
+
+ if (InstallDir[Length - 1] == L'.')
+ return FALSE;
+
+ return TRUE;
+}
+
NTSTATUS
InitDestinationPaths(
IN OUT PUSETUP_DATA pSetupData,
diff --git a/base/setup/lib/setuplib.h b/base/setup/lib/setuplib.h
index 411b810232a..43fe3a866f9 100644
--- a/base/setup/lib/setuplib.h
+++ b/base/setup/lib/setuplib.h
@@ -177,6 +177,13 @@ InitSystemPartition(
_In_opt_ PFSVOL_CALLBACK FsVolCallback,
_In_opt_ PVOID Context);
+#define IS_VALID_INSTALL_PATH_CHAR(c) \
+ (iswalnum(c) || (c) == L'.' || (c) == L'\\' || (c) == L'-' || (c) == L'_')
+
+BOOLEAN
+IsValidInstallDirectory(
+ _In_ PCWSTR InstallDir);
+
NTSTATUS
InitDestinationPaths(
IN OUT PUSETUP_DATA pSetupData,
diff --git a/base/setup/usetup/usetup.c b/base/setup/usetup/usetup.c
index f765ce6f180..204c92715c1 100644
--- a/base/setup/usetup/usetup.c
+++ b/base/setup/usetup/usetup.c
@@ -2866,52 +2866,6 @@ FsVolCallback(
}
-static BOOLEAN
-IsValidPath(
- IN PCWSTR InstallDir)
-{
- UINT i, Length;
-
- Length = wcslen(InstallDir);
-
- // TODO: Add check for 8.3 too.
-
- /* Path must be at least 2 characters long */
-// if (Length < 2)
-// return FALSE;
-
- /* Path must start with a backslash */
-// if (InstallDir[0] != L'\\')
-// return FALSE;
-
- /* Path must not end with a backslash */
- if (InstallDir[Length - 1] == L'\\')
- return FALSE;
-
- /* Path must not contain whitespace characters */
- for (i = 0; i < Length; i++)
- {
- if (iswspace(InstallDir[i]))
- return FALSE;
- }
-
- /* Path component must not end with a dot */
- for (i = 0; i < Length; i++)
- {
- if (InstallDir[i] == L'\\' && i > 0)
- {
- if (InstallDir[i - 1] == L'.')
- return FALSE;
- }
- }
-
- if (InstallDir[Length - 1] == L'.')
- return FALSE;
-
- return TRUE;
-}
-
-
/*
* Displays the InstallDirectoryPage.
*
@@ -2951,7 +2905,7 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
* of an invalid path, or we are in regular setup), display the UI and allow
* the user to specify a new installation path.
*/
- if ((RepairUpdateFlag || IsUnattendedSetup) && IsValidPath(InstallDir))
+ if ((RepairUpdateFlag || IsUnattendedSetup) && IsValidInstallDirectory(InstallDir))
{
Status = InitDestinationPaths(&USetupData, InstallDir, InstallPartition);
if (!NT_SUCCESS(Status))
@@ -3059,7 +3013,7 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
* Check for the validity of the installation directory and pop up
* an error if it is not the case. Then the user can fix its input.
*/
- if (!IsValidPath(InstallDir))
+ if (!IsValidInstallDirectory(InstallDir))
{
MUIDisplayError(ERROR_DIRECTORY_NAME, Ir, POPUP_WAIT_ENTER);
return INSTALL_DIRECTORY_PAGE;
@@ -3106,8 +3060,11 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
{
if (Length < 50)
{
+ /* Only accept valid characters for installation path
+ * (alpha-numeric, '.', '\', '-' and '_'). Note that
+ * spaces are not accepted. */
c = (WCHAR)Ir->Event.KeyEvent.uChar.AsciiChar;
- if (iswalpha(c) || iswdigit(c) || c == '.' || c == '\\' || c == '-' || c == '_')
+ if (IS_VALID_INSTALL_PATH_CHAR(c))
{
if (Pos < Length)
memmove(&InstallDir[Pos + 1],
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a532a68d40feee2422baa…
commit a532a68d40feee2422baac4d092ce8ce829e293b
Author: Joachim Henze <joachim.henze(a)reactos.org>
AuthorDate: Wed Jul 31 03:48:09 2024 +0200
Commit: GitHub <noreply(a)github.com>
CommitDate: Wed Jul 31 03:48:09 2024 +0200
[RASDLG] ro-RO.rc: Fix 2 compiler warnings (#7197)
which have been introduced during 0.4.15-dev'ing when romanian resources were updated.
C:\buildbot_config\worker\Build_MSVC_x86\build\dll\win32\rasdlg\lang/ro-RO.rc(508) : warning RC4206 : title string too long; truncated at 256
C:\buildbot_config\worker\Build_MSVC_x86\build\dll\win32\rasdlg\lang/ro-RO.rc(521) : warning RC4206 : title string too long; truncated at 256
see MSVC builder https://build.reactos.org/#builders/1/builds/24117
The fix respects the rule 1 of the Romania translation notes also, same as Andreis commit did.
Also fix a few places where ". " was the case (unintended double-space)
---
dll/win32/rasdlg/lang/ro-RO.rc | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/dll/win32/rasdlg/lang/ro-RO.rc b/dll/win32/rasdlg/lang/ro-RO.rc
index 466691fb793..ec74e04a6fa 100644
--- a/dll/win32/rasdlg/lang/ro-RO.rc
+++ b/dll/win32/rasdlg/lang/ro-RO.rc
@@ -145,7 +145,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
CAPTION "Apelare inversă"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Aveţi pe server privilegiul de apelare inversă 'Stabilit de apelant'. Apăsaţi pe OK, iar serverul vă va apela la numărul de mai jos. Pentru a ignora apelarea inversă, apăsaţi pe Revocare.", 1066, 5, 5, 221, 39, SS_NOPREFIX
+ LTEXT "Aveţi pe server privilegiul de apelare inversă 'Stabilit de apelant'. Apăsaţi pe OK, iar serverul vă va apela la numărul de mai jos. Pentru a ignora apelarea inversă, apăsaţi pe Revocare.", 1066, 5, 5, 221, 39, SS_NOPREFIX
LTEXT "&Introduceţi numărul de telefon al modemului:", 1067, 5, 46, 222, 8, NOT WS_GROUP
EDITTEXT 1065, 5, 57, 221, 14, ES_AUTOHSCROLL
DEFPUSHBUTTON "OK", 1, 100, 85, 60, 14, WS_GROUP
@@ -423,7 +423,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION
CAPTION "Formarea manuală a numărului"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Ridicaţi receptorul şi formaţi numărul (sau cereţi operatorului să îl formeze). După ce apelarea s-a terminat, faceţi clic pe OK. Ascultaţi la receptor până devine silenţios, apoi suspendaţi.", 1281, 8, 8, 219, 32
+ LTEXT "Ridicaţi receptorul şi formaţi numărul (sau cereţi operatorului să îl formeze). După ce apelarea s-a terminat, faceţi clic pe OK. Ascultaţi la receptor până devine silenţios, apoi suspendaţi.", 1281, 8, 8, 219, 32
LTEXT "Număr de telefon:", 1282, 8, 46, 91, 8
LTEXT "", 1283, 103, 46, 126, 8, NOT WS_GROUP
DEFPUSHBUTTON "OK", 1, 104, 70, 60, 14, WS_GROUP
@@ -505,7 +505,7 @@ END
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Este necesar să stabiliţi acreditările pentru apeluri dinspre exterior, pe care le vor utiliza distribuitoarele la distanţă când se conectează la interfaţă. Cu informaţiile pe care le introduceţi aici se creează un cont utilizator pentru acest distribuitor.", 1094, 8, 5, 307, 35
+ LTEXT "Este necesară stabilirea datelor de autentificare pe care serverul de redirecţionare le va folosi pentru conectarea la această interfaţă. În consecinţă, din informaţiile oferite aici va fi creat un nou cont de utilizator în serverul de redirecţionare.", 1094, 8, 5, 307, 35
LTEXT "Nume &utilizator:", 1078, 8, 47, 124, 8, NOT WS_GROUP
EDITTEXT 1074, 135, 45, 175, 12, ES_AUTOHSCROLL | WS_DISABLED
LTEXT "&Parolă:", 1077, 8, 68, 124, 8, NOT WS_GROUP
@@ -518,7 +518,7 @@ END
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Este necesar să stabiliţi acreditările pentru apeluri dinspre interior, pe care le va utiliza interfaţa când se conectează la distribuitorul la distanţă. Aceste acreditări trebuie să concorde cu acreditările pentru apeluri dinspre exterior configurate pe distribuitorul la distanţă.", 1094, 8, 5, 308, 33
+ LTEXT "Este necesară stabilirea datelor de autentificare pe care această interfaţă le va folosi pentru conectarea la serverul de redirecţionare. Aceste date trebuie să corespundă cu datele de autentificare configurate în serverul de redirecţionare.", 1094, 8, 5, 308, 33
LTEXT "Nume &utilizator:", 1096, 8, 43, 130, 8, NOT WS_GROUP
EDITTEXT 1091, 140, 40, 175, 12, ES_AUTOHSCROLL
LTEXT "&Domeniu:", 1093, 8, 63, 130, 8, NOT WS_GROUP
@@ -1865,7 +1865,7 @@ BEGIN
215 "Fişiere de comandă rapidă pentru apelare (*.rnk)\0"
216 "*.rnk\0"
217 "Creare comandă rapidă pentru apelare\0"
- 218 "Legarea la %1 nu a reuşit. Reconectare în aşteptare…\0"
+ 218 "Legarea la %1 nu a reuşit. Reconectare în aşteptare…\0"
219 "Imposibil de regăsit informaţiile de încadrare.\0"
220 "Imposibil de regăsit informaţiile port-ului.\0"
221 "Imposibil de regăsit informaţiile proiecţiei.\0"
@@ -1955,7 +1955,7 @@ BEGIN
305 "Nu s-a selectat nici o agendă telefonică alternativă.\0"
306 "Imposibil de configurat dinamic acel dispozitiv.\0"
307 "Imposibil de şters intrarea deoarece este conectată.\0"
- 308 "Nu este selectată nici o intrare. Pentru a crea o intrare apăsaţi pe butonul Nou.\0"
+ 308 "Nu este selectată nici o intrare. Pentru a crea o intrare apăsaţi pe butonul Nou.\0"
309 "Când se selectează 'specificarea unei adrese IP' este necesar să furnizaţi o adresă IP diferită de zero.\0"
310 "Se solicită o adresă X.25 atunci când se selectează o reţea de apelare X.25 sau un dispozitiv X.25.\0"
311 "(nici una)\0"
@@ -2213,11 +2213,11 @@ BEGIN
1567 " (criptare activată)\0"
1568 "Informaţii cont Internet\0"
1569 "Aveţi nevoie de nume de cont şi parolă pentru a semna la intrarea în contul Internet.\0"
- 1570 "Pachetul EAP selectat nu oferă chei de criptare. Selectaţi un pachet EAP care furnizează chei sau selectaţi să nu se cripteze.\0"
+ 1570 "Pachetul EAP selectat nu oferă chei de criptare. Selectaţi un pachet EAP care furnizează chei sau selectaţi să nu se cripteze.\0"
1571 "Selecţia curentă de criptare solicită metode de securitate la Log on de tip EAP sau unele versiuni ale MS-CHAP.\0"
1572 "Protocoale şi securitate\0"
1573 "Selectaţi opţiunile de transport şi securitate pentru această conexiune.\0"
- 1574 "Protocoalele selectate includ PAP, SPAP şi/sau CHAP. Dacă se trece peste unul din ele, nu se va face criptarea datelor. Păstraţi aceste setări?\0"
+ 1574 "Protocoalele selectate includ PAP, SPAP şi/sau CHAP. Dacă se trece peste unul din ele, nu se va face criptarea datelor. Păstraţi aceste setări?\0"
1575 "Pentru a vă conecta la '%1', mai întâi trebuie să fiţi conectat la '%2'. Vă conectaţi la '%2' acum?\0"
1576 "Conectare pe cablu paralel…\0"
1577 "Conectare pe infraroşu…\0"
@@ -2244,7 +2244,7 @@ BEGIN
1612 "Aţi selectat utilizarea unei chei pre-distribuite dar nu aţi introdus nici una.\nIntroduceţi cheia pre-distribuită.\0"
1613 "Imposibil de angajat acreditările\0"
1634 "Deoarece serviciul Instrumentaţie de management ReactOS (WMI) s-a dezactivat, ReactOS nu afişează proprietăţile acestei conexiuni sau reţeaua de pornire.\n\nPentru a configura proprietăţile acestei conexiuni sau ale reţelei de la domiciliu, este necesar să activaţi mai întâi serviciul WMI. Pentru a realiza acest lucru, în Instrumente administrative din Panoul de control faceţi dublu clic pe Servicii, faceţi clic cu butonul din dreapta pe Instrumentaţia de management ReactOS, ap [...]
- 1635 "ReactOS nu afişează proprietăţile acestei conexiuni. Este posibil ca informaţiile din Instrumentaţia de management ReactOS (WMI) să fie deteriorate. Pentru a corecta aceasta, utilizaţi Restabilire sistem pentru a restabili ReactOS la un moment anterior (numit punct de restabilire). Restabilire sistem este amplasat în folderul Instrumente sistem din Accesorii.\0"
+ 1635 "ReactOS nu afişează proprietăţile acestei conexiuni. Este posibil ca informaţiile din Instrumentaţia de management ReactOS (WMI) să fie deteriorate. Pentru a corecta aceasta, utilizaţi Restabilire sistem pentru a restabili ReactOS la un moment anterior (numit punct de restabilire). Restabilire sistem este amplasat în folderul Instrumente sistem din Accesorii.\0"
1646 "Se permite solicitare ecou la sosire\0"
1647 "Se permite solicitare marcă de timp de intrare\0"
1648 "Se permite solicitare mască de intrare\0"
@@ -2270,7 +2270,7 @@ BEGIN
1672 "Când computerul renunţă la o transmisie de date incompletă deoarece transmisia completă a solicitat mai mult timp decât este permis, el va răspunde expeditorului cu un mesaj ""timp expirat"".\0"
1673 "Datele trimise din acest computer vor fi redistribuite dacă se schimbă calea implicită.\0"
1675 "Valoarea introdusă pentru dimensiunea fişierului jurnal nu este corectă. Introduceţi o valoare între 1 şi 32767 k.\0"
- 1685 "Contul utilizator nu are permisiunea de a utiliza această conexiune. De obicei, acest lucru se întâmplă deoarece aţi făcut Log on ca Vizitator.\0"
+ 1685 "Contul utilizator nu are permisiunea de a utiliza această conexiune. De obicei, acest lucru se întâmplă deoarece aţi făcut Log on ca Vizitator.\0"
1686 "Tastaţi numele contului şi parola. (Dacă aţi uitat numele contului sau parola, contactaţi administratorul reţelei.)\0"
1687 "&Nume computer\0"
1688 "&Nume furnizor ISP\0"