X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fbus-label.c;h=ccc9f2bf8e58df7c6047bafc13b22c127e77b0bb;hb=30ab6a0fc1bb950c4dcd90dcd3dfe00a810c7fc1;hp=61eb75bca28490decd8c9d924fa265525eac7934;hpb=f01de9656d0969633ac89eb57a0ba4658a100568;p=elogind.git diff --git a/src/shared/bus-label.c b/src/shared/bus-label.c index 61eb75bca..ccc9f2bf8 100644 --- a/src/shared/bus-label.c +++ b/src/shared/bus-label.c @@ -19,13 +19,10 @@ along with systemd; If not, see . ***/ -#include #include -#include #include "util.h" #include "macro.h" -#include "def.h" #include "bus-label.h" @@ -66,34 +63,35 @@ char *bus_label_escape(const char *s) { return r; } -char *bus_label_unescape(const char *f) { +char *bus_label_unescape_n(const char *f, size_t l) { char *r, *t; + size_t i; assert_return(f, NULL); /* Special case for the empty string */ - if (streq(f, "_")) + if (l == 1 && *f == '_') return strdup(""); - r = new(char, strlen(f) + 1); + r = new(char, l + 1); if (!r) return NULL; - for (t = r; *f; f++) { - - if (*f == '_') { + for (i = 0, t = r; i < l; ++i) { + if (f[i] == '_') { int a, b; - if ((a = unhexchar(f[1])) < 0 || - (b = unhexchar(f[2])) < 0) { + if (l - i < 3 || + (a = unhexchar(f[i + 1])) < 0 || + (b = unhexchar(f[i + 2])) < 0) { /* Invalid escape code, let's take it literal then */ *(t++) = '_'; } else { *(t++) = (char) ((a << 4) | b); - f += 2; + i += 2; } } else - *(t++) = *f; + *(t++) = f[i]; } *t = 0;