[libvirt] [PATCH] command: enforce fd vs. buffer considerations

Eric Blake eblake at redhat.com
Tue Dec 7 22:29:21 UTC 2010


On 12/07/2010 02:59 PM, Matthias Bolte wrote:
> 2010/12/7 Eric Blake <eblake at redhat.com>:
>> * docs/internals/command.html.in: Better documentation of buffer
>> vs. fd considerations.
>> * src/util/command.c (virCommandRunAsync): Reject raw execution
>> with string io.
>> (virCommandRun): Reject execution with user-specified fds not
>> visiting a regular file.
>> +    if (async_io ? (!(cmd->flags & VIR_EXEC_DAEMON) || string_io)
>> +        : ((cmd->flags & VIR_EXEC_DAEMON) && string_io)) {
>> +        virCommandError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                        _("invalid use of command API"));
>> +        return -1;
>> +    }
> 
>> +    /* Buffer management can only be requested via virCommandRun.  */
>> +    if ((cmd->inbuf && cmd->infd == -1) ||
>> +        (cmd->outbuf && cmd->outfdptr != &cmd->outfd) ||
>> +        (cmd->errbuf && cmd->errfdptr != &cmd->errfd)) {
>> +        virCommandError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                        _("invalid use of command API"));
>> +        return -1;
>> +    }
> 
> Maybe make the error message about invalid use distinct from each
> other. That would allow to tell based on the error message what type
> of invalid usage has happened.
> 
> ACK.

I'm squashing this in before pushing:

diff --git i/src/util/command.c w/src/util/command.c
index d1d8f6d..3dfd33d 100644
--- i/src/util/command.c
+++ w/src/util/command.c
@@ -902,11 +902,18 @@ virCommandRun(virCommandPtr cmd, int *exitstatus)
         (*cmd->errfdptr == -1 ||
          fstat(*cmd->errfdptr, &st) < 0 || !S_ISREG(st.st_mode)))
         async_io = true;
-    if (async_io ? (!(cmd->flags & VIR_EXEC_DAEMON) || string_io)
-        : ((cmd->flags & VIR_EXEC_DAEMON) && string_io)) {
-        virCommandError(VIR_ERR_INTERNAL_ERROR, "%s",
-                        _("invalid use of command API"));
-        return -1;
+    if (async_io) {
+        if (!(cmd->flags & VIR_EXEC_DAEMON) || string_io) {
+            virCommandError(VIR_ERR_INTERNAL_ERROR, "%s",
+                            _("cannot mix caller fds with blocking
execution"));
+            return -1;
+        }
+    } else {
+        if ((cmd->flags & VIR_EXEC_DAEMON) && string_io) {
+            virCommandError(VIR_ERR_INTERNAL_ERROR, "%s",
+                            _("cannot mix string I/O with daemon"));
+            return -1;
+        }
     }

     /* If we have an input buffer, we need
@@ -1032,7 +1039,7 @@ virCommandRunAsync(virCommandPtr cmd, pid_t *pid)
         (cmd->outbuf && cmd->outfdptr != &cmd->outfd) ||
         (cmd->errbuf && cmd->errfdptr != &cmd->errfd)) {
         virCommandError(VIR_ERR_INTERNAL_ERROR, "%s",
-                        _("invalid use of command API"));
+                        _("cannot mix string I/O with asynchronous
command"));
         return -1;
     }


-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20101207/968617f8/attachment-0001.sig>


More information about the libvir-list mailing list