[systemd-devel] [PATCH] remove hasprefix(), use startswith()
Shawn Landden
shawnlandden at gmail.com
Wed Aug 21 18:20:55 PDT 2013
memcmp() could read from uninitilized memory if string is at the end
of a page boundry and shorter than prefix
---
TODO | 2 --
src/journal/journal-send.c | 2 +-
src/journal/journald-native.c | 12 ++++++------
src/libsystemd-bus/bus-match.c | 26 +++++++++++++-------------
src/shared/logs-show.c | 2 +-
src/shared/macro.h | 2 --
6 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/TODO b/TODO
index 9bc14fd..3800ce4 100644
--- a/TODO
+++ b/TODO
@@ -96,8 +96,6 @@ Features:
* systemctl list-unit-files should list generated files (and probably with a new state "generated" for them, or so)
-* do we really need both hasprefix() and startswith()?
-
* journald: when we drop syslog messages because the syslog socket is
full, make sure to write how many messages are lost as first thing
to syslog when it works again.
diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c
index fef66fc..d00e26f 100644
--- a/src/journal/journal-send.c
+++ b/src/journal/journal-send.c
@@ -245,7 +245,7 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) {
have_syslog_identifier = have_syslog_identifier ||
(c == (char *) iov[i].iov_base + 17 &&
- hasprefix(iov[i].iov_base, "SYSLOG_IDENTIFIER"));
+ startswith(iov[i].iov_base, "SYSLOG_IDENTIFIER"));
nl = memchr(iov[i].iov_base, '\n', iov[i].iov_len);
if (nl) {
diff --git a/src/journal/journald-native.c b/src/journal/journald-native.c
index 0f9af37..c50cf64 100644
--- a/src/journal/journald-native.c
+++ b/src/journal/journald-native.c
@@ -154,23 +154,23 @@ void server_process_native_message(
* of this entry for the rate limiting
* logic */
if (l == 10 &&
- hasprefix(p, "PRIORITY=") &&
+ startswith(p, "PRIORITY=") &&
p[9] >= '0' && p[9] <= '9')
priority = (priority & LOG_FACMASK) | (p[9] - '0');
else if (l == 17 &&
- hasprefix(p, "SYSLOG_FACILITY=") &&
+ startswith(p, "SYSLOG_FACILITY=") &&
p[16] >= '0' && p[16] <= '9')
priority = (priority & LOG_PRIMASK) | ((p[16] - '0') << 3);
else if (l == 18 &&
- hasprefix(p, "SYSLOG_FACILITY=") &&
+ startswith(p, "SYSLOG_FACILITY=") &&
p[16] >= '0' && p[16] <= '9' &&
p[17] >= '0' && p[17] <= '9')
priority = (priority & LOG_PRIMASK) | (((p[16] - '0')*10 + (p[17] - '0')) << 3);
else if (l >= 19 &&
- hasprefix(p, "SYSLOG_IDENTIFIER=")) {
+ startswith(p, "SYSLOG_IDENTIFIER=")) {
char *t;
t = strndup(p + 18, l - 18);
@@ -179,7 +179,7 @@ void server_process_native_message(
identifier = t;
}
} else if (l >= 8 &&
- hasprefix(p, "MESSAGE=")) {
+ startswith(p, "MESSAGE=")) {
char *t;
t = strndup(p + 8, l - 8);
@@ -189,7 +189,7 @@ void server_process_native_message(
}
} else if (l > strlen("OBJECT_PID=") &&
l < strlen("OBJECT_PID=") + DECIMAL_STR_MAX(pid_t) &&
- hasprefix(p, "OBJECT_PID=") &&
+ startswith(p, "OBJECT_PID=") &&
allow_object_pid(ucred)) {
char buf[DECIMAL_STR_MAX(pid_t)];
memcpy(buf, p + strlen("OBJECT_PID="), l - strlen("OBJECT_PID="));
diff --git a/src/libsystemd-bus/bus-match.c b/src/libsystemd-bus/bus-match.c
index 750acfe..1411167 100644
--- a/src/libsystemd-bus/bus-match.c
+++ b/src/libsystemd-bus/bus-match.c
@@ -555,22 +555,22 @@ static int bus_match_find_leaf(
enum bus_match_node_type bus_match_node_type_from_string(const char *k, size_t n) {
assert(k);
- if (n == 4 && hasprefix(k, "type"))
+ if (n == 4 && startswith(k, "type"))
return BUS_MATCH_MESSAGE_TYPE;
- if (n == 6 && hasprefix(k, "sender"))
+ if (n == 6 && startswith(k, "sender"))
return BUS_MATCH_SENDER;
- if (n == 11 && hasprefix(k, "destination"))
+ if (n == 11 && startswith(k, "destination"))
return BUS_MATCH_DESTINATION;
- if (n == 9 && hasprefix(k, "interface"))
+ if (n == 9 && startswith(k, "interface"))
return BUS_MATCH_INTERFACE;
- if (n == 6 && hasprefix(k, "member"))
+ if (n == 6 && startswith(k, "member"))
return BUS_MATCH_MEMBER;
- if (n == 4 && hasprefix(k, "path"))
+ if (n == 4 && startswith(k, "path"))
return BUS_MATCH_PATH;
- if (n == 14 && hasprefix(k, "path_namespace"))
+ if (n == 14 && startswith(k, "path_namespace"))
return BUS_MATCH_PATH_NAMESPACE;
- if (n == 4 && hasprefix(k, "arg")) {
+ if (n == 4 && startswith(k, "arg")) {
int j;
j = undecchar(k[3]);
@@ -580,7 +580,7 @@ enum bus_match_node_type bus_match_node_type_from_string(const char *k, size_t n
return BUS_MATCH_ARG + j;
}
- if (n == 5 && hasprefix(k, "arg")) {
+ if (n == 5 && startswith(k, "arg")) {
int a, b;
enum bus_match_node_type t;
@@ -596,7 +596,7 @@ enum bus_match_node_type bus_match_node_type_from_string(const char *k, size_t n
return t;
}
- if (n == 8 && hasprefix(k, "arg") && hasprefix(k + 4, "path")) {
+ if (n == 8 && startswith(k, "arg") && startswith(k + 4, "path")) {
int j;
j = undecchar(k[3]);
@@ -606,7 +606,7 @@ enum bus_match_node_type bus_match_node_type_from_string(const char *k, size_t n
return BUS_MATCH_ARG_PATH + j;
}
- if (n == 9 && hasprefix(k, "arg") && hasprefix(k + 5, "path")) {
+ if (n == 9 && startswith(k, "arg") && startswith(k + 5, "path")) {
enum bus_match_node_type t;
int a, b;
@@ -622,7 +622,7 @@ enum bus_match_node_type bus_match_node_type_from_string(const char *k, size_t n
return t;
}
- if (n == 13 && hasprefix(k, "arg") && hasprefix(k + 4, "namespace")) {
+ if (n == 13 && startswith(k, "arg") && startswith(k + 4, "namespace")) {
int j;
j = undecchar(k[3]);
@@ -632,7 +632,7 @@ enum bus_match_node_type bus_match_node_type_from_string(const char *k, size_t n
return BUS_MATCH_ARG_NAMESPACE + j;
}
- if (n == 14 && hasprefix(k, "arg") && hasprefix(k + 5, "namespace")) {
+ if (n == 14 && startswith(k, "arg") && startswith(k + 5, "namespace")) {
enum bus_match_node_type t;
int a, b;
diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c
index f0236ee..87633e7 100644
--- a/src/shared/logs-show.c
+++ b/src/shared/logs-show.c
@@ -536,7 +536,7 @@ static int output_export(
/* We already printed the boot id, from the data in
* the header, hence let's suppress it here */
if (length >= 9 &&
- hasprefix(data, "_BOOT_ID="))
+ startswith(data, "_BOOT_ID="))
continue;
if (!utf8_is_printable(data, length)) {
diff --git a/src/shared/macro.h b/src/shared/macro.h
index 0d3ff1c..d4f92b6 100644
--- a/src/shared/macro.h
+++ b/src/shared/macro.h
@@ -186,8 +186,6 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) {
#define char_array_0(x) x[sizeof(x)-1] = 0;
-#define hasprefix(s, prefix) (memcmp(s, prefix, strlen(prefix)) == 0)
-
#define IOVEC_SET_STRING(i, s) \
do { \
struct iovec *_i = &(i); \
--
1.8.4.rc3
More information about the systemd-devel
mailing list