chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
macro: use C11 static_assert() macro for static assertions
[elogind.git]
/
src
/
shared
/
log.c
diff --git
a/src/shared/log.c
b/src/shared/log.c
index 7b0a9144a2bcae4244bdbcab11ee7768983f8f34..63578683ab6575b73df32ddd9164893471d5f186 100644
(file)
--- a/
src/shared/log.c
+++ b/
src/shared/log.c
@@
-27,6
+27,7
@@
#include <sys/socket.h>
#include <sys/un.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stddef.h>
+#include <printf.h>
#include "log.h"
#include "util.h"
#include "log.h"
#include "util.h"
@@
-705,11
+706,23
@@
int log_struct_internal(
va_start(ap, format);
while (format && n + 1 < ELEMENTSOF(iovec)) {
char *buf;
va_start(ap, format);
while (format && n + 1 < ELEMENTSOF(iovec)) {
char *buf;
+ va_list aq;
- if (vasprintf(&buf, format, ap) < 0) {
+ /* We need to copy the va_list structure,
+ * since vasprintf() leaves it afterwards at
+ * an undefined location */
+
+ va_copy(aq, ap);
+ if (vasprintf(&buf, format, aq) < 0) {
+ va_end(aq);
r = -ENOMEM;
goto finish;
}
r = -ENOMEM;
goto finish;
}
+ va_end(aq);
+
+ /* Now, jump enough ahead, so that we point to
+ * the next format string */
+ VA_FORMAT_ADVANCE(format, ap);
IOVEC_SET_STRING(iovec[n++], buf);
IOVEC_SET_STRING(iovec[n++], buf);
@@
-719,7
+732,6
@@
int log_struct_internal(
format = va_arg(ap, char *);
}
format = va_arg(ap, char *);
}
- va_end(ap);
zero(mh);
mh.msg_iov = iovec;
zero(mh);
mh.msg_iov = iovec;
@@
-731,6
+743,7
@@
int log_struct_internal(
r = 1;
finish:
r = 1;
finish:
+ va_end(ap);
for (i = 1; i < n; i += 2)
free(iovec[i].iov_base);
for (i = 1; i < n; i += 2)
free(iovec[i].iov_base);
@@
-742,8
+755,11
@@
int log_struct_internal(
va_start(ap, format);
while (format) {
va_start(ap, format);
while (format) {
+ va_list aq;
- vsnprintf(buf, sizeof(buf), format, ap);
+ va_copy(aq, ap);
+ vsnprintf(buf, sizeof(buf), format, aq);
+ va_end(aq);
char_array_0(buf);
if (startswith(buf, "MESSAGE=")) {
char_array_0(buf);
if (startswith(buf, "MESSAGE=")) {
@@
-751,6
+767,8
@@
int log_struct_internal(
break;
}
break;
}
+ VA_FORMAT_ADVANCE(format, ap);
+
format = va_arg(ap, char *);
}
va_end(ap);
format = va_arg(ap, char *);
}
va_end(ap);