summaryrefslogtreecommitdiff
path: root/src/locale/localed.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/locale/localed.c')
-rw-r--r--src/locale/localed.c60
1 files changed, 20 insertions, 40 deletions
diff --git a/src/locale/localed.c b/src/locale/localed.c
index 22950a60a9..bb2a3a2e54 100644
--- a/src/locale/localed.c
+++ b/src/locale/localed.c
@@ -271,24 +271,8 @@ static int read_data_x11(void) {
free_data_x11();
f = fopen("/etc/X11/xorg.conf.d/00-keyboard.conf", "re");
- if (!f) {
- if (errno == ENOENT) {
-
-#ifdef TARGET_FEDORA
- f = fopen("/etc/X11/xorg.conf.d/00-system-setup-keyboard.conf", "re");
- if (!f) {
- if (errno == ENOENT)
- return 0;
- else
- return -errno;
- }
-#else
- return 0;
-#endif
-
- } else
- return -errno;
- }
+ if (!f)
+ return errno == ENOENT ? 0 : -errno;
while (fgets(line, sizeof(line), f)) {
char *l;
@@ -577,21 +561,13 @@ static int write_data_x11(void) {
isempty(state.x11_variant) &&
isempty(state.x11_options)) {
-#ifdef TARGET_FEDORA
- unlink("/etc/X11/xorg.conf.d/00-system-setup-keyboard.conf");
-
- /* Symlink this to /dev/null, so that s-s-k (if it is
- * still running) doesn't recreate this. */
- symlink("/dev/null", "/etc/X11/xorg.conf.d/00-system-setup-keyboard.conf");
-#endif
-
if (unlink("/etc/X11/xorg.conf.d/00-keyboard.conf") < 0)
return errno == ENOENT ? 0 : -errno;
return 0;
}
- mkdir_parents_label("/etc/X11/xorg.conf.d", 0755);
+ mkdir_p_label("/etc/X11/xorg.conf.d", 0755);
r = fopen_temporary("/etc/X11/xorg.conf.d/00-keyboard.conf", &f, &temp_path);
if (r < 0)
@@ -624,18 +600,8 @@ static int write_data_x11(void) {
r = -errno;
unlink("/etc/X11/xorg.conf.d/00-keyboard.conf");
unlink(temp_path);
- } else {
-
-#ifdef TARGET_FEDORA
- unlink("/etc/X11/xorg.conf.d/00-system-setup-keyboard.conf");
-
- /* Symlink this to /dev/null, so that s-s-k (if it is
- * still running) doesn't recreate this. */
- symlink("/dev/null", "/etc/X11/xorg.conf.d/00-system-setup-keyboard.conf");
-#endif
-
+ } else
r = 0;
- }
fclose(f);
free(temp_path);
@@ -1073,7 +1039,9 @@ static DBusHandlerResult locale_message_handler(
size_t k;
k = strlen(names[p]);
- if (startswith(*i, names[p]) && (*i)[k] == '=') {
+ if (startswith(*i, names[p]) &&
+ (*i)[k] == '=' &&
+ string_is_safe((*i) + k + 1)) {
valid = true;
passed[p] = true;
@@ -1157,7 +1125,9 @@ static DBusHandlerResult locale_message_handler(
"Locale\0");
if (!changed)
goto oom;
- }
+ } else
+ strv_free(l);
+
} else if (dbus_message_is_method_call(message, "org.freedesktop.locale1", "SetVConsoleKeyboard")) {
const char *keymap, *keymap_toggle;
@@ -1182,6 +1152,10 @@ static DBusHandlerResult locale_message_handler(
if (!streq_ptr(keymap, state.vc_keymap) ||
!streq_ptr(keymap_toggle, state.vc_keymap_toggle)) {
+ if ((keymap && (!filename_is_safe(keymap) || !string_is_safe(keymap))) ||
+ (keymap_toggle && (!filename_is_safe(keymap_toggle) || !string_is_safe(keymap_toggle))))
+ return bus_send_error_reply(connection, message, NULL, -EINVAL);
+
r = verify_polkit(connection, message, "org.freedesktop.locale1.set-keyboard", interactive, NULL, &error);
if (r < 0)
return bus_send_error_reply(connection, message, &error, r);
@@ -1252,6 +1226,12 @@ static DBusHandlerResult locale_message_handler(
!streq_ptr(variant, state.x11_variant) ||
!streq_ptr(options, state.x11_options)) {
+ if ((layout && !string_is_safe(layout)) ||
+ (model && !string_is_safe(model)) ||
+ (variant && !string_is_safe(variant)) ||
+ (options && !string_is_safe(options)))
+ return bus_send_error_reply(connection, message, NULL, -EINVAL);
+
r = verify_polkit(connection, message, "org.freedesktop.locale1.set-keyboard", interactive, NULL, &error);
if (r < 0)
return bus_send_error_reply(connection, message, &error, r);