]> Git Repo - qemu.git/commitdiff
linux-user: fix mq_getsetattr implementation
authorMax Filippov <[email protected]>
Sat, 31 Mar 2018 15:20:15 +0000 (08:20 -0700)
committerMax Filippov <[email protected]>
Sat, 31 Mar 2018 21:06:36 +0000 (14:06 -0700)
mq_getsetattr implementation does not set errno correctly in case of
error. Also in the presence of both 2nd and 3rd arguments it calls both
mq_getattr and mq_setattr, whereas only the latter call would suffice.

Don't call mq_getattr in the presence of the 2nd argument. Don't copy
output back to user in case of error. Use get_errno to set errno value.

This fixes test rt/tst-mqueue2 from the glibc testsuite.

Cc: Lionel Landwerlin <[email protected]>
Cc: Kirill A. Shutemov <[email protected]>
Cc: Riku Voipio <[email protected]>
Cc: Aurelien Jarno <[email protected]>
Cc: Laurent Vivier <[email protected]>
Reviewed-by: Laurent Vivier <[email protected]>
Signed-off-by: Max Filippov <[email protected]>
linux-user/syscall.c

index 18ea79140f16d3a10ba099b200d3ffd4ef940134..d51e2a00ee31e70b60a18f3d70d83c141264b69e 100644 (file)
@@ -12092,15 +12092,16 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
         {
             struct mq_attr posix_mq_attr_in, posix_mq_attr_out;
             ret = 0;
-            if (arg3 != 0) {
-                ret = mq_getattr(arg1, &posix_mq_attr_out);
-                copy_to_user_mq_attr(arg3, &posix_mq_attr_out);
-            }
             if (arg2 != 0) {
                 copy_from_user_mq_attr(&posix_mq_attr_in, arg2);
-                ret |= mq_setattr(arg1, &posix_mq_attr_in, &posix_mq_attr_out);
+                ret = get_errno(mq_setattr(arg1, &posix_mq_attr_in,
+                                           &posix_mq_attr_out));
+            } else if (arg3 != 0) {
+                ret = get_errno(mq_getattr(arg1, &posix_mq_attr_out));
+            }
+            if (ret == 0 && arg3 != 0) {
+                copy_to_user_mq_attr(arg3, &posix_mq_attr_out);
             }
-
         }
         break;
 #endif
This page took 0.031108 seconds and 4 git commands to generate.