[PATCH 2/8] reg: Add sane_path function to do preliniary key validation
Jonathan Vollebregt
jnvsor at gmail.com
Thu Nov 6 15:17:36 CST 2014
---
programs/reg/reg.c | 26 ++++++++++++++++++++++----
programs/reg/reg.rc | 2 +-
programs/reg/tests/reg.c | 4 ++--
3 files changed, 25 insertions(+), 7 deletions(-)
mode change 100644 => 100755 programs/reg/reg.c
diff --git a/programs/reg/reg.c b/programs/reg/reg.c
old mode 100644
new mode 100755
index d2fcabc..fa7b2df
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -20,6 +20,8 @@
#include <wine/unicode.h>
#include "reg.h"
+#define ERROR_NO_REMOTE 20000
+
static int reg_printfW(const WCHAR *msg, ...)
{
va_list va_args;
@@ -75,6 +77,8 @@ static int reg_print_error(LSTATUS error_code)
return 0;
case ERROR_BAD_COMMAND:
return reg_message(STRING_INVALID_CMDLINE);
+ case ERROR_NO_REMOTE:
+ return reg_message(STRING_NO_REMOTE);
default:
{
static const WCHAR error_string[] = {'%','0','5','d',':',' ','%','s',0};
@@ -186,6 +190,16 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r
return out_data;
}
+static LSTATUS sane_path(const WCHAR *key)
+{
+ int i = strlenW(key);
+
+ if (key[0] == '\\' && key[1] == '\\' && key[2] != '\\')
+ return ERROR_NO_REMOTE;
+
+ return ERROR_SUCCESS;
+}
+
static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
WCHAR *type, WCHAR separator, WCHAR *data, BOOL force)
{
@@ -193,12 +207,14 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
' ','%','s',' ','%','d',' ','%','s',' ','%','s',' ','%','d','\n',0};
LPWSTR p;
HKEY root,subkey;
+ LONG err;
reg_printfW(stubW, key_name, value_name, value_empty, type, data, force);
- if (key_name[0]=='\\' && key_name[1]=='\\')
+ err = sane_path(key_name);
+ if (err != ERROR_SUCCESS)
{
- reg_message(STRING_NO_REMOTE);
+ reg_print_error(err);
return 1;
}
@@ -263,15 +279,17 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
{
LPWSTR p;
HKEY root,subkey;
+ LONG err;
static const WCHAR stubW[] = {'D','E','L','E','T','E',
' ','-',' ','%','s',' ','%','s',' ','%','d',' ','%','d',' ','%','d','\n'
,0};
reg_printfW(stubW, key_name, value_name, value_empty, value_all, force);
- if (key_name[0]=='\\' && key_name[1]=='\\')
+ err = sane_path(key_name);
+ if (err != ERROR_SUCCESS)
{
- reg_message(STRING_NO_REMOTE);
+ reg_print_error(err);
return 1;
}
diff --git a/programs/reg/reg.rc b/programs/reg/reg.rc
index 6183aaa..5fc5a76 100644
--- a/programs/reg/reg.rc
+++ b/programs/reg/reg.rc
@@ -33,7 +33,7 @@ STRINGTABLE
STRING_SUCCESS, "The operation completed successfully\n"
STRING_INVALID_KEY, "Error: Invalid key name\n"
STRING_INVALID_CMDLINE, "Error: Invalid command line parameters\n"
- STRING_NO_REMOTE, "Error: Unable to add keys to remote machine\n"
+ STRING_NO_REMOTE, "Error: Unable to access remote machine\n"
STRING_CANNOT_FIND, "Error: The system was unable to find the specified registry key or value\n"
STRING_ERROR, "Unexpected error: "
}
diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
index f93df55..57e0108 100644
--- a/programs/reg/tests/reg.c
+++ b/programs/reg/tests/reg.c
@@ -129,10 +129,10 @@ static void test_add(void)
ok(err == ERROR_FILE_NOT_FOUND, "got exit code %d\n", r);
run_reg_exe("reg add HKCU\\" KEY_BASE "\\keytest2\\\\ /f", &r);
- todo_wine ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */),
+ ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */),
"got exit code %u\n", r);
err = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE "\\keytest2");
- todo_wine ok(err == ERROR_FILE_NOT_FOUND || broken(err == ERROR_SUCCESS /* WinXP */),
+ ok(err == ERROR_FILE_NOT_FOUND || broken(err == ERROR_SUCCESS /* WinXP */),
"got exit code %d\n", r);
run_reg_exe("reg add HKCU\\" KEY_BASE "\\keytest3\\ /f", &r);
--
2.1.1
More information about the wine-patches
mailing list