chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fileio: quote more shell characters in envfiles
[elogind.git]
/
src
/
shared
/
fileio.c
diff --git
a/src/shared/fileio.c
b/src/shared/fileio.c
index b1de5908c538c32e792c093c4daeb34f58812852..cbb40c237998438fac7ef27234bcb134866c44dc 100644
(file)
--- a/
src/shared/fileio.c
+++ b/
src/shared/fileio.c
@@
-738,11
+738,11
@@
static void write_env_var(FILE *f, const char *v) {
p++;
fwrite(v, 1, p-v, f);
p++;
fwrite(v, 1, p-v, f);
- if (string_has_cc(p, NULL) || chars_intersect(p, WHITESPACE
"\'\"\\`$"
)) {
+ if (string_has_cc(p, NULL) || chars_intersect(p, WHITESPACE
SHELL_NEED_QUOTES
)) {
fputc('\"', f);
for (; *p; p++) {
fputc('\"', f);
for (; *p; p++) {
- if (strchr(
"\'\"\\`$"
, *p))
+ if (strchr(
SHELL_NEED_ESCAPE
, *p))
fputc('\\', f);
fputc(*p, f);
fputc('\\', f);
fputc(*p, f);
@@
-756,35
+756,31
@@
static void write_env_var(FILE *f, const char *v) {
}
int write_env_file(const char *fname, char **l) {
}
int write_env_file(const char *fname, char **l) {
- char **i;
- _cleanup_free_ char *p = NULL;
_cleanup_fclose_ FILE *f = NULL;
_cleanup_fclose_ FILE *f = NULL;
+ _cleanup_free_ char *p = NULL;
+ char **i;
int r;
int r;
+ assert(fname);
+
r = fopen_temporary(fname, &f, &p);
if (r < 0)
return r;
fchmod_umask(fileno(f), 0644);
r = fopen_temporary(fname, &f, &p);
if (r < 0)
return r;
fchmod_umask(fileno(f), 0644);
- errno = 0;
STRV_FOREACH(i, l)
write_env_var(f, *i);
STRV_FOREACH(i, l)
write_env_var(f, *i);
- fflush(f);
+ r = fflush_and_check(f);
+ if (r >= 0) {
+ if (rename(p, fname) >= 0)
+ return 0;
- if (ferror(f))
- r = errno ? -errno : -EIO;
- else {
- if (rename(p, fname) < 0)
- r = -errno;
- else
- r = 0;
+ r = -errno;
}
}
- if (r < 0)
- unlink(p);
-
+ unlink(p);
return r;
}
return r;
}