Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/berrange/tags/pull-io-next-2016…
Browse files Browse the repository at this point in the history
…-01-20-1' into staging

I/O channels fixes 2016/01/20 v1

# gpg: Signature made Wed 20 Jan 2016 11:31:47 GMT using RSA key ID 15104FDF
# gpg: Good signature from "Daniel P. Berrange <dan@berrange.com>"
# gpg:                 aka "Daniel P. Berrange <berrange@redhat.com>"

* remotes/berrange/tags/pull-io-next-2016-01-20-1:
  io: use memset instead of { 0 } for initializing array
  io: fix description of @errp parameter initialization
  io: some fixes to handling of /dev/null when running commands
  io: increment counter when killing off subcommand
  io: fix sign of errno value passed to error report

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Jan 21, 2016
2 parents a953853 + ccf1e2d commit 3ed0b65
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 29 deletions.
4 changes: 2 additions & 2 deletions include/io/channel-command.h
Expand Up @@ -51,7 +51,7 @@ struct QIOChannelCommand {
* @writefd: the FD connected to the command's stdin
* @readfd: the FD connected to the command's stdout
* @pid: the PID of the running child command
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Create a channel for performing I/O with the
* previously spawned command identified by @pid.
Expand All @@ -75,7 +75,7 @@ qio_channel_command_new_pid(int writefd,
* qio_channel_command_new_spawn:
* @argv: the NULL terminated list of command arguments
* @flags: the I/O mode, one of O_RDONLY, O_WRONLY, O_RDWR
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Create a channel for performing I/O with the
* command to be spawned with arguments @argv.
Expand Down
14 changes: 7 additions & 7 deletions include/io/channel-socket.h
Expand Up @@ -67,7 +67,7 @@ qio_channel_socket_new(void);
/**
* qio_channel_socket_new_fd:
* @fd: the socket file descriptor
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Create a channel for performing I/O on the socket
* connection represented by the file descriptor @fd.
Expand All @@ -83,7 +83,7 @@ qio_channel_socket_new_fd(int fd,
* qio_channel_socket_connect_sync:
* @ioc: the socket channel object
* @addr: the address to connect to
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Attempt to connect to the address @addr. This method
* will run in the foreground so the caller will not regain
Expand Down Expand Up @@ -118,7 +118,7 @@ void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
* qio_channel_socket_listen_sync:
* @ioc: the socket channel object
* @addr: the address to listen to
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Attempt to listen to the address @addr. This method
* will run in the foreground so the caller will not regain
Expand Down Expand Up @@ -154,7 +154,7 @@ void qio_channel_socket_listen_async(QIOChannelSocket *ioc,
* @ioc: the socket channel object
* @localAddr: the address to local bind address
* @remoteAddr: the address to remote peer address
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Attempt to initialize a datagram socket bound to
* @localAddr and communicating with peer @remoteAddr.
Expand Down Expand Up @@ -193,7 +193,7 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
/**
* qio_channel_socket_get_local_address:
* @ioc: the socket channel object
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Get the string representation of the local socket
* address. A pointer to the allocated address information
Expand All @@ -210,7 +210,7 @@ qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
/**
* qio_channel_socket_get_remote_address:
* @ioc: the socket channel object
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Get the string representation of the local socket
* address. A pointer to the allocated address information
Expand All @@ -228,7 +228,7 @@ qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
/**
* qio_channel_socket_accept:
* @ioc: the socket channel object
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* If the socket represents a server, then this accepts
* a new client connection. The returned channel will
Expand Down
4 changes: 2 additions & 2 deletions include/io/channel-tls.h
Expand Up @@ -55,7 +55,7 @@ struct QIOChannelTLS {
* @master: the underlying channel object
* @creds: the credentials to use for TLS handshake
* @aclname: the access control list for validating clients
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Create a new TLS channel that runs the server side of
* a TLS session. The TLS session handshake will use the
Expand Down Expand Up @@ -85,7 +85,7 @@ qio_channel_tls_new_server(QIOChannel *master,
* @master: the underlying channel object
* @creds: the credentials to use for TLS handshake
* @hostname: the user specified server hostname
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Create a new TLS channel that runs the client side of
* a TLS session. The TLS session handshake will use the
Expand Down
20 changes: 10 additions & 10 deletions include/io/channel.h
Expand Up @@ -152,7 +152,7 @@ bool qio_channel_has_feature(QIOChannel *ioc,
* @niov: the length of the @iov array
* @fds: pointer to an array that will received file handles
* @nfds: pointer filled with number of elements in @fds on return
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Read data from the IO channel, storing it in the
* memory regions referenced by @iov. Each element
Expand Down Expand Up @@ -198,7 +198,7 @@ ssize_t qio_channel_readv_full(QIOChannel *ioc,
* @niov: the length of the @iov array
* @fds: an array of file handles to send
* @nfds: number of file handles in @fds
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Write data to the IO channel, reading it from the
* memory regions referenced by @iov. Each element
Expand Down Expand Up @@ -237,7 +237,7 @@ ssize_t qio_channel_writev_full(QIOChannel *ioc,
* @ioc: the channel object
* @iov: the array of memory regions to read data into
* @niov: the length of the @iov array
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Behaves as qio_channel_readv_full() but does not support
* receiving of file handles.
Expand All @@ -252,7 +252,7 @@ ssize_t qio_channel_readv(QIOChannel *ioc,
* @ioc: the channel object
* @iov: the array of memory regions to write data from
* @niov: the length of the @iov array
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Behaves as qio_channel_writev_full() but does not support
* sending of file handles.
Expand All @@ -267,7 +267,7 @@ ssize_t qio_channel_writev(QIOChannel *ioc,
* @ioc: the channel object
* @buf: the memory region to read data into
* @buflen: the length of @buf
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Behaves as qio_channel_readv_full() but does not support
* receiving of file handles, and only supports reading into
Expand All @@ -283,7 +283,7 @@ ssize_t qio_channel_read(QIOChannel *ioc,
* @ioc: the channel object
* @buf: the memory regions to send data from
* @buflen: the length of @buf
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Behaves as qio_channel_writev_full() but does not support
* sending of file handles, and only supports writing from a
Expand All @@ -298,7 +298,7 @@ ssize_t qio_channel_write(QIOChannel *ioc,
* qio_channel_set_blocking:
* @ioc: the channel object
* @enabled: the blocking flag state
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* If @enabled is true, then the channel is put into
* blocking mode, otherwise it will be non-blocking.
Expand All @@ -314,7 +314,7 @@ int qio_channel_set_blocking(QIOChannel *ioc,
/**
* qio_channel_close:
* @ioc: the channel object
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Close the channel, flushing any pending I/O
*
Expand All @@ -327,7 +327,7 @@ int qio_channel_close(QIOChannel *ioc,
* qio_channel_shutdown:
* @ioc: the channel object
* @how: the direction to shutdown
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Shutdowns transmission and/or receiving of data
* without closing the underlying transport.
Expand Down Expand Up @@ -403,7 +403,7 @@ void qio_channel_set_cork(QIOChannel *ioc,
* @ioc: the channel object
* @offset: the position to seek to, relative to @whence
* @whence: one of the (POSIX) SEEK_* constants listed below
* @errp: pointer to an uninitialized error object
* @errp: pointer to a NULL-initialized error object
*
* Moves the current I/O position within the channel
* @ioc, to be @offset. The value of @offset is
Expand Down
23 changes: 17 additions & 6 deletions io/channel-command.c
Expand Up @@ -66,7 +66,7 @@ qio_channel_command_new_spawn(const char *const argv[],

if (stdinnull || stdoutnull) {
devnull = open("/dev/null", O_RDWR);
if (!devnull) {
if (devnull < 0) {
error_setg_errno(errp, errno,
"Unable to open /dev/null");
goto error;
Expand Down Expand Up @@ -98,6 +98,9 @@ qio_channel_command_new_spawn(const char *const argv[],
close(stdoutfd[0]);
close(stdoutfd[1]);
}
if (devnull != -1) {
close(devnull);
}

execv(argv[0], (char * const *)argv);
_exit(1);
Expand All @@ -117,6 +120,9 @@ qio_channel_command_new_spawn(const char *const argv[],
return ioc;

error:
if (devnull != -1) {
close(devnull);
}
if (stdinfd[0] != -1) {
close(stdinfd[0]);
}
Expand Down Expand Up @@ -179,6 +185,7 @@ static int qio_channel_command_abort(QIOChannelCommand *ioc,
(unsigned long long)ioc->pid);
return -1;
}
step++;
usleep(10 * 1000);
goto rewait;
}
Expand All @@ -201,12 +208,12 @@ static void qio_channel_command_finalize(Object *obj)
QIOChannelCommand *ioc = QIO_CHANNEL_COMMAND(obj);
if (ioc->readfd != -1) {
close(ioc->readfd);
ioc->readfd = -1;
}
if (ioc->writefd != -1) {
if (ioc->writefd != -1 &&
ioc->writefd != ioc->readfd) {
close(ioc->writefd);
ioc->writefd = -1;
}
ioc->writefd = ioc->readfd = -1;
if (ioc->pid > 0) {
#ifndef WIN32
qio_channel_command_abort(ioc, NULL);
Expand Down Expand Up @@ -298,12 +305,16 @@ static int qio_channel_command_close(QIOChannel *ioc,
/* We close FDs before killing, because that
* gives a better chance of clean shutdown
*/
if (close(cioc->writefd) < 0) {
if (cioc->readfd != -1 &&
close(cioc->readfd) < 0) {
rv = -1;
}
if (close(cioc->readfd) < 0) {
if (cioc->writefd != -1 &&
cioc->writefd != cioc->readfd &&
close(cioc->writefd) < 0) {
rv = -1;
}
cioc->writefd = cioc->readfd = -1;
#ifndef WIN32
if (qio_channel_command_abort(cioc, errp) < 0) {
return -1;
Expand Down
8 changes: 6 additions & 2 deletions io/channel-socket.c
Expand Up @@ -449,6 +449,8 @@ static ssize_t qio_channel_socket_readv(QIOChannel *ioc,
char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)];
int sflags = 0;

memset(control, 0, CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS));

#ifdef MSG_CMSG_CLOEXEC
sflags |= MSG_CMSG_CLOEXEC;
#endif
Expand Down Expand Up @@ -493,16 +495,18 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
ssize_t ret;
struct msghdr msg = { NULL, };
char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 };
char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)];
size_t fdsize = sizeof(int) * nfds;
struct cmsghdr *cmsg;

memset(control, 0, CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS));

msg.msg_iov = (struct iovec *)iov;
msg.msg_iovlen = niov;

if (nfds) {
if (nfds > SOCKET_MAX_FDS) {
error_setg_errno(errp, -EINVAL,
error_setg_errno(errp, EINVAL,
"Only %d FDs can be sent, got %zu",
SOCKET_MAX_FDS, nfds);
return -1;
Expand Down

0 comments on commit 3ed0b65

Please sign in to comment.