mirror of
https://github.com/Dasharo/systemd.git
synced 2026-03-06 15:02:31 -08:00
sd-journal: make sure sd_journal_add_match() also accepts SIZE_MAX as size
In many of our internal functions that take a pointer + a size we have introduced the rule that SIZE_MAX as size means: take strlen(). sd_journal_add_match() has something similar, but the special value is 0, not SIZE_MAX. This is a bit ugly, since a zero size data block is theoretically fine. The only reason sd_journal_add_match() gets away with using this special value is because valid matches must consist of at least 2 chars, hence cannot be zero. But let's make this more robust and less surprising when compared to the rest of our code, and *also* accept SIZE_MAX to mean strlen(). No actual code changes, just some clean-up.
This commit is contained in:
committed by
Yu Watanabe
parent
7072777163
commit
e1771c8ee6
@@ -95,7 +95,7 @@ static int add_match(sd_journal *j, const char *match) {
|
||||
if (field)
|
||||
r = journal_add_match_pair(j, field, match);
|
||||
else
|
||||
r = sd_journal_add_match(j, match, 0);
|
||||
r = sd_journal_add_match(j, match, SIZE_MAX);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match \"%s%s%s\": %m",
|
||||
strempty(field), field ? "=" : "", match);
|
||||
@@ -106,11 +106,11 @@ static int add_match(sd_journal *j, const char *match) {
|
||||
static int add_matches(sd_journal *j, char **matches) {
|
||||
int r;
|
||||
|
||||
r = sd_journal_add_match(j, "MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR, 0);
|
||||
r = sd_journal_add_match(j, "MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR, SIZE_MAX);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match \"%s\": %m", "MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR);
|
||||
|
||||
r = sd_journal_add_match(j, "MESSAGE_ID=" SD_MESSAGE_BACKTRACE_STR, 0);
|
||||
r = sd_journal_add_match(j, "MESSAGE_ID=" SD_MESSAGE_BACKTRACE_STR, SIZE_MAX);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match \"%s\": %m", "MESSAGE_ID=" SD_MESSAGE_BACKTRACE_STR);
|
||||
|
||||
|
||||
@@ -75,12 +75,12 @@ static int acquire_first_emergency_log_message(char **ret) {
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add boot ID filter: %m");
|
||||
|
||||
r = sd_journal_add_match(j, "_UID=0", 0);
|
||||
r = sd_journal_add_match(j, "_UID=0", SIZE_MAX);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add User ID filter: %m");
|
||||
|
||||
assert_cc(0 == LOG_EMERG);
|
||||
r = sd_journal_add_match(j, "PRIORITY=0", 0);
|
||||
r = sd_journal_add_match(j, "PRIORITY=0", SIZE_MAX);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add Emergency filter: %m");
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ static int add_dmesg(sd_journal *j) {
|
||||
if (!arg_dmesg)
|
||||
return 0;
|
||||
|
||||
r = sd_journal_add_match(j, "_TRANSPORT=kernel", 0);
|
||||
r = sd_journal_add_match(j, "_TRANSPORT=kernel", SIZE_MAX);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -440,7 +440,7 @@ static int add_matches(sd_journal *j, char **args) {
|
||||
have_term = true;
|
||||
|
||||
} else {
|
||||
r = sd_journal_add_match(j, *i, 0);
|
||||
r = sd_journal_add_match(j, *i, SIZE_MAX);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match '%s': %m", *i);
|
||||
have_term = true;
|
||||
|
||||
@@ -233,7 +233,11 @@ _public_ int sd_journal_add_match(sd_journal *j, const void *data, size_t size)
|
||||
assert_return(!journal_origin_changed(j), -ECHILD);
|
||||
assert_return(data, -EINVAL);
|
||||
|
||||
if (size == 0)
|
||||
/* If the size is unspecified, assume it's a string. Note: 0 is the public value we document for
|
||||
* this, for historical reasons. Internally, we pretty widely started using SIZE_MAX for this in
|
||||
* similar cases however, hence accept that too. And internally we actually prefer it, to make things
|
||||
* less surprising. */
|
||||
if (IN_SET(size, 0, SIZE_MAX))
|
||||
size = strlen(data);
|
||||
|
||||
if (!match_is_valid(data, size))
|
||||
@@ -336,7 +340,7 @@ int journal_add_match_pair(sd_journal *j, const char *field, const char *value)
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
|
||||
return sd_journal_add_match(j, s, 0);
|
||||
return sd_journal_add_match(j, s, SIZE_MAX);
|
||||
}
|
||||
|
||||
int journal_add_matchf(sd_journal *j, const char *format, ...) {
|
||||
@@ -353,7 +357,7 @@ int journal_add_matchf(sd_journal *j, const char *format, ...) {
|
||||
if (r < 0)
|
||||
return -ENOMEM;
|
||||
|
||||
return sd_journal_add_match(j, s, 0);
|
||||
return sd_journal_add_match(j, s, SIZE_MAX);
|
||||
}
|
||||
|
||||
_public_ int sd_journal_add_conjunction(sd_journal *j) {
|
||||
|
||||
@@ -17,8 +17,8 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
assert_se(sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY | SD_JOURNAL_ASSUME_IMMUTABLE) >= 0);
|
||||
|
||||
assert_se(sd_journal_add_match(j, "_TRANSPORT=syslog", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "_UID=0", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "_TRANSPORT=syslog", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "_UID=0", SIZE_MAX) >= 0);
|
||||
|
||||
SD_JOURNAL_FOREACH_BACKWARDS(j) {
|
||||
const void *d;
|
||||
|
||||
@@ -18,38 +18,38 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
assert_se(sd_journal_open(&j, SD_JOURNAL_ASSUME_IMMUTABLE) >= 0);
|
||||
|
||||
assert_se(sd_journal_add_match(j, "foobar", 0) < 0);
|
||||
assert_se(sd_journal_add_match(j, "foobar=waldo", 0) < 0);
|
||||
assert_se(sd_journal_add_match(j, "", 0) < 0);
|
||||
assert_se(sd_journal_add_match(j, "=", 0) < 0);
|
||||
assert_se(sd_journal_add_match(j, "=xxxxx", 0) < 0);
|
||||
assert_se(sd_journal_add_match(j, "foobar", SIZE_MAX) < 0);
|
||||
assert_se(sd_journal_add_match(j, "foobar=waldo", SIZE_MAX) < 0);
|
||||
assert_se(sd_journal_add_match(j, "", SIZE_MAX) < 0);
|
||||
assert_se(sd_journal_add_match(j, "=", SIZE_MAX) < 0);
|
||||
assert_se(sd_journal_add_match(j, "=xxxxx", SIZE_MAX) < 0);
|
||||
assert_se(sd_journal_add_match(j, (uint8_t[4]){'A', '=', '\1', '\2'}, 4) >= 0);
|
||||
assert_se(sd_journal_add_match(j, (uint8_t[5]){'B', '=', 'C', '\0', 'D'}, 5) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "HALLO=WALDO", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "QUUX=mmmm", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "QUUX=xxxxx", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "HALLO=", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "QUUX=xxxxx", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "QUUX=yyyyy", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "PIFF=paff", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "HALLO=WALDO", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "QUUX=mmmm", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "QUUX=xxxxx", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "HALLO=", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "QUUX=xxxxx", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "QUUX=yyyyy", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "PIFF=paff", SIZE_MAX) >= 0);
|
||||
|
||||
assert_se(sd_journal_add_disjunction(j) >= 0);
|
||||
|
||||
assert_se(sd_journal_add_match(j, "ONE=one", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "ONE=two", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "TWO=two", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "ONE=one", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "ONE=two", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "TWO=two", SIZE_MAX) >= 0);
|
||||
|
||||
assert_se(sd_journal_add_conjunction(j) >= 0);
|
||||
|
||||
assert_se(sd_journal_add_match(j, "L4_1=yes", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "L4_1=ok", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "L4_2=yes", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "L4_2=ok", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "L4_1=yes", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "L4_1=ok", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "L4_2=yes", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "L4_2=ok", SIZE_MAX) >= 0);
|
||||
|
||||
assert_se(sd_journal_add_disjunction(j) >= 0);
|
||||
|
||||
assert_se(sd_journal_add_match(j, "L3=yes", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "L3=ok", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "L3=yes", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "L3=ok", SIZE_MAX) >= 0);
|
||||
|
||||
assert_se(t = journal_make_match_string(j));
|
||||
|
||||
|
||||
@@ -121,7 +121,7 @@ static void run_test(void) {
|
||||
|
||||
assert_se(sd_journal_open_directory(&j, t, SD_JOURNAL_ASSUME_IMMUTABLE) >= 0);
|
||||
|
||||
assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "MAGIC=quux", SIZE_MAX) >= 0);
|
||||
SD_JOURNAL_FOREACH_BACKWARDS(j) {
|
||||
_cleanup_free_ char *c;
|
||||
|
||||
@@ -147,7 +147,7 @@ static void run_test(void) {
|
||||
verify_contents(j, 1);
|
||||
|
||||
printf("NEXT TEST\n");
|
||||
assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "MAGIC=quux", SIZE_MAX) >= 0);
|
||||
|
||||
assert_se(z = journal_make_match_string(j));
|
||||
printf("resulting match expression is: %s\n", z);
|
||||
@@ -157,10 +157,10 @@ static void run_test(void) {
|
||||
|
||||
printf("NEXT TEST\n");
|
||||
sd_journal_flush_matches(j);
|
||||
assert_se(sd_journal_add_match(j, "MAGIC=waldo", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "NUMBER=10", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "NUMBER=11", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "NUMBER=12", 0) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "MAGIC=waldo", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "NUMBER=10", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "NUMBER=11", SIZE_MAX) >= 0);
|
||||
assert_se(sd_journal_add_match(j, "NUMBER=12", SIZE_MAX) >= 0);
|
||||
|
||||
assert_se(z = journal_make_match_string(j));
|
||||
printf("resulting match expression is: %s\n", z);
|
||||
|
||||
@@ -1570,18 +1570,18 @@ int add_matches_for_unit(sd_journal *j, const char *unit) {
|
||||
|
||||
/* Look for coredumps of the service */
|
||||
(r = sd_journal_add_disjunction(j)) ||
|
||||
(r = sd_journal_add_match(j, "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1", 0)) ||
|
||||
(r = sd_journal_add_match(j, "_UID=0", 0)) ||
|
||||
(r = sd_journal_add_match(j, "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1", SIZE_MAX)) ||
|
||||
(r = sd_journal_add_match(j, "_UID=0", SIZE_MAX)) ||
|
||||
(r = journal_add_match_pair(j, "COREDUMP_UNIT", unit)) ||
|
||||
|
||||
/* Look for messages from PID 1 about this service */
|
||||
(r = sd_journal_add_disjunction(j)) ||
|
||||
(r = sd_journal_add_match(j, "_PID=1", 0)) ||
|
||||
(r = sd_journal_add_match(j, "_PID=1", SIZE_MAX)) ||
|
||||
(r = journal_add_match_pair(j, "UNIT", unit)) ||
|
||||
|
||||
/* Look for messages from authorized daemons about this service */
|
||||
(r = sd_journal_add_disjunction(j)) ||
|
||||
(r = sd_journal_add_match(j, "_UID=0", 0)) ||
|
||||
(r = sd_journal_add_match(j, "_UID=0", SIZE_MAX)) ||
|
||||
(r = journal_add_match_pair(j, "OBJECT_SYSTEMD_UNIT", unit))
|
||||
);
|
||||
|
||||
@@ -1615,13 +1615,13 @@ int add_matches_for_user_unit(sd_journal *j, const char *unit, uid_t uid) {
|
||||
(r = sd_journal_add_disjunction(j)) ||
|
||||
(r = journal_add_match_pair(j, "COREDUMP_USER_UNIT", unit)) ||
|
||||
(r = journal_add_matchf(j, "_UID="UID_FMT, uid)) ||
|
||||
(r = sd_journal_add_match(j, "_UID=0", 0)) ||
|
||||
(r = sd_journal_add_match(j, "_UID=0", SIZE_MAX)) ||
|
||||
|
||||
/* Look for messages from authorized daemons about this service */
|
||||
(r = sd_journal_add_disjunction(j)) ||
|
||||
(r = journal_add_match_pair(j, "OBJECT_SYSTEMD_USER_UNIT", unit)) ||
|
||||
(r = journal_add_matchf(j, "_UID="UID_FMT, uid)) ||
|
||||
(r = sd_journal_add_match(j, "_UID=0", 0))
|
||||
(r = sd_journal_add_match(j, "_UID=0", SIZE_MAX))
|
||||
);
|
||||
|
||||
if (r == 0 && endswith(unit, ".slice"))
|
||||
|
||||
Reference in New Issue
Block a user