On 11/12/2015 12:19 PM, Daniel P. Berrange wrote:
Add the virLogManager API which allows for communication with
the virtlogd daemon to RPC program. This provides the client
side API to open log files for guest domains.
The virtlogd daemon is setup to auto-spawn on first use when
running unprivileged. For privileged usage, systemd socket
activation is used instead.
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
po/POTFILES.in | 2 +
src/Makefile.am | 4 +-
src/libvirt_private.syms | 8 ++
src/logging/log_daemon_dispatch.c | 7 +
src/logging/log_handler.c | 7 +-
src/logging/log_manager.c | 283 ++++++++++++++++++++++++++++++++++++++
src/logging/log_manager.h | 61 ++++++++
src/logging/log_protocol.x | 1 +
8 files changed, 370 insertions(+), 3 deletions(-)
create mode 100644 src/logging/log_manager.c
create mode 100644 src/logging/log_manager.h
[...]
diff --git a/src/logging/log_daemon_dispatch.c
b/src/logging/log_daemon_dispatch.c
index f612be1..203fdc4 100644
--- a/src/logging/log_daemon_dispatch.c
+++ b/src/logging/log_daemon_dispatch.c
@@ -116,6 +116,13 @@ virLogManagerProtocolDispatchDomainReadLogFile(virNetServerPtr
server ATTRIBUTE_
int rv = -1;
char *data;
+ if (args->maxlen > VIR_LOG_MANAGER_PROTOCOL_STRING_MAX) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Requested data len %zu is larger than maximum %d"),
+ args->maxlen, VIR_LOG_MANAGER_PROTOCOL_STRING_MAX);
+ goto cleanup;
+ }
+
This feels like it should have been in prior patch...
if ((data =
virLogHandlerDomainReadLogFile(virLogDaemonGetHandler(logDaemon),
args->driver,
(unsigned char *)args->dom.uuid,
diff --git a/src/logging/log_handler.c b/src/logging/log_handler.c
index 8853fd0..1465c5a 100644
--- a/src/logging/log_handler.c
+++ b/src/logging/log_handler.c
@@ -442,6 +442,7 @@ char *virLogHandlerDomainReadLogFile(virLogHandlerPtr handler,
char *path;
virRotatingFileReaderPtr file = NULL;
char *data = NULL;
+ ssize_t got;
if (!(path = virLogHandlerGetLogFilePathForDomain(handler,
driver,
@@ -455,11 +456,13 @@ char *virLogHandlerDomainReadLogFile(virLogHandlerPtr handler,
if (virRotatingFileReaderSeek(file, inode, offset) < 0)
goto error;
- if (VIR_ALLOC_N(data, maxlen) < 0)
+ if (VIR_ALLOC_N(data, maxlen + 1) < 0)
goto error;
- if (virRotatingFileReaderConsume(file, data, maxlen) < 0)
+ got = virRotatingFileReaderConsume(file, data, maxlen);
+ if (got < 0)
goto error;
+ data[got] = '\0';
Perhaps another prior patch..
virRotatingFileReaderFree(file);
return data;
[...] Nothing jumped out at me in log_manager.{ch}
diff --git a/src/logging/log_protocol.x b/src/logging/log_protocol.x
index 2702beb..de57c69 100644
--- a/src/logging/log_protocol.x
+++ b/src/logging/log_protocol.x
@@ -57,6 +57,7 @@ struct virLogManagerProtocolDomainReadLogFileArgs {
virLogManagerProtocolDomain dom;
virLogManagerProtocolLogFilePosition pos;
unsigned hyper maxlen;
+ unsigned int flags;
should this perhaps have been in the prior patch?
};
struct virLogManagerProtocolDomainReadLogFileRet {
ACK - nothing major here - your call on whether things should move.
John