systemd/0002-util-don-t-consider-tabs-special-in-string_has_cc-an.patch

118 lines
4.3 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(-)
Index: src/hostname/hostnamed.c
===================================================================
--- src/hostname/hostnamed.c.orig
+++ src/hostname/hostnamed.c
@@ -507,8 +507,7 @@ static int set_machine_info(Context *c,
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);
Index: src/shared/env-util.c
===================================================================
--- src/shared/env-util.c.orig
+++ 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
Index: src/shared/fileio.c
===================================================================
--- src/shared/fileio.c.orig
+++ src/shared/fileio.c
@@ -658,7 +658,7 @@ static void write_env_var(FILE *f, const
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++) {
Index: src/shared/util.c
===================================================================
--- src/shared/util.c.orig
+++ src/shared/util.c
@@ -5466,16 +5466,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;
}
@@ -5483,16 +5481,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)
Index: src/shared/util.h
===================================================================
--- src/shared/util.h.orig
+++ src/shared/util.h
@@ -652,7 +652,7 @@ _alloc_(2, 3) static inline void *memdup
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.