diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-04-06 20:11:41 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-04-07 15:42:25 +0200 |
commit | 527b7a421ff3927d4f3f170b1b143452e88ae1dc (patch) | |
tree | cfb13e123c6dfd547fb005db63a480ca709b46da /src/core | |
parent | 64f75d7a2898e0c0d2b66f93ddd34ffd345bb3c5 (diff) |
util: rework cunescape(), improve error handling
Change cunescape() to return a normal error code, so that we can
distuingish OOM errors from parse errors.
This also adds a flags parameter to control whether "relaxed" or normal
parsing shall be done. If set no parse failures are generated, and the
only reason why cunescape() can fail is OOM.
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/load-fragment.c | 51 | ||||
-rw-r--r-- | src/core/manager.c | 6 | ||||
-rw-r--r-- | src/core/mount.c | 8 | ||||
-rw-r--r-- | src/core/swap.c | 3 | ||||
-rw-r--r-- | src/core/umount.c | 38 |
5 files changed, 51 insertions, 55 deletions
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 07384d3668..e61418db50 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -507,16 +507,17 @@ int config_parse_exec_oom_score_adjust(const char* unit, return 0; } -int config_parse_exec(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_exec( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { ExecCommand **e = data, *nce; char *path, **n; @@ -568,15 +569,13 @@ int config_parse_exec(const char *unit, word ++; } } - } else - if (strneq(word, ";", MAX(l, 1U))) + } else if (strneq(word, ";", MAX(l, 1U))) goto found; k++; } if (!isempty(state)) { - log_syntax(unit, LOG_ERR, filename, line, EINVAL, - "Trailing garbage, ignoring."); + log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Trailing garbage, ignoring."); return 0; } @@ -605,9 +604,10 @@ int config_parse_exec(const char *unit, else skip = strneq(word, "\\;", MAX(l, 1U)); - c = cunescape_length(word + skip, l - skip); - if (!c) { - r = log_oom(); + r = cunescape_length(word + skip, l - skip, 0, &c); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to unescape command line, ignoring: %s", rvalue); + r = 0; goto fail; } @@ -637,8 +637,7 @@ int config_parse_exec(const char *unit, else goto ok; - log_syntax(unit, LOG_ERR, filename, line, EINVAL, - "%s, ignoring: %s", reason, rvalue); + log_syntax(unit, LOG_ERR, filename, line, EINVAL, "%s, ignoring: %s", reason, rvalue); r = 0; goto fail; @@ -1976,8 +1975,7 @@ int config_parse_environ(const char *unit, if (u) { r = unit_full_printf(u, rvalue, &k); if (r < 0) - log_syntax(unit, LOG_ERR, filename, line, -r, - "Failed to resolve specifiers, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, -r, "Failed to resolve specifiers, ignoring: %s", rvalue); } if (!k) @@ -1989,13 +1987,14 @@ int config_parse_environ(const char *unit, _cleanup_free_ char *n; char **x; - n = cunescape_length(word, l); - if (!n) - return log_oom(); + r = cunescape_length(word, l, 0, &n); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, "Couldn't unescape assignment, ignoring: %s", rvalue); + continue; + } if (!env_assignment_is_valid(n)) { - log_syntax(unit, LOG_ERR, filename, line, EINVAL, - "Invalid environment assignment, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Invalid environment assignment, ignoring: %s", rvalue); continue; } diff --git a/src/core/manager.c b/src/core/manager.c index 73417ab1a8..1c912fcdf7 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -2426,11 +2426,9 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { _cleanup_free_ char *uce = NULL; char **e; - uce = cunescape(l+4); - if (!uce) { - r = -ENOMEM; + r = cunescape(l + 4, UNESCAPE_RELAX, &uce); + if (r < 0) goto finish; - } e = strv_env_set(m->environment, uce); if (!e) { diff --git a/src/core/mount.c b/src/core/mount.c index 53594cd40b..c4aa810d05 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -1579,7 +1579,7 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { r = 0; for (;;) { const char *device, *path, *options, *fstype; - _cleanup_free_ const char *d = NULL, *p = NULL; + _cleanup_free_ char *d = NULL, *p = NULL; struct libmnt_fs *fs; int k; @@ -1594,12 +1594,10 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { options = mnt_fs_get_options(fs); fstype = mnt_fs_get_fstype(fs); - d = cunescape(device); - if (!d) + if (cunescape(device, UNESCAPE_RELAX, &d) < 0) return log_oom(); - p = cunescape(path); - if (!p) + if (cunescape(path, UNESCAPE_RELAX, &p) < 0) return log_oom(); (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags); diff --git a/src/core/swap.c b/src/core/swap.c index 6b1bdb5c1e..53f127484f 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -1099,8 +1099,7 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) { continue; } - d = cunescape(dev); - if (!d) + if (cunescape(dev, UNESCAPE_RELAX, &d) < 0) return log_oom(); device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags); diff --git a/src/core/umount.c b/src/core/umount.c index ceee70fbea..bee267a5ad 100644 --- a/src/core/umount.c +++ b/src/core/umount.c @@ -62,6 +62,7 @@ static void mount_points_list_free(MountPoint **head) { static int mount_points_list_get(MountPoint **head) { _cleanup_fclose_ FILE *proc_self_mountinfo = NULL; unsigned int i; + int r; assert(head); @@ -97,9 +98,9 @@ static int mount_points_list_get(MountPoint **head) { continue; } - p = cunescape(path); - if (!p) - return -ENOMEM; + r = cunescape(path, UNESCAPE_RELAX, &p); + if (r < 0) + return r; /* Ignore mount points we can't unmount because they * are API or because we are keeping them open (like @@ -133,10 +134,12 @@ static int mount_points_list_get(MountPoint **head) { static int swap_list_get(MountPoint **head) { _cleanup_fclose_ FILE *proc_swaps = NULL; unsigned int i; + int r; assert(head); - if (!(proc_swaps = fopen("/proc/swaps", "re"))) + proc_swaps = fopen("/proc/swaps", "re"); + if (!proc_swaps) return (errno == ENOENT) ? 0 : -errno; (void) fscanf(proc_swaps, "%*s %*s %*s %*s %*s\n"); @@ -146,19 +149,19 @@ static int swap_list_get(MountPoint **head) { char *dev = NULL, *d; int k; - if ((k = fscanf(proc_swaps, - "%ms " /* device/file */ - "%*s " /* type of swap */ - "%*s " /* swap size */ - "%*s " /* used */ - "%*s\n", /* priority */ - &dev)) != 1) { + k = fscanf(proc_swaps, + "%ms " /* device/file */ + "%*s " /* type of swap */ + "%*s " /* swap size */ + "%*s " /* used */ + "%*s\n", /* priority */ + &dev); + if (k != 1) { if (k == EOF) break; log_warning("Failed to parse /proc/swaps:%u.", i); - free(dev); continue; } @@ -168,14 +171,13 @@ static int swap_list_get(MountPoint **head) { continue; } - d = cunescape(dev); + r = cunescape(dev, UNESCAPE_RELAX, &d); free(dev); + if (r < 0) + return r; - if (!d) { - return -ENOMEM; - } - - if (!(swap = new0(MountPoint, 1))) { + swap = new0(MountPoint, 1); + if (!swap) { free(d); return -ENOMEM; } |