131 lines
4.8 KiB
Diff
131 lines
4.8 KiB
Diff
From 6294aa76d818e831de4592b41a37e225fd0871f9 Mon Sep 17 00:00:00 2001
|
|
From: Lennart Poettering <lennart@poettering.net>
|
|
Date: Mon, 7 Jul 2014 12:04:55 +0200
|
|
Subject: [PATCH] util: don't consider tabs special in string_has_cc() anymore
|
|
|
|
Instead, take a list of exceptions to our usual CC check
|
|
---
|
|
src/hostname/hostnamed.c | 3 +--
|
|
src/shared/env-util.c | 4 +++-
|
|
src/shared/fileio.c | 2 +-
|
|
src/shared/util.c | 19 ++++++++++---------
|
|
src/shared/util.h | 5 +++--
|
|
5 files changed, 18 insertions(+), 15 deletions(-)
|
|
|
|
diff --git src/hostname/hostnamed.c src/hostname/hostnamed.c
|
|
index 14629dd..514554d 100644
|
|
--- src/hostname/hostnamed.c
|
|
+++ src/hostname/hostnamed.c
|
|
@@ -550,8 +550,7 @@ static int set_machine_info(Context *c, sd_bus *bus, sd_bus_message *m, int prop
|
|
|
|
if (prop == PROP_ICON_NAME && !filename_is_safe(name))
|
|
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid icon name '%s'", name);
|
|
- if (prop == PROP_PRETTY_HOSTNAME &&
|
|
- (string_has_cc(name) || chars_intersect(name, "\t")))
|
|
+ if (prop == PROP_PRETTY_HOSTNAME && string_has_cc(name, NULL))
|
|
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid pretty host name '%s'", name);
|
|
if (prop == PROP_CHASSIS && !valid_chassis(name))
|
|
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid chassis '%s'", name);
|
|
diff --git src/shared/env-util.c src/shared/env-util.c
|
|
index b2e4553..20b208f 100644
|
|
--- src/shared/env-util.c
|
|
+++ src/shared/env-util.c
|
|
@@ -78,7 +78,9 @@ bool env_value_is_valid(const char *e) {
|
|
if (!utf8_is_valid(e))
|
|
return false;
|
|
|
|
- if (string_has_cc(e))
|
|
+ /* bash allows tabs in environment variables, and so should
|
|
+ * we */
|
|
+ if (string_has_cc(e, "\t"))
|
|
return false;
|
|
|
|
/* POSIX says the overall size of the environment block cannot
|
|
diff --git src/shared/fileio.c src/shared/fileio.c
|
|
index fb1c1bc..b1de590 100644
|
|
--- src/shared/fileio.c
|
|
+++ src/shared/fileio.c
|
|
@@ -738,7 +738,7 @@ static void write_env_var(FILE *f, const char *v) {
|
|
p++;
|
|
fwrite(v, 1, p-v, f);
|
|
|
|
- if (string_has_cc(p) || chars_intersect(p, WHITESPACE "\'\"\\`$")) {
|
|
+ if (string_has_cc(p, NULL) || chars_intersect(p, WHITESPACE "\'\"\\`$")) {
|
|
fputc('\"', f);
|
|
|
|
for (; *p; p++) {
|
|
diff --git src/shared/util.c src/shared/util.c
|
|
index d25ee66..d223ecf 100644
|
|
--- src/shared/util.c
|
|
+++ src/shared/util.c
|
|
@@ -5350,16 +5350,14 @@ bool filename_is_safe(const char *p) {
|
|
bool string_is_safe(const char *p) {
|
|
const char *t;
|
|
|
|
- assert(p);
|
|
+ if (!p)
|
|
+ return false;
|
|
|
|
for (t = p; *t; t++) {
|
|
if (*t > 0 && *t < ' ')
|
|
return false;
|
|
|
|
- if (*t == 127)
|
|
- return false;
|
|
-
|
|
- if (strchr("\\\"\'", *t))
|
|
+ if (strchr("\\\"\'\0x7f", *t))
|
|
return false;
|
|
}
|
|
|
|
@@ -5367,16 +5365,19 @@ bool string_is_safe(const char *p) {
|
|
}
|
|
|
|
/**
|
|
- * Check if a string contains control characters.
|
|
- * Spaces and tabs are not considered control characters.
|
|
+ * Check if a string contains control characters. If 'ok' is non-NULL
|
|
+ * it may be a string containing additional CCs to be considered OK.
|
|
*/
|
|
-bool string_has_cc(const char *p) {
|
|
+bool string_has_cc(const char *p, const char *ok) {
|
|
const char *t;
|
|
|
|
assert(p);
|
|
|
|
for (t = p; *t; t++) {
|
|
- if (*t > 0 && *t < ' ' && *t != '\t')
|
|
+ if (ok && strchr(ok, *t))
|
|
+ return false;
|
|
+
|
|
+ if (*t > 0 && *t < ' ')
|
|
return true;
|
|
|
|
if (*t == 127)
|
|
diff --git src/shared/util.h src/shared/util.h
|
|
index e23069c..8544940 100644
|
|
--- src/shared/util.h
|
|
+++ src/shared/util.h
|
|
@@ -382,7 +382,8 @@ bool fstype_is_network(const char *fstype);
|
|
int chvt(int vt);
|
|
|
|
int read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl);
|
|
-int ask(char *ret, const char *replies, const char *text, ...) _printf_(3, 4);
|
|
+int ask_char(char *ret, const char *replies, const char *text, ...) _printf_(3, 4);
|
|
+int ask_string(char **ret, const char *text, ...) _printf_(2, 3);
|
|
|
|
int reset_terminal_fd(int fd, bool switch_to_text);
|
|
int reset_terminal(const char *name);
|
|
@@ -692,7 +693,7 @@ _alloc_(2, 3) static inline void *memdup_multiply(const void *p, size_t a, size_
|
|
bool filename_is_safe(const char *p) _pure_;
|
|
bool path_is_safe(const char *p) _pure_;
|
|
bool string_is_safe(const char *p) _pure_;
|
|
-bool string_has_cc(const char *p) _pure_;
|
|
+bool string_has_cc(const char *p, const char *ok) _pure_;
|
|
|
|
/**
|
|
* Check if a string contains any glob patterns.
|
|
--
|
|
1.7.9.2
|
|
|