chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
remove duplicated includes
[elogind.git]
/
src
/
shared
/
util.c
diff --git
a/src/shared/util.c
b/src/shared/util.c
index 973f1070b8a1178ee4796a03ecdca2872f3cf5af..d7e4318defa903c52864f0e62540035eaa5db969 100644
(file)
--- a/
src/shared/util.c
+++ b/
src/shared/util.c
@@
-25,7
+25,6
@@
#include <stdlib.h>
#include <signal.h>
#include <libintl.h>
#include <stdlib.h>
#include <signal.h>
#include <libintl.h>
-#include <locale.h>
#include <stdio.h>
#include <syslog.h>
#include <sched.h>
#include <stdio.h>
#include <syslog.h>
#include <sched.h>
@@
-1487,12
+1486,13
@@
static int cunescape_one(const char *p, size_t length, char *ret) {
return r;
}
return r;
}
-
char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix
) {
+
int cunescape_length_with_prefix(const char *s, size_t length, const char *prefix, UnescapeFlags flags, char **ret
) {
char *r, *t;
const char *f;
size_t pl;
assert(s);
char *r, *t;
const char *f;
size_t pl;
assert(s);
+ assert(ret);
/* Undoes C style string escaping, and optionally prefixes it. */
/* Undoes C style string escaping, and optionally prefixes it. */
@@
-1500,7
+1500,7
@@
char *cunescape_length_with_prefix(const char *s, size_t length, const char *pre
r = new(char, pl+length+1);
if (!r)
r = new(char, pl+length+1);
if (!r)
- return
NULL
;
+ return
-ENOMEM
;
if (prefix)
memcpy(r, prefix, pl);
if (prefix)
memcpy(r, prefix, pl);
@@
-1512,17
+1512,31
@@
char *cunescape_length_with_prefix(const char *s, size_t length, const char *pre
remaining = s + length - f;
assert(remaining > 0);
remaining = s + length - f;
assert(remaining > 0);
- if (*f != '\\'
|| remaining == 1
) {
- /*
a literal literal, or a trailing backslash
, copy verbatim */
+ if (*f != '\\') {
+ /*
A literal literal
, copy verbatim */
*(t++) = *f;
continue;
}
*(t++) = *f;
continue;
}
+ if (remaining == 1) {
+ if (flags & UNESCAPE_RELAX) {
+ /* A trailing backslash, copy verbatim */
+ *(t++) = *f;
+ continue;
+ }
+
+ return -EINVAL;
+ }
+
k = cunescape_one(f + 1, remaining - 1, t);
if (k < 0) {
k = cunescape_one(f + 1, remaining - 1, t);
if (k < 0) {
- /* Invalid escape code, let's take it literal then */
- *(t++) = '\\';
- continue;
+ if (flags & UNESCAPE_RELAX) {
+ /* Invalid escape code, let's take it literal then */
+ *(t++) = '\\';
+ continue;
+ }
+
+ return k;
}
f += k;
}
f += k;
@@
-1530,17
+1544,17
@@
char *cunescape_length_with_prefix(const char *s, size_t length, const char *pre
}
*t = 0;
}
*t = 0;
- return r;
-}
-char *cunescape_length(const char *s, size_t length) {
- return
cunescape_length_with_prefix(s, length, NULL)
;
+ *ret = r;
+ return
t - r
;
}
}
-char *cunescape(const char *s) {
- assert(s);
+int cunescape_length(const char *s, size_t length, UnescapeFlags flags, char **ret) {
+ return cunescape_length_with_prefix(s, length, NULL, flags, ret);
+}
- return cunescape_length(s, strlen(s));
+int cunescape(const char *s, UnescapeFlags flags, char **ret) {
+ return cunescape_length(s, strlen(s), flags, ret);
}
char *xescape(const char *s, const char *bad) {
}
char *xescape(const char *s, const char *bad) {
@@
-6752,9
+6766,9
@@
int umount_recursive(const char *prefix, int flags) {
continue;
}
continue;
}
-
p = cunescape(path
);
- if (
!p
)
- return
-ENOMEM
;
+
r = cunescape(path, UNESCAPE_RELAX, &p
);
+ if (
r < 0
)
+ return
r
;
if (!path_startswith(p, prefix))
continue;
if (!path_startswith(p, prefix))
continue;
@@
-6854,9
+6868,9
@@
int bind_remount_recursive(const char *prefix, bool ro) {
continue;
}
continue;
}
-
p = cunescape(path
);
- if (
!p
)
- return
-ENOMEM
;
+
r = cunescape(path, UNESCAPE_RELAX, &p
);
+ if (
r < 0
)
+ return
r
;
/* Let's ignore autofs mounts. If they aren't
* triggered yet, we want to avoid triggering
/* Let's ignore autofs mounts. If they aren't
* triggered yet, we want to avoid triggering