[PATCH 5/6] virprocess: Passthru error from virProcessRunInForkHelper

Ján Tomko jtomko at redhat.com
Thu Mar 19 19:27:55 UTC 2020


On a Wednesday in 2020, Michal Privoznik wrote:
>When running a function in a forked child, so far the only thing
>we could report is exit status of the child and the error
>message. However, it may be beneficial to the caller to know the
>actual error that happened in the child.
>
>Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>---
> build-aux/syntax-check.mk |  2 +-
> src/util/virprocess.c     | 51 ++++++++++++++++++++++++++++++++++++---
> tests/commandtest.c       | 43 +++++++++++++++++++++++++++++++++
> 3 files changed, 91 insertions(+), 5 deletions(-)
>
>diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk
>index 3020921be8..2a38c03ba9 100644
>--- a/build-aux/syntax-check.mk
>+++ b/build-aux/syntax-check.mk
>@@ -1987,7 +1987,7 @@ exclude_file_name_regexp--sc_flags_usage = \
> exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
>   ^(src/rpc/gendispatch\.pl$$|tests/)
>
>-exclude_file_name_regexp--sc_po_check = ^(docs/|src/rpc/gendispatch\.pl$$)
>+exclude_file_name_regexp--sc_po_check = ^(docs/|src/rpc/gendispatch\.pl$$|tests/commandtest.c$$)
>
> exclude_file_name_regexp--sc_prohibit_VIR_ERR_NO_MEMORY = \
>   ^(build-aux/syntax-check\.mk|include/libvirt/virterror\.h|src/remote/remote_daemon_dispatch\.c|src/util/virerror\.c|docs/internals/oomtesting\.html\.in)$$
>diff --git a/src/util/virprocess.c b/src/util/virprocess.c
>index 24135070b7..e8674402f9 100644
>--- a/src/util/virprocess.c
>+++ b/src/util/virprocess.c
>@@ -1126,6 +1126,23 @@ virProcessRunInMountNamespace(pid_t pid G_GNUC_UNUSED,
>
>
> #ifndef WIN32
>+typedef struct {
>+    int code;
>+    int domain;
>+    char message[VIR_ERROR_MAX_LENGTH];
>+    virErrorLevel level;
>+    char str1[VIR_ERROR_MAX_LENGTH];
>+    char str2[VIR_ERROR_MAX_LENGTH];
>+    /* str3 doesn't seem to be used. Ignore it. */
>+    int int1;
>+    int int2;
>+} errorData;
>+
>+typedef union {
>+    errorData data;
>+    char bindata[sizeof(errorData)];
>+} errorDataBin;
>+
> static int
> virProcessRunInForkHelper(int errfd,
>                           pid_t ppid,
>@@ -1134,9 +1151,19 @@ virProcessRunInForkHelper(int errfd,
> {
>     if (cb(ppid, opaque) < 0) {
>         virErrorPtr err = virGetLastError();
>+        errorDataBin bin = { 0 };
>+

Consider allocating this on the heap instead of a 3K+ stack variable.

Jano

>         if (err) {
>-            size_t len = strlen(err->message) + 1;
>-            ignore_value(safewrite(errfd, err->message, len));
>+            bin.data.code = err->code;
>+            bin.data.domain = err->domain;
>+            ignore_value(virStrcpy(bin.data.message, err->message, sizeof(bin.data.message)));
>+            bin.data.level = err->level;
>+            ignore_value(virStrcpy(bin.data.str1, err->str1, sizeof(bin.data.str1)));
>+            ignore_value(virStrcpy(bin.data.str2, err->str2, sizeof(bin.data.str2)));
>+            bin.data.int1 = err->int1;
>+            bin.data.int2 = err->int2;
>+
>+            ignore_value(safewrite(errfd, bin.bindata, sizeof(bin)));
>         }
>
>         return -1;
>@@ -1188,16 +1215,32 @@ virProcessRunInFork(virProcessForkCallback cb,
>     } else {
>         int status;
>         g_autofree char *buf = NULL;
>+        errorDataBin bin;

Same here.

Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20200319/97a4d039/attachment-0001.sig>


More information about the libvir-list mailing list