summaryrefslogtreecommitdiff
path: root/src/shared/generator.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-01-09 16:58:29 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-01-11 23:41:41 -0500
commitd15d0333be6a1ca7fdd99a1881d967b6be8f387a (patch)
tree488ce214314613658c5eda3b0a94deec31353de7 /src/shared/generator.c
parent1e39ff926f815d241721ed9486945cf599ef8c2f (diff)
Add new function to filter fstab options
This fixes parsing of options in shared/generator.c. Existing code had some issues: - it would treate whitespace and semicolons as seperators. fstab(5) is pretty clear that only commas matter. And the syntax does not allow for spaces to be inserted in the field in fstab. Whitespace might be escaped, but then it should not seperate options. Treat whitespace and semicolons as any other character. - it assumed that x-systemd.device-timeout would always be followed by "=". But this is not guaranteed, hasmntopt will return this option even if there's no value. Uninitialized memory could be read. - some error paths would log, and inconsistently, some would just return an error code. Filtering is split out to a separate function and tests are added. Similar code paths in other places are adjusted to use the new function.
Diffstat (limited to 'src/shared/generator.c')
-rw-r--r--src/shared/generator.c41
1 files changed, 8 insertions, 33 deletions
diff --git a/src/shared/generator.c b/src/shared/generator.c
index 465e5f6cc8..4140afba82 100644
--- a/src/shared/generator.c
+++ b/src/shared/generator.c
@@ -28,6 +28,7 @@
#include "unit-name.h"
#include "generator.h"
#include "path-util.h"
+#include "fstab-util.h"
#include "dropin.h"
int generator_write_fsck_deps(
@@ -92,42 +93,16 @@ int generator_write_timeouts(const char *dir, const char *what, const char *wher
* endless device timeouts for devices that show up only after
* user input, like crypto devices. */
- _cleanup_free_ char *node = NULL, *unit = NULL, *t = NULL;
- char *start, *timeout;
+ _cleanup_free_ char *node = NULL, *unit = NULL, *timeout = NULL;
usec_t u;
int r;
- size_t len;
-
- if ((start = mount_test_option(opts, "comment=systemd.device-timeout")))
- timeout = start + 31;
- else if ((start = mount_test_option(opts, "x-systemd.device-timeout")))
- timeout = start + 25;
- else {
- if (filtered) {
- *filtered = strdup(opts ?: "");
- if (!*filtered)
- return log_oom();
- }
- return 0;
- }
-
- len = strcspn(timeout, ",;" WHITESPACE);
- t = strndup(timeout, len);
- if (!t)
- return -ENOMEM;
-
- if (filtered) {
- char *prefix, *postfix;
+ r = fstab_filter_options(opts, "comment=systemd.device-timeout\0" "x-systemd.device-timeout\0",
+ NULL, &timeout, filtered);
+ if (r <= 0)
+ return r;
- prefix = strndupa(opts, start - opts - (start != opts));
- postfix = timeout + len + (start == opts && timeout[len] != '\0');
- *filtered = strjoin(prefix, *postfix ? postfix : NULL, NULL);
- if (!*filtered)
- return log_oom();
- }
-
- r = parse_sec(t, &u);
+ r = parse_sec(timeout, &u);
if (r < 0) {
log_warning("Failed to parse timeout for %s, ignoring: %s",
where, timeout);
@@ -140,7 +115,7 @@ int generator_write_timeouts(const char *dir, const char *what, const char *wher
unit = unit_name_from_path(node, ".device");
if (!unit)
- return -ENOMEM;
+ return log_oom();
return write_drop_in_format(dir, unit, 50, "device-timeout",
"# Automatically generated by %s\n\n"