All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze
@ 2017-02-27 22:59 Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 01/31] 9pfs: fix v9fs_lock error case Greg Kurz
                   ` (33 more replies)
  0 siblings, 34 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 22:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The following changes since commit 8f2d7c341184a95d05476ea3c45dbae2b9ddbe51:

  Merge remote-tracking branch 'remotes/berrange/tags/pull-qcrypto-2017-02-27-1' into staging (2017-02-27 15:33:21 +0000)

are available in the git repository at:

  https://github.com/gkurz/qemu.git tags/for-upstream

for you to fetch changes up to a07ef65e3aeac852188331708716792930d819ef:

  9pfs: local: drop unused code (2017-02-27 22:45:17 +0100)

----------------------------------------------------------------
This pull request brings:
- a fix to a minor bug reported by Coverity
- throttling support in the local backend (command line only)
- a huge fix for CVE-2016-9602 (symlink attack vulnerability)

----------------------------------------------------------------
Greg Kurz (29):
      fsdev: add IO throttle support to fsdev devices
      9pfs: local: move xattr security ops to 9p-xattr.c
      9pfs: remove side-effects in local_init()
      9pfs: remove side-effects in local_open() and local_opendir()
      9pfs: introduce relative_openat_nofollow() helper
      9pfs: local: keep a file descriptor on the shared folder
      9pfs: local: open/opendir: don't follow symlinks
      9pfs: local: lgetxattr: don't follow symlinks
      9pfs: local: llistxattr: don't follow symlinks
      9pfs: local: lsetxattr: don't follow symlinks
      9pfs: local: lremovexattr: don't follow symlinks
      9pfs: local: unlinkat: don't follow symlinks
      9pfs: local: remove: don't follow symlinks
      9pfs: local: utimensat: don't follow symlinks
      9pfs: local: statfs: don't follow symlinks
      9pfs: local: truncate: don't follow symlinks
      9pfs: local: readlink: don't follow symlinks
      9pfs: local: lstat: don't follow symlinks
      9pfs: local: renameat: don't follow symlinks
      9pfs: local: rename: use renameat
      9pfs: local: improve error handling in link op
      9pfs: local: link: don't follow symlinks
      9pfs: local: chmod: don't follow symlinks
      9pfs: local: chown: don't follow symlinks
      9pfs: local: symlink: don't follow symlinks
      9pfs: local: mknod: don't follow symlinks
      9pfs: local: mkdir: don't follow symlinks
      9pfs: local: open2: don't follow symlinks
      9pfs: local: drop unused code

Paolo Bonzini (1):
      9pfs: fix v9fs_lock error case

Pradeep (1):
      throttle: factor out duplicate code

 blockdev.c                      |   83 +---
 fsdev/Makefile.objs             |    2 +-
 fsdev/file-op-9p.h              |    3 +
 fsdev/qemu-fsdev-opts.c         |    3 +
 fsdev/qemu-fsdev-throttle.c     |  118 +++++
 fsdev/qemu-fsdev-throttle.h     |   39 ++
 hw/9pfs/9p-local.c              | 1031 +++++++++++++++++++++------------------
 hw/9pfs/9p-local.h              |   20 +
 hw/9pfs/9p-posix-acl.c          |   44 +-
 hw/9pfs/9p-util.c               |   68 +++
 hw/9pfs/9p-util.h               |   53 ++
 hw/9pfs/9p-xattr-user.c         |   24 +-
 hw/9pfs/9p-xattr.c              |  166 ++++++-
 hw/9pfs/9p-xattr.h              |   87 +---
 hw/9pfs/9p.c                    |   19 +-
 hw/9pfs/Makefile.objs           |    2 +-
 hw/9pfs/cofile.c                |    2 +
 include/qemu/throttle-options.h |   92 ++++
 qemu-options.hx                 |    7 +-
 19 files changed, 1180 insertions(+), 683 deletions(-)
 create mode 100644 fsdev/qemu-fsdev-throttle.c
 create mode 100644 fsdev/qemu-fsdev-throttle.h
 create mode 100644 hw/9pfs/9p-local.h
 create mode 100644 hw/9pfs/9p-util.c
 create mode 100644 hw/9pfs/9p-util.h
 create mode 100644 include/qemu/throttle-options.h
-- 
2.7.4

^ permalink raw reply	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 01/31] 9pfs: fix v9fs_lock error case
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
@ 2017-02-27 22:59 ` Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 02/31] fsdev: add IO throttle support to fsdev devices Greg Kurz
                   ` (32 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 22:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz, Paolo Bonzini

From: Paolo Bonzini <pbonzini@redhat.com>

In this case, we are marshaling an error status instead of the errno value.
Reorganize the out and out_nofid labels to look like all the other cases.
Coverity reports this because the "err = -ENOENT" and "err = -EINVAL"
assignments above are dead, overwritten by the call to pdu_marshal.

(Coverity issues CID1348512 and CID1348513)

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(also open-coded the success path since locking is a nop for us, Greg Kurz)
Signed-off-by: Greg Kurz <groug@kaod.org>
---
 hw/9pfs/9p.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
index 3af1c93dc87d..d99abc46025e 100644
--- a/hw/9pfs/9p.c
+++ b/hw/9pfs/9p.c
@@ -3010,7 +3010,6 @@ out_nofid:
  */
 static void coroutine_fn v9fs_lock(void *opaque)
 {
-    int8_t status;
     V9fsFlock flock;
     size_t offset = 7;
     struct stat stbuf;
@@ -3018,7 +3017,6 @@ static void coroutine_fn v9fs_lock(void *opaque)
     int32_t fid, err = 0;
     V9fsPDU *pdu = opaque;
 
-    status = P9_LOCK_ERROR;
     v9fs_string_init(&flock.client_id);
     err = pdu_unmarshal(pdu, offset, "dbdqqds", &fid, &flock.type,
                         &flock.flags, &flock.start, &flock.length,
@@ -3044,15 +3042,15 @@ static void coroutine_fn v9fs_lock(void *opaque)
     if (err < 0) {
         goto out;
     }
-    status = P9_LOCK_SUCCESS;
+    err = pdu_marshal(pdu, offset, "b", P9_LOCK_SUCCESS);
+    if (err < 0) {
+        goto out;
+    }
+    err += offset;
+    trace_v9fs_lock_return(pdu->tag, pdu->id, P9_LOCK_SUCCESS);
 out:
     put_fid(pdu, fidp);
 out_nofid:
-    err = pdu_marshal(pdu, offset, "b", status);
-    if (err > 0) {
-        err += offset;
-    }
-    trace_v9fs_lock_return(pdu->tag, pdu->id, status);
     pdu_complete(pdu, err);
     v9fs_string_free(&flock.client_id);
 }
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 02/31] fsdev: add IO throttle support to fsdev devices
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 01/31] 9pfs: fix v9fs_lock error case Greg Kurz
@ 2017-02-27 22:59 ` Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 03/31] throttle: factor out duplicate code Greg Kurz
                   ` (31 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 22:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz, Pradeep Jagadeesh

This patchset adds the throttle support for the 9p-local driver.
For now this functionality can be enabled only through qemu cli options.
QMP interface and support to other drivers need further extensions.
To make it simple for other 9p drivers, the throttle code has been put in
separate files.

Signed-off-by: Pradeep Jagadeesh <pradeep.jagadeesh@huawei.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
(pass extra NULL CoMutex * argument to qemu_co_queue_wait(),
 added options to qemu-options.hx, Greg Kurz)
Signed-off-by: Greg Kurz <groug@kaod.org>
---
 fsdev/Makefile.objs         |   2 +-
 fsdev/file-op-9p.h          |   3 ++
 fsdev/qemu-fsdev-opts.c     |  77 ++++++++++++++++++++++++++++-
 fsdev/qemu-fsdev-throttle.c | 118 ++++++++++++++++++++++++++++++++++++++++++++
 fsdev/qemu-fsdev-throttle.h |  39 +++++++++++++++
 hw/9pfs/9p-local.c          |   8 +++
 hw/9pfs/9p.c                |   5 ++
 hw/9pfs/cofile.c            |   2 +
 qemu-options.hx             |   7 ++-
 9 files changed, 258 insertions(+), 3 deletions(-)
 create mode 100644 fsdev/qemu-fsdev-throttle.c
 create mode 100644 fsdev/qemu-fsdev-throttle.h

diff --git a/fsdev/Makefile.objs b/fsdev/Makefile.objs
index 1b120a4a7d47..659df6e18767 100644
--- a/fsdev/Makefile.objs
+++ b/fsdev/Makefile.objs
@@ -5,7 +5,7 @@ common-obj-y = qemu-fsdev.o 9p-marshal.o 9p-iov-marshal.o
 else
 common-obj-y = qemu-fsdev-dummy.o
 endif
-common-obj-y += qemu-fsdev-opts.o
+common-obj-y += qemu-fsdev-opts.o qemu-fsdev-throttle.o
 
 # Toplevel always builds this; targets without virtio will put it in
 # common-obj-y
diff --git a/fsdev/file-op-9p.h b/fsdev/file-op-9p.h
index a56dc8488dfc..0844a403dcd4 100644
--- a/fsdev/file-op-9p.h
+++ b/fsdev/file-op-9p.h
@@ -17,6 +17,7 @@
 #include <dirent.h>
 #include <utime.h>
 #include <sys/vfs.h>
+#include "qemu-fsdev-throttle.h"
 
 #define SM_LOCAL_MODE_BITS    0600
 #define SM_LOCAL_DIR_MODE_BITS    0700
@@ -74,6 +75,7 @@ typedef struct FsDriverEntry {
     char *path;
     int export_flags;
     FileOperations *ops;
+    FsThrottle fst;
 } FsDriverEntry;
 
 typedef struct FsContext
@@ -83,6 +85,7 @@ typedef struct FsContext
     int export_flags;
     struct xattr_operations **xops;
     struct extended_ops exops;
+    FsThrottle *fst;
     /* fs driver specific data */
     void *private;
 } FsContext;
diff --git a/fsdev/qemu-fsdev-opts.c b/fsdev/qemu-fsdev-opts.c
index 1dd8c7a24c9c..385423f02db6 100644
--- a/fsdev/qemu-fsdev-opts.c
+++ b/fsdev/qemu-fsdev-opts.c
@@ -37,8 +37,83 @@ static QemuOptsList qemu_fsdev_opts = {
         }, {
             .name = "sock_fd",
             .type = QEMU_OPT_NUMBER,
+        }, {
+            .name = "throttling.iops-total",
+            .type = QEMU_OPT_NUMBER,
+            .help = "limit total I/O operations per second",
+        }, {
+            .name = "throttling.iops-read",
+            .type = QEMU_OPT_NUMBER,
+            .help = "limit read operations per second",
+        }, {
+            .name = "throttling.iops-write",
+            .type = QEMU_OPT_NUMBER,
+            .help = "limit write operations per second",
+        }, {
+            .name = "throttling.bps-total",
+            .type = QEMU_OPT_NUMBER,
+            .help = "limit total bytes per second",
+        }, {
+            .name = "throttling.bps-read",
+            .type = QEMU_OPT_NUMBER,
+            .help = "limit read bytes per second",
+        }, {
+            .name = "throttling.bps-write",
+            .type = QEMU_OPT_NUMBER,
+            .help = "limit write bytes per second",
+        }, {
+            .name = "throttling.iops-total-max",
+            .type = QEMU_OPT_NUMBER,
+            .help = "I/O operations burst",
+        }, {
+            .name = "throttling.iops-read-max",
+            .type = QEMU_OPT_NUMBER,
+            .help = "I/O operations read burst",
+        }, {
+            .name = "throttling.iops-write-max",
+            .type = QEMU_OPT_NUMBER,
+            .help = "I/O operations write burst",
+        }, {
+            .name = "throttling.bps-total-max",
+            .type = QEMU_OPT_NUMBER,
+            .help = "total bytes burst",
+        }, {
+            .name = "throttling.bps-read-max",
+            .type = QEMU_OPT_NUMBER,
+            .help = "total bytes read burst",
+        }, {
+            .name = "throttling.bps-write-max",
+            .type = QEMU_OPT_NUMBER,
+            .help = "total bytes write burst",
+        }, {
+            .name = "throttling.iops-total-max-length",
+            .type = QEMU_OPT_NUMBER,
+            .help = "length of the iops-total-max burst period, in seconds",
+        }, {
+            .name = "throttling.iops-read-max-length",
+            .type = QEMU_OPT_NUMBER,
+            .help = "length of the iops-read-max burst period, in seconds",
+        }, {
+            .name = "throttling.iops-write-max-length",
+            .type = QEMU_OPT_NUMBER,
+            .help = "length of the iops-write-max burst period, in seconds",
+        }, {
+            .name = "throttling.bps-total-max-length",
+            .type = QEMU_OPT_NUMBER,
+            .help = "length of the bps-total-max burst period, in seconds",
+        }, {
+            .name = "throttling.bps-read-max-length",
+            .type = QEMU_OPT_NUMBER,
+            .help = "length of the bps-read-max burst period, in seconds",
+        }, {
+            .name = "throttling.bps-write-max-length",
+            .type = QEMU_OPT_NUMBER,
+            .help = "length of the bps-write-max burst period, in seconds",
+        }, {
+            .name = "throttling.iops-size",
+            .type = QEMU_OPT_NUMBER,
+            .help = "when limiting by iops max size of an I/O in bytes",
         },
-
         { /*End of list */ }
     },
 };
diff --git a/fsdev/qemu-fsdev-throttle.c b/fsdev/qemu-fsdev-throttle.c
new file mode 100644
index 000000000000..7ae4e866461b
--- /dev/null
+++ b/fsdev/qemu-fsdev-throttle.c
@@ -0,0 +1,118 @@
+/*
+ * Fsdev Throttle
+ *
+ * Copyright (C) 2016 Huawei Technologies Duesseldorf GmbH
+ *
+ * Author: Pradeep Jagadeesh <pradeep.jagadeesh@huawei.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.
+ *
+ * See the COPYING file in the top-level directory for details.
+ *
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/error-report.h"
+#include "qemu-fsdev-throttle.h"
+#include "qemu/iov.h"
+
+static void fsdev_throttle_read_timer_cb(void *opaque)
+{
+    FsThrottle *fst = opaque;
+    qemu_co_enter_next(&fst->throttled_reqs[false]);
+}
+
+static void fsdev_throttle_write_timer_cb(void *opaque)
+{
+    FsThrottle *fst = opaque;
+    qemu_co_enter_next(&fst->throttled_reqs[true]);
+}
+
+void fsdev_throttle_parse_opts(QemuOpts *opts, FsThrottle *fst, Error **errp)
+{
+    throttle_config_init(&fst->cfg);
+    fst->cfg.buckets[THROTTLE_BPS_TOTAL].avg =
+        qemu_opt_get_number(opts, "throttling.bps-total", 0);
+    fst->cfg.buckets[THROTTLE_BPS_READ].avg  =
+        qemu_opt_get_number(opts, "throttling.bps-read", 0);
+    fst->cfg.buckets[THROTTLE_BPS_WRITE].avg =
+        qemu_opt_get_number(opts, "throttling.bps-write", 0);
+    fst->cfg.buckets[THROTTLE_OPS_TOTAL].avg =
+        qemu_opt_get_number(opts, "throttling.iops-total", 0);
+    fst->cfg.buckets[THROTTLE_OPS_READ].avg =
+        qemu_opt_get_number(opts, "throttling.iops-read", 0);
+    fst->cfg.buckets[THROTTLE_OPS_WRITE].avg =
+        qemu_opt_get_number(opts, "throttling.iops-write", 0);
+
+    fst->cfg.buckets[THROTTLE_BPS_TOTAL].max =
+        qemu_opt_get_number(opts, "throttling.bps-total-max", 0);
+    fst->cfg.buckets[THROTTLE_BPS_READ].max  =
+        qemu_opt_get_number(opts, "throttling.bps-read-max", 0);
+    fst->cfg.buckets[THROTTLE_BPS_WRITE].max =
+        qemu_opt_get_number(opts, "throttling.bps-write-max", 0);
+    fst->cfg.buckets[THROTTLE_OPS_TOTAL].max =
+        qemu_opt_get_number(opts, "throttling.iops-total-max", 0);
+    fst->cfg.buckets[THROTTLE_OPS_READ].max =
+        qemu_opt_get_number(opts, "throttling.iops-read-max", 0);
+    fst->cfg.buckets[THROTTLE_OPS_WRITE].max =
+        qemu_opt_get_number(opts, "throttling.iops-write-max", 0);
+
+    fst->cfg.buckets[THROTTLE_BPS_TOTAL].burst_length =
+        qemu_opt_get_number(opts, "throttling.bps-total-max-length", 1);
+    fst->cfg.buckets[THROTTLE_BPS_READ].burst_length  =
+        qemu_opt_get_number(opts, "throttling.bps-read-max-length", 1);
+    fst->cfg.buckets[THROTTLE_BPS_WRITE].burst_length =
+        qemu_opt_get_number(opts, "throttling.bps-write-max-length", 1);
+    fst->cfg.buckets[THROTTLE_OPS_TOTAL].burst_length =
+        qemu_opt_get_number(opts, "throttling.iops-total-max-length", 1);
+    fst->cfg.buckets[THROTTLE_OPS_READ].burst_length =
+        qemu_opt_get_number(opts, "throttling.iops-read-max-length", 1);
+    fst->cfg.buckets[THROTTLE_OPS_WRITE].burst_length =
+        qemu_opt_get_number(opts, "throttling.iops-write-max-length", 1);
+    fst->cfg.op_size =
+        qemu_opt_get_number(opts, "throttling.iops-size", 0);
+
+    throttle_is_valid(&fst->cfg, errp);
+}
+
+void fsdev_throttle_init(FsThrottle *fst)
+{
+    if (throttle_enabled(&fst->cfg)) {
+        throttle_init(&fst->ts);
+        throttle_timers_init(&fst->tt,
+                             qemu_get_aio_context(),
+                             QEMU_CLOCK_REALTIME,
+                             fsdev_throttle_read_timer_cb,
+                             fsdev_throttle_write_timer_cb,
+                             fst);
+        throttle_config(&fst->ts, &fst->tt, &fst->cfg);
+        qemu_co_queue_init(&fst->throttled_reqs[0]);
+        qemu_co_queue_init(&fst->throttled_reqs[1]);
+    }
+}
+
+void coroutine_fn fsdev_co_throttle_request(FsThrottle *fst, bool is_write,
+                                            struct iovec *iov, int iovcnt)
+{
+    if (throttle_enabled(&fst->cfg)) {
+        if (throttle_schedule_timer(&fst->ts, &fst->tt, is_write) ||
+            !qemu_co_queue_empty(&fst->throttled_reqs[is_write])) {
+            qemu_co_queue_wait(&fst->throttled_reqs[is_write], NULL);
+        }
+
+        throttle_account(&fst->ts, is_write, iov_size(iov, iovcnt));
+
+        if (!qemu_co_queue_empty(&fst->throttled_reqs[is_write]) &&
+            !throttle_schedule_timer(&fst->ts, &fst->tt, is_write)) {
+            qemu_co_queue_next(&fst->throttled_reqs[is_write]);
+        }
+    }
+}
+
+void fsdev_throttle_cleanup(FsThrottle *fst)
+{
+    if (throttle_enabled(&fst->cfg)) {
+        throttle_timers_destroy(&fst->tt);
+    }
+}
diff --git a/fsdev/qemu-fsdev-throttle.h b/fsdev/qemu-fsdev-throttle.h
new file mode 100644
index 000000000000..e418643ccbea
--- /dev/null
+++ b/fsdev/qemu-fsdev-throttle.h
@@ -0,0 +1,39 @@
+/*
+ * Fsdev Throttle
+ *
+ * Copyright (C) 2016 Huawei Technologies Duesseldorf GmbH
+ *
+ * Author: Pradeep Jagadeesh <pradeep.jagadeesh@huawei.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.
+ *
+ * See the COPYING file in the top-level directory for details.
+ *
+ */
+
+#ifndef _FSDEV_THROTTLE_H
+#define _FSDEV_THROTTLE_H
+
+#include "block/aio.h"
+#include "qemu/main-loop.h"
+#include "qemu/coroutine.h"
+#include "qapi/error.h"
+#include "qemu/throttle.h"
+
+typedef struct FsThrottle {
+    ThrottleState ts;
+    ThrottleTimers tt;
+    ThrottleConfig cfg;
+    CoQueue      throttled_reqs[2];
+} FsThrottle;
+
+void fsdev_throttle_parse_opts(QemuOpts *, FsThrottle *, Error **);
+
+void fsdev_throttle_init(FsThrottle *);
+
+void coroutine_fn fsdev_co_throttle_request(FsThrottle *, bool ,
+                                            struct iovec *, int);
+
+void fsdev_throttle_cleanup(FsThrottle *);
+#endif /* _FSDEV_THROTTLE_H */
diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 7de07e1ba67f..2369b918aa3f 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -1208,6 +1208,7 @@ static int local_parse_opts(QemuOpts *opts, struct FsDriverEntry *fse)
 {
     const char *sec_model = qemu_opt_get(opts, "security_model");
     const char *path = qemu_opt_get(opts, "path");
+    Error *err = NULL;
 
     if (!sec_model) {
         error_report("Security model not specified, local fs needs security model");
@@ -1236,6 +1237,13 @@ static int local_parse_opts(QemuOpts *opts, struct FsDriverEntry *fse)
         error_report("fsdev: No path specified");
         return -1;
     }
+
+    fsdev_throttle_parse_opts(opts, &fse->fst, &err);
+    if (err) {
+        error_reportf_err(err, "Throttle configuration is not valid: ");
+        return -1;
+    }
+
     fse->path = g_strdup(path);
 
     return 0;
diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
index d99abc46025e..76c9247c777d 100644
--- a/hw/9pfs/9p.c
+++ b/hw/9pfs/9p.c
@@ -3529,6 +3529,10 @@ int v9fs_device_realize_common(V9fsState *s, Error **errp)
         error_setg(errp, "share path %s is not a directory", fse->path);
         goto out;
     }
+
+    s->ctx.fst = &fse->fst;
+    fsdev_throttle_init(s->ctx.fst);
+
     v9fs_path_free(&path);
 
     rc = 0;
@@ -3549,6 +3553,7 @@ void v9fs_device_unrealize_common(V9fsState *s, Error **errp)
     if (s->ops->cleanup) {
         s->ops->cleanup(&s->ctx);
     }
+    fsdev_throttle_cleanup(s->ctx.fst);
     g_free(s->tag);
     g_free(s->ctx.fs_root);
 }
diff --git a/hw/9pfs/cofile.c b/hw/9pfs/cofile.c
index 120e2671080b..88791bc327ac 100644
--- a/hw/9pfs/cofile.c
+++ b/hw/9pfs/cofile.c
@@ -247,6 +247,7 @@ int coroutine_fn v9fs_co_pwritev(V9fsPDU *pdu, V9fsFidState *fidp,
     if (v9fs_request_cancelled(pdu)) {
         return -EINTR;
     }
+    fsdev_co_throttle_request(s->ctx.fst, true, iov, iovcnt);
     v9fs_co_run_in_worker(
         {
             err = s->ops->pwritev(&s->ctx, &fidp->fs, iov, iovcnt, offset);
@@ -266,6 +267,7 @@ int coroutine_fn v9fs_co_preadv(V9fsPDU *pdu, V9fsFidState *fidp,
     if (v9fs_request_cancelled(pdu)) {
         return -EINTR;
     }
+    fsdev_co_throttle_request(s->ctx.fst, false, iov, iovcnt);
     v9fs_co_run_in_worker(
         {
             err = s->ops->preadv(&s->ctx, &fidp->fs, iov, iovcnt, offset);
diff --git a/qemu-options.hx b/qemu-options.hx
index bf458f83c32d..82528804c3cc 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -744,7 +744,12 @@ ETEXI
 
 DEF("fsdev", HAS_ARG, QEMU_OPTION_fsdev,
     "-fsdev fsdriver,id=id[,path=path,][security_model={mapped-xattr|mapped-file|passthrough|none}]\n"
-    " [,writeout=immediate][,readonly][,socket=socket|sock_fd=sock_fd]\n",
+    " [,writeout=immediate][,readonly][,socket=socket|sock_fd=sock_fd]\n"
+    " [[,throttling.bps-total=b]|[[,throttling.bps-read=r][,throttling.bps-write=w]]]\n"
+    " [[,throttling.iops-total=i]|[[,throttling.iops-read=r][,throttling.iops-write=w]]]\n"
+    " [[,throttling.bps-total-max=bm]|[[,throttling.bps-read-max=rm][,throttling.bps-write-max=wm]]]\n"
+    " [[,throttling.iops-total-max=im]|[[,throttling.iops-read-max=irm][,throttling.iops-write-max=iwm]]]\n"
+    " [[,throttling.iops-size=is]]\n",
     QEMU_ARCH_ALL)
 
 STEXI
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 03/31] throttle: factor out duplicate code
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 01/31] 9pfs: fix v9fs_lock error case Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 02/31] fsdev: add IO throttle support to fsdev devices Greg Kurz
@ 2017-02-27 22:59 ` Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 04/31] 9pfs: local: move xattr security ops to 9p-xattr.c Greg Kurz
                   ` (30 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 22:59 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz, Pradeep, Pradeep Jagadeesh

From: Pradeep <pradeepkiruvale@gmail.com>

This patch removes the redundant throttle code that was present in
block and fsdev device files. Now the common code is moved
to a single file.

Signed-off-by: Pradeep Jagadeesh <pradeep.jagadeesh@huawei.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
(fix indent nit, Greg Kurz)
Signed-off-by: Greg Kurz <groug@kaod.org>
---
 blockdev.c                      | 83 +++----------------------------------
 fsdev/qemu-fsdev-opts.c         | 80 ++---------------------------------
 include/qemu/throttle-options.h | 92 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 102 insertions(+), 153 deletions(-)
 create mode 100644 include/qemu/throttle-options.h

diff --git a/blockdev.c b/blockdev.c
index 2b2f6ceef036..8682bd81d889 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -52,6 +52,7 @@
 #include "sysemu/arch_init.h"
 #include "qemu/cutils.h"
 #include "qemu/help_option.h"
+#include "qemu/throttle-options.h"
 
 static QTAILQ_HEAD(, BlockDriverState) monitor_bdrv_states =
     QTAILQ_HEAD_INITIALIZER(monitor_bdrv_states);
@@ -4007,83 +4008,11 @@ QemuOptsList qemu_common_drive_opts = {
             .name = BDRV_OPT_READ_ONLY,
             .type = QEMU_OPT_BOOL,
             .help = "open drive file as read-only",
-        },{
-            .name = "throttling.iops-total",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit total I/O operations per second",
-        },{
-            .name = "throttling.iops-read",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit read operations per second",
-        },{
-            .name = "throttling.iops-write",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit write operations per second",
-        },{
-            .name = "throttling.bps-total",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit total bytes per second",
-        },{
-            .name = "throttling.bps-read",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit read bytes per second",
-        },{
-            .name = "throttling.bps-write",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit write bytes per second",
-        },{
-            .name = "throttling.iops-total-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "I/O operations burst",
-        },{
-            .name = "throttling.iops-read-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "I/O operations read burst",
-        },{
-            .name = "throttling.iops-write-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "I/O operations write burst",
-        },{
-            .name = "throttling.bps-total-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "total bytes burst",
-        },{
-            .name = "throttling.bps-read-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "total bytes read burst",
-        },{
-            .name = "throttling.bps-write-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "total bytes write burst",
-        },{
-            .name = "throttling.iops-total-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the iops-total-max burst period, in seconds",
-        },{
-            .name = "throttling.iops-read-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the iops-read-max burst period, in seconds",
-        },{
-            .name = "throttling.iops-write-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the iops-write-max burst period, in seconds",
-        },{
-            .name = "throttling.bps-total-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the bps-total-max burst period, in seconds",
-        },{
-            .name = "throttling.bps-read-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the bps-read-max burst period, in seconds",
-        },{
-            .name = "throttling.bps-write-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the bps-write-max burst period, in seconds",
-        },{
-            .name = "throttling.iops-size",
-            .type = QEMU_OPT_NUMBER,
-            .help = "when limiting by iops max size of an I/O in bytes",
-        },{
+        },
+
+        THROTTLE_OPTS,
+
+        {
             .name = "throttling.group",
             .type = QEMU_OPT_STRING,
             .help = "name of the block throttling group",
diff --git a/fsdev/qemu-fsdev-opts.c b/fsdev/qemu-fsdev-opts.c
index 385423f02db6..bf5713008a1b 100644
--- a/fsdev/qemu-fsdev-opts.c
+++ b/fsdev/qemu-fsdev-opts.c
@@ -9,6 +9,7 @@
 #include "qemu/config-file.h"
 #include "qemu/option.h"
 #include "qemu/module.h"
+#include "qemu/throttle-options.h"
 
 static QemuOptsList qemu_fsdev_opts = {
     .name = "fsdev",
@@ -37,83 +38,10 @@ static QemuOptsList qemu_fsdev_opts = {
         }, {
             .name = "sock_fd",
             .type = QEMU_OPT_NUMBER,
-        }, {
-            .name = "throttling.iops-total",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit total I/O operations per second",
-        }, {
-            .name = "throttling.iops-read",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit read operations per second",
-        }, {
-            .name = "throttling.iops-write",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit write operations per second",
-        }, {
-            .name = "throttling.bps-total",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit total bytes per second",
-        }, {
-            .name = "throttling.bps-read",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit read bytes per second",
-        }, {
-            .name = "throttling.bps-write",
-            .type = QEMU_OPT_NUMBER,
-            .help = "limit write bytes per second",
-        }, {
-            .name = "throttling.iops-total-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "I/O operations burst",
-        }, {
-            .name = "throttling.iops-read-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "I/O operations read burst",
-        }, {
-            .name = "throttling.iops-write-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "I/O operations write burst",
-        }, {
-            .name = "throttling.bps-total-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "total bytes burst",
-        }, {
-            .name = "throttling.bps-read-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "total bytes read burst",
-        }, {
-            .name = "throttling.bps-write-max",
-            .type = QEMU_OPT_NUMBER,
-            .help = "total bytes write burst",
-        }, {
-            .name = "throttling.iops-total-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the iops-total-max burst period, in seconds",
-        }, {
-            .name = "throttling.iops-read-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the iops-read-max burst period, in seconds",
-        }, {
-            .name = "throttling.iops-write-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the iops-write-max burst period, in seconds",
-        }, {
-            .name = "throttling.bps-total-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the bps-total-max burst period, in seconds",
-        }, {
-            .name = "throttling.bps-read-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the bps-read-max burst period, in seconds",
-        }, {
-            .name = "throttling.bps-write-max-length",
-            .type = QEMU_OPT_NUMBER,
-            .help = "length of the bps-write-max burst period, in seconds",
-        }, {
-            .name = "throttling.iops-size",
-            .type = QEMU_OPT_NUMBER,
-            .help = "when limiting by iops max size of an I/O in bytes",
         },
+
+        THROTTLE_OPTS,
+
         { /*End of list */ }
     },
 };
diff --git a/include/qemu/throttle-options.h b/include/qemu/throttle-options.h
new file mode 100644
index 000000000000..3133d1ca4022
--- /dev/null
+++ b/include/qemu/throttle-options.h
@@ -0,0 +1,92 @@
+/*
+ * QEMU throttling command line options
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.
+ *
+ * See the COPYING file in the top-level directory for details.
+ *
+ */
+#ifndef THROTTLE_OPTIONS_H
+#define THROTTLE_OPTIONS_H
+
+#define THROTTLE_OPTS \
+          { \
+            .name = "throttling.iops-total",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit total I/O operations per second",\
+        },{ \
+            .name = "throttling.iops-read",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit read operations per second",\
+        },{ \
+            .name = "throttling.iops-write",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit write operations per second",\
+        },{ \
+            .name = "throttling.bps-total",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit total bytes per second",\
+        },{ \
+            .name = "throttling.bps-read",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit read bytes per second",\
+        },{ \
+            .name = "throttling.bps-write",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit write bytes per second",\
+        },{ \
+            .name = "throttling.iops-total-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "I/O operations burst",\
+        },{ \
+            .name = "throttling.iops-read-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "I/O operations read burst",\
+        },{ \
+            .name = "throttling.iops-write-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "I/O operations write burst",\
+        },{ \
+            .name = "throttling.bps-total-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "total bytes burst",\
+        },{ \
+            .name = "throttling.bps-read-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "total bytes read burst",\
+        },{ \
+            .name = "throttling.bps-write-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "total bytes write burst",\
+        },{ \
+            .name = "throttling.iops-total-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the iops-total-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.iops-read-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the iops-read-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.iops-write-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the iops-write-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.bps-total-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the bps-total-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.bps-read-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the bps-read-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.bps-write-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the bps-write-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.iops-size",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "when limiting by iops max size of an I/O in bytes",\
+        }
+
+#endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 04/31] 9pfs: local: move xattr security ops to 9p-xattr.c
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (2 preceding siblings ...)
  2017-02-27 22:59 ` [Qemu-devel] [PULL 03/31] throttle: factor out duplicate code Greg Kurz
@ 2017-02-27 22:59 ` Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 05/31] 9pfs: remove side-effects in local_init() Greg Kurz
                   ` (29 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 22:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

These functions are always called indirectly. It really doesn't make sense
for them to sit in a header file.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-xattr.c | 61 +++++++++++++++++++++++++++++++++++++++++
 hw/9pfs/9p-xattr.h | 80 ++++++++++--------------------------------------------
 2 files changed, 75 insertions(+), 66 deletions(-)

diff --git a/hw/9pfs/9p-xattr.c b/hw/9pfs/9p-xattr.c
index 5d8595ed932a..19a2daf02f5c 100644
--- a/hw/9pfs/9p-xattr.c
+++ b/hw/9pfs/9p-xattr.c
@@ -143,6 +143,67 @@ int v9fs_remove_xattr(FsContext *ctx,
 
 }
 
+ssize_t pt_getxattr(FsContext *ctx, const char *path, const char *name,
+                    void *value, size_t size)
+{
+    char *buffer;
+    ssize_t ret;
+
+    buffer = rpath(ctx, path);
+    ret = lgetxattr(buffer, name, value, size);
+    g_free(buffer);
+    return ret;
+}
+
+int pt_setxattr(FsContext *ctx, const char *path, const char *name, void *value,
+                size_t size, int flags)
+{
+    char *buffer;
+    int ret;
+
+    buffer = rpath(ctx, path);
+    ret = lsetxattr(buffer, name, value, size, flags);
+    g_free(buffer);
+    return ret;
+}
+
+int pt_removexattr(FsContext *ctx, const char *path, const char *name)
+{
+    char *buffer;
+    int ret;
+
+    buffer = rpath(ctx, path);
+    ret = lremovexattr(path, name);
+    g_free(buffer);
+    return ret;
+}
+
+ssize_t notsup_getxattr(FsContext *ctx, const char *path, const char *name,
+                        void *value, size_t size)
+{
+    errno = ENOTSUP;
+    return -1;
+}
+
+int notsup_setxattr(FsContext *ctx, const char *path, const char *name,
+                    void *value, size_t size, int flags)
+{
+    errno = ENOTSUP;
+    return -1;
+}
+
+ssize_t notsup_listxattr(FsContext *ctx, const char *path, char *name,
+                         void *value, size_t size)
+{
+    return 0;
+}
+
+int notsup_removexattr(FsContext *ctx, const char *path, const char *name)
+{
+    errno = ENOTSUP;
+    return -1;
+}
+
 XattrOperations *mapped_xattr_ops[] = {
     &mapped_user_xattr,
     &mapped_pacl_xattr,
diff --git a/hw/9pfs/9p-xattr.h b/hw/9pfs/9p-xattr.h
index a853ea641c0b..3f43f5153f3c 100644
--- a/hw/9pfs/9p-xattr.h
+++ b/hw/9pfs/9p-xattr.h
@@ -49,73 +49,21 @@ ssize_t v9fs_list_xattr(FsContext *ctx, const char *path, void *value,
 int v9fs_set_xattr(FsContext *ctx, const char *path, const char *name,
                           void *value, size_t size, int flags);
 int v9fs_remove_xattr(FsContext *ctx, const char *path, const char *name);
+
 ssize_t pt_listxattr(FsContext *ctx, const char *path, char *name, void *value,
                      size_t size);
-
-static inline ssize_t pt_getxattr(FsContext *ctx, const char *path,
-                                  const char *name, void *value, size_t size)
-{
-    char *buffer;
-    ssize_t ret;
-
-    buffer = rpath(ctx, path);
-    ret = lgetxattr(buffer, name, value, size);
-    g_free(buffer);
-    return ret;
-}
-
-static inline int pt_setxattr(FsContext *ctx, const char *path,
-                              const char *name, void *value,
-                              size_t size, int flags)
-{
-    char *buffer;
-    int ret;
-
-    buffer = rpath(ctx, path);
-    ret = lsetxattr(buffer, name, value, size, flags);
-    g_free(buffer);
-    return ret;
-}
-
-static inline int pt_removexattr(FsContext *ctx,
-                                 const char *path, const char *name)
-{
-    char *buffer;
-    int ret;
-
-    buffer = rpath(ctx, path);
-    ret = lremovexattr(path, name);
-    g_free(buffer);
-    return ret;
-}
-
-static inline ssize_t notsup_getxattr(FsContext *ctx, const char *path,
-                                      const char *name, void *value,
-                                      size_t size)
-{
-    errno = ENOTSUP;
-    return -1;
-}
-
-static inline int notsup_setxattr(FsContext *ctx, const char *path,
-                                  const char *name, void *value,
-                                  size_t size, int flags)
-{
-    errno = ENOTSUP;
-    return -1;
-}
-
-static inline ssize_t notsup_listxattr(FsContext *ctx, const char *path,
-                                       char *name, void *value, size_t size)
-{
-    return 0;
-}
-
-static inline int notsup_removexattr(FsContext *ctx,
-                                     const char *path, const char *name)
-{
-    errno = ENOTSUP;
-    return -1;
-}
+ssize_t pt_getxattr(FsContext *ctx, const char *path, const char *name,
+                    void *value, size_t size);
+int pt_setxattr(FsContext *ctx, const char *path, const char *name, void *value,
+                size_t size, int flags);
+int pt_removexattr(FsContext *ctx, const char *path, const char *name);
+
+ssize_t notsup_getxattr(FsContext *ctx, const char *path, const char *name,
+                        void *value, size_t size);
+int notsup_setxattr(FsContext *ctx, const char *path, const char *name,
+                    void *value, size_t size, int flags);
+ssize_t notsup_listxattr(FsContext *ctx, const char *path, char *name,
+                         void *value, size_t size);
+int notsup_removexattr(FsContext *ctx, const char *path, const char *name);
 
 #endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 05/31] 9pfs: remove side-effects in local_init()
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (3 preceding siblings ...)
  2017-02-27 22:59 ` [Qemu-devel] [PULL 04/31] 9pfs: local: move xattr security ops to 9p-xattr.c Greg Kurz
@ 2017-02-27 22:59 ` Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 06/31] 9pfs: remove side-effects in local_open() and local_opendir() Greg Kurz
                   ` (28 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 22:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

If this function fails, it should not modify *ctx.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 37 +++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 2369b918aa3f..1ede63f57772 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -1168,9 +1168,25 @@ static int local_ioc_getversion(FsContext *ctx, V9fsPath *path,
 
 static int local_init(FsContext *ctx)
 {
-    int err = 0;
     struct statfs stbuf;
 
+#ifdef FS_IOC_GETVERSION
+    /*
+     * use ioc_getversion only if the ioctl is definied
+     */
+    if (statfs(ctx->fs_root, &stbuf) < 0) {
+        return -1;
+    }
+    switch (stbuf.f_type) {
+    case EXT2_SUPER_MAGIC:
+    case BTRFS_SUPER_MAGIC:
+    case REISERFS_SUPER_MAGIC:
+    case XFS_SUPER_MAGIC:
+        ctx->exops.get_st_gen = local_ioc_getversion;
+        break;
+    }
+#endif
+
     if (ctx->export_flags & V9FS_SM_PASSTHROUGH) {
         ctx->xops = passthrough_xattr_ops;
     } else if (ctx->export_flags & V9FS_SM_MAPPED) {
@@ -1185,23 +1201,8 @@ static int local_init(FsContext *ctx)
         ctx->xops = passthrough_xattr_ops;
     }
     ctx->export_flags |= V9FS_PATHNAME_FSCONTEXT;
-#ifdef FS_IOC_GETVERSION
-    /*
-     * use ioc_getversion only if the iocl is definied
-     */
-    err = statfs(ctx->fs_root, &stbuf);
-    if (!err) {
-        switch (stbuf.f_type) {
-        case EXT2_SUPER_MAGIC:
-        case BTRFS_SUPER_MAGIC:
-        case REISERFS_SUPER_MAGIC:
-        case XFS_SUPER_MAGIC:
-            ctx->exops.get_st_gen = local_ioc_getversion;
-            break;
-        }
-    }
-#endif
-    return err;
+
+    return 0;
 }
 
 static int local_parse_opts(QemuOpts *opts, struct FsDriverEntry *fse)
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 06/31] 9pfs: remove side-effects in local_open() and local_opendir()
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (4 preceding siblings ...)
  2017-02-27 22:59 ` [Qemu-devel] [PULL 05/31] 9pfs: remove side-effects in local_init() Greg Kurz
@ 2017-02-27 22:59 ` Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 07/31] 9pfs: introduce relative_openat_nofollow() helper Greg Kurz
                   ` (27 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 22:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

If these functions fail, they should not change *fs. Let's use local
variables to fix this.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 1ede63f57772..6b2ebbc631bd 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -356,10 +356,15 @@ static int local_open(FsContext *ctx, V9fsPath *fs_path,
 {
     char *buffer;
     char *path = fs_path->data;
+    int fd;
 
     buffer = rpath(ctx, path);
-    fs->fd = open(buffer, flags | O_NOFOLLOW);
+    fd = open(buffer, flags | O_NOFOLLOW);
     g_free(buffer);
+    if (fd == -1) {
+        return -1;
+    }
+    fs->fd = fd;
     return fs->fd;
 }
 
@@ -368,13 +373,15 @@ static int local_opendir(FsContext *ctx,
 {
     char *buffer;
     char *path = fs_path->data;
+    DIR *stream;
 
     buffer = rpath(ctx, path);
-    fs->dir.stream = opendir(buffer);
+    stream = opendir(buffer);
     g_free(buffer);
-    if (!fs->dir.stream) {
+    if (!stream) {
         return -1;
     }
+    fs->dir.stream = stream;
     return 0;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 07/31] 9pfs: introduce relative_openat_nofollow() helper
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (5 preceding siblings ...)
  2017-02-27 22:59 ` [Qemu-devel] [PULL 06/31] 9pfs: remove side-effects in local_open() and local_opendir() Greg Kurz
@ 2017-02-27 22:59 ` Greg Kurz
  2017-02-27 23:37   ` Eric Blake
  2017-02-27 22:59 ` [Qemu-devel] [PULL 08/31] 9pfs: local: keep a file descriptor on the shared folder Greg Kurz
                   ` (26 subsequent siblings)
  33 siblings, 1 reply; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 22:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

When using the passthrough security mode, symbolic links created by the
guest are actual symbolic links on the host file system.

Since the resolution of symbolic links during path walk is supposed to
occur on the client side. The server should hence never receive any path
pointing to an actual symbolic link. This isn't guaranteed by the protocol
though, and malicious code in the guest can trick the server to issue
various syscalls on paths whose one or more elements are symbolic links.
In the case of the "local" backend using the "passthrough" or "none"
security modes, the guest can directly create symbolic links to arbitrary
locations on the host (as per spec). The "mapped-xattr" and "mapped-file"
security modes are also affected to a lesser extent as they require some
help from an external entity to create actual symbolic links on the host,
i.e. another guest using "passthrough" mode for example.

The current code hence relies on O_NOFOLLOW and "l*()" variants of system
calls. Unfortunately, this only applies to the rightmost path component.
A guest could maliciously replace any component in a trusted path with a
symbolic link. This could allow any guest to escape a virtfs shared folder.

This patch introduces a variant of the openat() syscall that successively
opens each path element with O_NOFOLLOW. When passing a file descriptor
pointing to a trusted directory, one is guaranteed to be returned a
file descriptor pointing to a path which is beneath the trusted directory.
This will be used by subsequent patches to implement symlink-safe path walk
for any access to the backend.

Symbolic links aren't the only threats actually: a malicious guest could
change a path element to point to other types of file with undesirable
effects:
- a named pipe or any other thing that would cause openat() to block
- a terminal device which would become QEMU's controlling terminal

These issues can be addressed with O_NONBLOCK and O_NOCTTY.

Two helpers are introduced: one to open intermediate path elements and one
to open the rightmost path element.

Suggested-by: Jann Horn <jannh@google.com>
Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
(renamed openat_nofollow() to relative_openat_nofollow(),
 assert path is relative, Greg Kurz)
Signed-off-by: Greg Kurz <groug@kaod.org>
---
 hw/9pfs/9p-util.c     | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/9pfs/9p-util.h     | 49 ++++++++++++++++++++++++++++++++++++++++++++
 hw/9pfs/Makefile.objs |  2 +-
 3 files changed, 106 insertions(+), 1 deletion(-)
 create mode 100644 hw/9pfs/9p-util.c
 create mode 100644 hw/9pfs/9p-util.h

diff --git a/hw/9pfs/9p-util.c b/hw/9pfs/9p-util.c
new file mode 100644
index 000000000000..4329a638cded
--- /dev/null
+++ b/hw/9pfs/9p-util.c
@@ -0,0 +1,56 @@
+/*
+ * 9p utilities
+ *
+ * Copyright IBM, Corp. 2017
+ *
+ * Authors:
+ *  Greg Kurz <groug@kaod.org>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "9p-util.h"
+
+int relative_openat_nofollow(int dirfd, const char *path, int flags,
+                             mode_t mode)
+{
+    int fd;
+
+    assert(path[0] != '/');
+
+    fd = dup(dirfd);
+    if (fd == -1) {
+        return -1;
+    }
+
+    while (*path) {
+        const char *c;
+        int next_fd;
+        char *head;
+
+        head = g_strdup(path);
+        c = strchr(path, '/');
+        if (c) {
+            head[c - path] = 0;
+            next_fd = openat_dir(fd, head);
+        } else {
+            next_fd = openat_file(fd, head, flags, mode);
+        }
+        g_free(head);
+        if (next_fd == -1) {
+            close_preserve_errno(fd);
+            return -1;
+        }
+        close(fd);
+        fd = next_fd;
+
+        if (!c) {
+            break;
+        }
+        path = c + 1;
+    }
+
+    return fd;
+}
diff --git a/hw/9pfs/9p-util.h b/hw/9pfs/9p-util.h
new file mode 100644
index 000000000000..e3d5b66a15bc
--- /dev/null
+++ b/hw/9pfs/9p-util.h
@@ -0,0 +1,49 @@
+/*
+ * 9p utilities
+ *
+ * Copyright IBM, Corp. 2017
+ *
+ * Authors:
+ *  Greg Kurz <groug@kaod.org>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef QEMU_9P_UTIL_H
+#define QEMU_9P_UTIL_H
+
+static inline void close_preserve_errno(int fd)
+{
+    int serrno = errno;
+    close(fd);
+    errno = serrno;
+}
+
+static inline int openat_dir(int dirfd, const char *name)
+{
+    return openat(dirfd, name, O_DIRECTORY | O_RDONLY | O_PATH);
+}
+
+static inline int openat_file(int dirfd, const char *name, int flags,
+                              mode_t mode)
+{
+    int fd, serrno;
+
+    fd = openat(dirfd, name, flags | O_NOFOLLOW | O_NOCTTY | O_NONBLOCK,
+                mode);
+    if (fd == -1) {
+        return -1;
+    }
+
+    serrno = errno;
+    /* O_NONBLOCK was only needed to open the file. Let's drop it. */
+    assert(!fcntl(fd, F_SETFL, flags));
+    errno = serrno;
+    return fd;
+}
+
+int relative_openat_nofollow(int dirfd, const char *path, int flags,
+                             mode_t mode);
+
+#endif
diff --git a/hw/9pfs/Makefile.objs b/hw/9pfs/Makefile.objs
index da0ae0cfdbae..32197e6671dd 100644
--- a/hw/9pfs/Makefile.objs
+++ b/hw/9pfs/Makefile.objs
@@ -1,4 +1,4 @@
-common-obj-y  = 9p.o
+common-obj-y  = 9p.o 9p-util.o
 common-obj-y += 9p-local.o 9p-xattr.o
 common-obj-y += 9p-xattr-user.o 9p-posix-acl.o
 common-obj-y += coth.o cofs.o codir.o cofile.o
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 08/31] 9pfs: local: keep a file descriptor on the shared folder
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (6 preceding siblings ...)
  2017-02-27 22:59 ` [Qemu-devel] [PULL 07/31] 9pfs: introduce relative_openat_nofollow() helper Greg Kurz
@ 2017-02-27 22:59 ` Greg Kurz
  2017-02-27 22:59 ` [Qemu-devel] [PULL 09/31] 9pfs: local: open/opendir: don't follow symlinks Greg Kurz
                   ` (25 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 22:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

This patch opens the shared folder and caches the file descriptor, so that
it can be used to do symlink-safe path walk.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 6b2ebbc631bd..b58d0bc65439 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -14,6 +14,7 @@
 #include "qemu/osdep.h"
 #include "9p.h"
 #include "9p-xattr.h"
+#include "9p-util.h"
 #include "fsdev/qemu-fsdev.h"   /* local_ops */
 #include <arpa/inet.h>
 #include <pwd.h>
@@ -43,6 +44,10 @@
 #define BTRFS_SUPER_MAGIC 0x9123683E
 #endif
 
+typedef struct {
+    int mountfd;
+} LocalData;
+
 #define VIRTFS_META_DIR ".virtfs_metadata"
 
 static char *local_mapped_attr_path(FsContext *ctx, const char *path)
@@ -1176,13 +1181,20 @@ static int local_ioc_getversion(FsContext *ctx, V9fsPath *path,
 static int local_init(FsContext *ctx)
 {
     struct statfs stbuf;
+    LocalData *data = g_malloc(sizeof(*data));
+
+    data->mountfd = open(ctx->fs_root, O_DIRECTORY | O_RDONLY);
+    if (data->mountfd == -1) {
+        goto err;
+    }
 
 #ifdef FS_IOC_GETVERSION
     /*
      * use ioc_getversion only if the ioctl is definied
      */
-    if (statfs(ctx->fs_root, &stbuf) < 0) {
-        return -1;
+    if (fstatfs(data->mountfd, &stbuf) < 0) {
+        close_preserve_errno(data->mountfd);
+        goto err;
     }
     switch (stbuf.f_type) {
     case EXT2_SUPER_MAGIC:
@@ -1209,7 +1221,20 @@ static int local_init(FsContext *ctx)
     }
     ctx->export_flags |= V9FS_PATHNAME_FSCONTEXT;
 
+    ctx->private = data;
     return 0;
+
+err:
+    g_free(data);
+    return -1;
+}
+
+static void local_cleanup(FsContext *ctx)
+{
+    LocalData *data = ctx->private;
+
+    close(data->mountfd);
+    g_free(data);
 }
 
 static int local_parse_opts(QemuOpts *opts, struct FsDriverEntry *fse)
@@ -1260,6 +1285,7 @@ static int local_parse_opts(QemuOpts *opts, struct FsDriverEntry *fse)
 FileOperations local_ops = {
     .parse_opts = local_parse_opts,
     .init  = local_init,
+    .cleanup = local_cleanup,
     .lstat = local_lstat,
     .readlink = local_readlink,
     .close = local_close,
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 09/31] 9pfs: local: open/opendir: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (7 preceding siblings ...)
  2017-02-27 22:59 ` [Qemu-devel] [PULL 08/31] 9pfs: local: keep a file descriptor on the shared folder Greg Kurz
@ 2017-02-27 22:59 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 10/31] 9pfs: local: lgetxattr: " Greg Kurz
                   ` (24 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 22:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_open() and local_opendir() callbacks are vulnerable to symlink
attacks because they call:

(1) open(O_NOFOLLOW) which follows symbolic links in all path elements but
    the rightmost one
(2) opendir() which follows symbolic links in all path elements

This patch converts both callbacks to use new helpers based on
openat_nofollow() to only open files and directories if they are
below the virtfs shared folder

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 37 +++++++++++++++++++++++++++----------
 hw/9pfs/9p-local.h | 20 ++++++++++++++++++++
 2 files changed, 47 insertions(+), 10 deletions(-)
 create mode 100644 hw/9pfs/9p-local.h

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index b58d0bc65439..af5f430e6c8e 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -13,6 +13,7 @@
 
 #include "qemu/osdep.h"
 #include "9p.h"
+#include "9p-local.h"
 #include "9p-xattr.h"
 #include "9p-util.h"
 #include "fsdev/qemu-fsdev.h"   /* local_ops */
@@ -48,6 +49,24 @@ typedef struct {
     int mountfd;
 } LocalData;
 
+int local_open_nofollow(FsContext *fs_ctx, const char *path, int flags,
+                        mode_t mode)
+{
+    LocalData *data = fs_ctx->private;
+
+    /* All paths are relative to the path data->mountfd points to */
+    while (*path == '/') {
+        path++;
+    }
+
+    return relative_openat_nofollow(data->mountfd, path, flags, mode);
+}
+
+int local_opendir_nofollow(FsContext *fs_ctx, const char *path)
+{
+    return local_open_nofollow(fs_ctx, path, O_DIRECTORY | O_RDONLY, 0);
+}
+
 #define VIRTFS_META_DIR ".virtfs_metadata"
 
 static char *local_mapped_attr_path(FsContext *ctx, const char *path)
@@ -359,13 +378,9 @@ static int local_closedir(FsContext *ctx, V9fsFidOpenState *fs)
 static int local_open(FsContext *ctx, V9fsPath *fs_path,
                       int flags, V9fsFidOpenState *fs)
 {
-    char *buffer;
-    char *path = fs_path->data;
     int fd;
 
-    buffer = rpath(ctx, path);
-    fd = open(buffer, flags | O_NOFOLLOW);
-    g_free(buffer);
+    fd = local_open_nofollow(ctx, fs_path->data, flags, 0);
     if (fd == -1) {
         return -1;
     }
@@ -376,13 +391,15 @@ static int local_open(FsContext *ctx, V9fsPath *fs_path,
 static int local_opendir(FsContext *ctx,
                          V9fsPath *fs_path, V9fsFidOpenState *fs)
 {
-    char *buffer;
-    char *path = fs_path->data;
+    int dirfd;
     DIR *stream;
 
-    buffer = rpath(ctx, path);
-    stream = opendir(buffer);
-    g_free(buffer);
+    dirfd = local_opendir_nofollow(ctx, fs_path->data);
+    if (dirfd == -1) {
+        return -1;
+    }
+
+    stream = fdopendir(dirfd);
     if (!stream) {
         return -1;
     }
diff --git a/hw/9pfs/9p-local.h b/hw/9pfs/9p-local.h
new file mode 100644
index 000000000000..32c72749d9df
--- /dev/null
+++ b/hw/9pfs/9p-local.h
@@ -0,0 +1,20 @@
+/*
+ * 9p local backend utilities
+ *
+ * Copyright IBM, Corp. 2017
+ *
+ * Authors:
+ *  Greg Kurz <groug@kaod.org>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef QEMU_9P_LOCAL_H
+#define QEMU_9P_LOCAL_H
+
+int local_open_nofollow(FsContext *fs_ctx, const char *path, int flags,
+                        mode_t mode);
+int local_opendir_nofollow(FsContext *fs_ctx, const char *path);
+
+#endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 10/31] 9pfs: local: lgetxattr: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (8 preceding siblings ...)
  2017-02-27 22:59 ` [Qemu-devel] [PULL 09/31] 9pfs: local: open/opendir: don't follow symlinks Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 11/31] 9pfs: local: llistxattr: " Greg Kurz
                   ` (23 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_lgetxattr() callback is vulnerable to symlink attacks because
it calls lgetxattr() which follows symbolic links in all path elements but
the rightmost one.

This patch introduces a helper to emulate the non-existing fgetxattrat()
function: it is implemented with /proc/self/fd which provides a trusted
path that can be safely passed to lgetxattr().

local_lgetxattr() is converted to use this helper and opendir_nofollow().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-posix-acl.c  | 16 ++--------------
 hw/9pfs/9p-util.c       | 12 ++++++++++++
 hw/9pfs/9p-util.h       |  2 ++
 hw/9pfs/9p-xattr-user.c |  8 +-------
 hw/9pfs/9p-xattr.c      | 31 ++++++++++++++++++++++++-------
 hw/9pfs/9p-xattr.h      |  2 ++
 6 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/hw/9pfs/9p-posix-acl.c b/hw/9pfs/9p-posix-acl.c
index ec003181cd33..9435e27a368c 100644
--- a/hw/9pfs/9p-posix-acl.c
+++ b/hw/9pfs/9p-posix-acl.c
@@ -25,13 +25,7 @@
 static ssize_t mp_pacl_getxattr(FsContext *ctx, const char *path,
                                 const char *name, void *value, size_t size)
 {
-    char *buffer;
-    ssize_t ret;
-
-    buffer = rpath(ctx, path);
-    ret = lgetxattr(buffer, MAP_ACL_ACCESS, value, size);
-    g_free(buffer);
-    return ret;
+    return local_getxattr_nofollow(ctx, path, MAP_ACL_ACCESS, value, size);
 }
 
 static ssize_t mp_pacl_listxattr(FsContext *ctx, const char *path,
@@ -89,13 +83,7 @@ static int mp_pacl_removexattr(FsContext *ctx,
 static ssize_t mp_dacl_getxattr(FsContext *ctx, const char *path,
                                 const char *name, void *value, size_t size)
 {
-    char *buffer;
-    ssize_t ret;
-
-    buffer = rpath(ctx, path);
-    ret = lgetxattr(buffer, MAP_ACL_DEFAULT, value, size);
-    g_free(buffer);
-    return ret;
+    return local_getxattr_nofollow(ctx, path, MAP_ACL_DEFAULT, value, size);
 }
 
 static ssize_t mp_dacl_listxattr(FsContext *ctx, const char *path,
diff --git a/hw/9pfs/9p-util.c b/hw/9pfs/9p-util.c
index 4329a638cded..845b89439de7 100644
--- a/hw/9pfs/9p-util.c
+++ b/hw/9pfs/9p-util.c
@@ -11,6 +11,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qemu/xattr.h"
 #include "9p-util.h"
 
 int relative_openat_nofollow(int dirfd, const char *path, int flags,
@@ -54,3 +55,14 @@ int relative_openat_nofollow(int dirfd, const char *path, int flags,
 
     return fd;
 }
+
+ssize_t fgetxattrat_nofollow(int dirfd, const char *filename, const char *name,
+                             void *value, size_t size)
+{
+    char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename);
+    int ret;
+
+    ret = lgetxattr(proc_path, name, value, size);
+    g_free(proc_path);
+    return ret;
+}
diff --git a/hw/9pfs/9p-util.h b/hw/9pfs/9p-util.h
index e3d5b66a15bc..806af82dcdbb 100644
--- a/hw/9pfs/9p-util.h
+++ b/hw/9pfs/9p-util.h
@@ -45,5 +45,7 @@ static inline int openat_file(int dirfd, const char *name, int flags,
 
 int relative_openat_nofollow(int dirfd, const char *path, int flags,
                              mode_t mode);
+ssize_t fgetxattrat_nofollow(int dirfd, const char *path, const char *name,
+                             void *value, size_t size);
 
 #endif
diff --git a/hw/9pfs/9p-xattr-user.c b/hw/9pfs/9p-xattr-user.c
index f87530c8b526..4071fbc4c086 100644
--- a/hw/9pfs/9p-xattr-user.c
+++ b/hw/9pfs/9p-xattr-user.c
@@ -20,9 +20,6 @@
 static ssize_t mp_user_getxattr(FsContext *ctx, const char *path,
                                 const char *name, void *value, size_t size)
 {
-    char *buffer;
-    ssize_t ret;
-
     if (strncmp(name, "user.virtfs.", 12) == 0) {
         /*
          * Don't allow fetch of user.virtfs namesapce
@@ -31,10 +28,7 @@ static ssize_t mp_user_getxattr(FsContext *ctx, const char *path,
         errno = ENOATTR;
         return -1;
     }
-    buffer = rpath(ctx, path);
-    ret = lgetxattr(buffer, name, value, size);
-    g_free(buffer);
-    return ret;
+    return local_getxattr_nofollow(ctx, path, name, value, size);
 }
 
 static ssize_t mp_user_listxattr(FsContext *ctx, const char *path,
diff --git a/hw/9pfs/9p-xattr.c b/hw/9pfs/9p-xattr.c
index 19a2daf02f5c..aa4391e6b317 100644
--- a/hw/9pfs/9p-xattr.c
+++ b/hw/9pfs/9p-xattr.c
@@ -15,6 +15,8 @@
 #include "9p.h"
 #include "fsdev/file-op-9p.h"
 #include "9p-xattr.h"
+#include "9p-util.h"
+#include "9p-local.h"
 
 
 static XattrOperations *get_xattr_operations(XattrOperations **h,
@@ -143,18 +145,33 @@ int v9fs_remove_xattr(FsContext *ctx,
 
 }
 
-ssize_t pt_getxattr(FsContext *ctx, const char *path, const char *name,
-                    void *value, size_t size)
+ssize_t local_getxattr_nofollow(FsContext *ctx, const char *path,
+                                const char *name, void *value, size_t size)
 {
-    char *buffer;
-    ssize_t ret;
+    char *dirpath = g_path_get_dirname(path);
+    char *filename = g_path_get_basename(path);
+    int dirfd;
+    ssize_t ret = -1;
+
+    dirfd = local_opendir_nofollow(ctx, dirpath);
+    if (dirfd == -1) {
+        goto out;
+    }
 
-    buffer = rpath(ctx, path);
-    ret = lgetxattr(buffer, name, value, size);
-    g_free(buffer);
+    ret = fgetxattrat_nofollow(dirfd, filename, name, value, size);
+    close_preserve_errno(dirfd);
+out:
+    g_free(dirpath);
+    g_free(filename);
     return ret;
 }
 
+ssize_t pt_getxattr(FsContext *ctx, const char *path, const char *name,
+                    void *value, size_t size)
+{
+    return local_getxattr_nofollow(ctx, path, name, value, size);
+}
+
 int pt_setxattr(FsContext *ctx, const char *path, const char *name, void *value,
                 size_t size, int flags)
 {
diff --git a/hw/9pfs/9p-xattr.h b/hw/9pfs/9p-xattr.h
index 3f43f5153f3c..69a8b6b62e3c 100644
--- a/hw/9pfs/9p-xattr.h
+++ b/hw/9pfs/9p-xattr.h
@@ -29,6 +29,8 @@ typedef struct xattr_operations
                        const char *path, const char *name);
 } XattrOperations;
 
+ssize_t local_getxattr_nofollow(FsContext *ctx, const char *path,
+                                const char *name, void *value, size_t size);
 
 extern XattrOperations mapped_user_xattr;
 extern XattrOperations passthrough_user_xattr;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 11/31] 9pfs: local: llistxattr: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (9 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 10/31] 9pfs: local: lgetxattr: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 12/31] 9pfs: local: lsetxattr: " Greg Kurz
                   ` (22 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_llistxattr() callback is vulnerable to symlink attacks because
it calls llistxattr() which follows symbolic links in all path elements but
the rightmost one.

This patch introduces a helper to emulate the non-existing flistxattrat()
function: it is implemented with /proc/self/fd which provides a trusted
path that can be safely passed to llistxattr().

local_llistxattr() is converted to use this helper and opendir_nofollow().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-xattr.c | 35 +++++++++++++++++++++++++++++------
 1 file changed, 29 insertions(+), 6 deletions(-)

diff --git a/hw/9pfs/9p-xattr.c b/hw/9pfs/9p-xattr.c
index aa4391e6b317..54193c630c9d 100644
--- a/hw/9pfs/9p-xattr.c
+++ b/hw/9pfs/9p-xattr.c
@@ -60,6 +60,16 @@ ssize_t pt_listxattr(FsContext *ctx, const char *path,
     return name_size;
 }
 
+static ssize_t flistxattrat_nofollow(int dirfd, const char *filename,
+                                     char *list, size_t size)
+{
+    char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename);
+    int ret;
+
+    ret = llistxattr(proc_path, list, size);
+    g_free(proc_path);
+    return ret;
+}
 
 /*
  * Get the list and pass to each layer to find out whether
@@ -69,24 +79,37 @@ ssize_t v9fs_list_xattr(FsContext *ctx, const char *path,
                         void *value, size_t vsize)
 {
     ssize_t size = 0;
-    char *buffer;
     void *ovalue = value;
     XattrOperations *xops;
     char *orig_value, *orig_value_start;
     ssize_t xattr_len, parsed_len = 0, attr_len;
+    char *dirpath, *name;
+    int dirfd;
 
     /* Get the actual len */
-    buffer = rpath(ctx, path);
-    xattr_len = llistxattr(buffer, value, 0);
+    dirpath = g_path_get_dirname(path);
+    dirfd = local_opendir_nofollow(ctx, dirpath);
+    g_free(dirpath);
+    if (dirfd == -1) {
+        return -1;
+    }
+
+    name = g_path_get_basename(path);
+    xattr_len = flistxattrat_nofollow(dirfd, name, value, 0);
     if (xattr_len <= 0) {
-        g_free(buffer);
+        g_free(name);
+        close_preserve_errno(dirfd);
         return xattr_len;
     }
 
     /* Now fetch the xattr and find the actual size */
     orig_value = g_malloc(xattr_len);
-    xattr_len = llistxattr(buffer, orig_value, xattr_len);
-    g_free(buffer);
+    xattr_len = flistxattrat_nofollow(dirfd, name, orig_value, xattr_len);
+    g_free(name);
+    close_preserve_errno(dirfd);
+    if (xattr_len < 0) {
+        return -1;
+    }
 
     /* store the orig pointer */
     orig_value_start = orig_value;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 12/31] 9pfs: local: lsetxattr: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (10 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 11/31] 9pfs: local: llistxattr: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 13/31] 9pfs: local: lremovexattr: " Greg Kurz
                   ` (21 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_lsetxattr() callback is vulnerable to symlink attacks because
it calls lsetxattr() which follows symbolic links in all path elements but
the rightmost one.

This patch introduces a helper to emulate the non-existing fsetxattrat()
function: it is implemented with /proc/self/fd which provides a trusted
path that can be safely passed to lsetxattr().

local_lsetxattr() is converted to use this helper and opendir_nofollow().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-posix-acl.c  | 18 ++++--------------
 hw/9pfs/9p-util.h       |  2 ++
 hw/9pfs/9p-xattr-user.c |  8 +-------
 hw/9pfs/9p-xattr.c      | 39 +++++++++++++++++++++++++++++++++------
 hw/9pfs/9p-xattr.h      |  3 +++
 5 files changed, 43 insertions(+), 27 deletions(-)

diff --git a/hw/9pfs/9p-posix-acl.c b/hw/9pfs/9p-posix-acl.c
index 9435e27a368c..0154e2a7605f 100644
--- a/hw/9pfs/9p-posix-acl.c
+++ b/hw/9pfs/9p-posix-acl.c
@@ -50,13 +50,8 @@ static ssize_t mp_pacl_listxattr(FsContext *ctx, const char *path,
 static int mp_pacl_setxattr(FsContext *ctx, const char *path, const char *name,
                             void *value, size_t size, int flags)
 {
-    char *buffer;
-    int ret;
-
-    buffer = rpath(ctx, path);
-    ret = lsetxattr(buffer, MAP_ACL_ACCESS, value, size, flags);
-    g_free(buffer);
-    return ret;
+    return local_setxattr_nofollow(ctx, path, MAP_ACL_ACCESS, value, size,
+                                   flags);
 }
 
 static int mp_pacl_removexattr(FsContext *ctx,
@@ -108,13 +103,8 @@ static ssize_t mp_dacl_listxattr(FsContext *ctx, const char *path,
 static int mp_dacl_setxattr(FsContext *ctx, const char *path, const char *name,
                             void *value, size_t size, int flags)
 {
-    char *buffer;
-    int ret;
-
-    buffer = rpath(ctx, path);
-    ret = lsetxattr(buffer, MAP_ACL_DEFAULT, value, size, flags);
-    g_free(buffer);
-    return ret;
+    return local_setxattr_nofollow(ctx, path, MAP_ACL_DEFAULT, value, size,
+                                   flags);
 }
 
 static int mp_dacl_removexattr(FsContext *ctx,
diff --git a/hw/9pfs/9p-util.h b/hw/9pfs/9p-util.h
index 806af82dcdbb..aea07a428958 100644
--- a/hw/9pfs/9p-util.h
+++ b/hw/9pfs/9p-util.h
@@ -47,5 +47,7 @@ int relative_openat_nofollow(int dirfd, const char *path, int flags,
                              mode_t mode);
 ssize_t fgetxattrat_nofollow(int dirfd, const char *path, const char *name,
                              void *value, size_t size);
+int fsetxattrat_nofollow(int dirfd, const char *path, const char *name,
+                         void *value, size_t size, int flags);
 
 #endif
diff --git a/hw/9pfs/9p-xattr-user.c b/hw/9pfs/9p-xattr-user.c
index 4071fbc4c086..1840a5db66f3 100644
--- a/hw/9pfs/9p-xattr-user.c
+++ b/hw/9pfs/9p-xattr-user.c
@@ -67,9 +67,6 @@ static ssize_t mp_user_listxattr(FsContext *ctx, const char *path,
 static int mp_user_setxattr(FsContext *ctx, const char *path, const char *name,
                             void *value, size_t size, int flags)
 {
-    char *buffer;
-    int ret;
-
     if (strncmp(name, "user.virtfs.", 12) == 0) {
         /*
          * Don't allow fetch of user.virtfs namesapce
@@ -78,10 +75,7 @@ static int mp_user_setxattr(FsContext *ctx, const char *path, const char *name,
         errno = EACCES;
         return -1;
     }
-    buffer = rpath(ctx, path);
-    ret = lsetxattr(buffer, name, value, size, flags);
-    g_free(buffer);
-    return ret;
+    return local_setxattr_nofollow(ctx, path, name, value, size, flags);
 }
 
 static int mp_user_removexattr(FsContext *ctx,
diff --git a/hw/9pfs/9p-xattr.c b/hw/9pfs/9p-xattr.c
index 54193c630c9d..a0167dd4d898 100644
--- a/hw/9pfs/9p-xattr.c
+++ b/hw/9pfs/9p-xattr.c
@@ -195,18 +195,45 @@ ssize_t pt_getxattr(FsContext *ctx, const char *path, const char *name,
     return local_getxattr_nofollow(ctx, path, name, value, size);
 }
 
-int pt_setxattr(FsContext *ctx, const char *path, const char *name, void *value,
-                size_t size, int flags)
+int fsetxattrat_nofollow(int dirfd, const char *filename, const char *name,
+                         void *value, size_t size, int flags)
 {
-    char *buffer;
+    char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename);
     int ret;
 
-    buffer = rpath(ctx, path);
-    ret = lsetxattr(buffer, name, value, size, flags);
-    g_free(buffer);
+    ret = lsetxattr(proc_path, name, value, size, flags);
+    g_free(proc_path);
+    return ret;
+}
+
+ssize_t local_setxattr_nofollow(FsContext *ctx, const char *path,
+                                const char *name, void *value, size_t size,
+                                int flags)
+{
+    char *dirpath = g_path_get_dirname(path);
+    char *filename = g_path_get_basename(path);
+    int dirfd;
+    ssize_t ret = -1;
+
+    dirfd = local_opendir_nofollow(ctx, dirpath);
+    if (dirfd == -1) {
+        goto out;
+    }
+
+    ret = fsetxattrat_nofollow(dirfd, filename, name, value, size, flags);
+    close_preserve_errno(dirfd);
+out:
+    g_free(dirpath);
+    g_free(filename);
     return ret;
 }
 
+int pt_setxattr(FsContext *ctx, const char *path, const char *name, void *value,
+                size_t size, int flags)
+{
+    return local_setxattr_nofollow(ctx, path, name, value, size, flags);
+}
+
 int pt_removexattr(FsContext *ctx, const char *path, const char *name)
 {
     char *buffer;
diff --git a/hw/9pfs/9p-xattr.h b/hw/9pfs/9p-xattr.h
index 69a8b6b62e3c..7558970d8511 100644
--- a/hw/9pfs/9p-xattr.h
+++ b/hw/9pfs/9p-xattr.h
@@ -31,6 +31,9 @@ typedef struct xattr_operations
 
 ssize_t local_getxattr_nofollow(FsContext *ctx, const char *path,
                                 const char *name, void *value, size_t size);
+ssize_t local_setxattr_nofollow(FsContext *ctx, const char *path,
+                                const char *name, void *value, size_t size,
+                                int flags);
 
 extern XattrOperations mapped_user_xattr;
 extern XattrOperations passthrough_user_xattr;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 13/31] 9pfs: local: lremovexattr: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (11 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 12/31] 9pfs: local: lsetxattr: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 14/31] 9pfs: local: unlinkat: " Greg Kurz
                   ` (20 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_lremovexattr() callback is vulnerable to symlink attacks because
it calls lremovexattr() which follows symbolic links in all path elements
but the rightmost one.

This patch introduces a helper to emulate the non-existing fremovexattrat()
function: it is implemented with /proc/self/fd which provides a trusted
path that can be safely passed to lremovexattr().

local_lremovexattr() is converted to use this helper and opendir_nofollow().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-posix-acl.c  | 10 ++--------
 hw/9pfs/9p-xattr-user.c |  8 +-------
 hw/9pfs/9p-xattr.c      | 36 +++++++++++++++++++++++++++++++-----
 hw/9pfs/9p-xattr.h      |  2 ++
 4 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/hw/9pfs/9p-posix-acl.c b/hw/9pfs/9p-posix-acl.c
index 0154e2a7605f..bbf89064f7ae 100644
--- a/hw/9pfs/9p-posix-acl.c
+++ b/hw/9pfs/9p-posix-acl.c
@@ -58,10 +58,8 @@ static int mp_pacl_removexattr(FsContext *ctx,
                                const char *path, const char *name)
 {
     int ret;
-    char *buffer;
 
-    buffer = rpath(ctx, path);
-    ret  = lremovexattr(buffer, MAP_ACL_ACCESS);
+    ret = local_removexattr_nofollow(ctx, path, MAP_ACL_ACCESS);
     if (ret == -1 && errno == ENODATA) {
         /*
          * We don't get ENODATA error when trying to remove a
@@ -71,7 +69,6 @@ static int mp_pacl_removexattr(FsContext *ctx,
         errno = 0;
         ret = 0;
     }
-    g_free(buffer);
     return ret;
 }
 
@@ -111,10 +108,8 @@ static int mp_dacl_removexattr(FsContext *ctx,
                                const char *path, const char *name)
 {
     int ret;
-    char *buffer;
 
-    buffer = rpath(ctx, path);
-    ret  = lremovexattr(buffer, MAP_ACL_DEFAULT);
+    ret = local_removexattr_nofollow(ctx, path, MAP_ACL_DEFAULT);
     if (ret == -1 && errno == ENODATA) {
         /*
          * We don't get ENODATA error when trying to remove a
@@ -124,7 +119,6 @@ static int mp_dacl_removexattr(FsContext *ctx,
         errno = 0;
         ret = 0;
     }
-    g_free(buffer);
     return ret;
 }
 
diff --git a/hw/9pfs/9p-xattr-user.c b/hw/9pfs/9p-xattr-user.c
index 1840a5db66f3..2c90817b75a6 100644
--- a/hw/9pfs/9p-xattr-user.c
+++ b/hw/9pfs/9p-xattr-user.c
@@ -81,9 +81,6 @@ static int mp_user_setxattr(FsContext *ctx, const char *path, const char *name,
 static int mp_user_removexattr(FsContext *ctx,
                                const char *path, const char *name)
 {
-    char *buffer;
-    int ret;
-
     if (strncmp(name, "user.virtfs.", 12) == 0) {
         /*
          * Don't allow fetch of user.virtfs namesapce
@@ -92,10 +89,7 @@ static int mp_user_removexattr(FsContext *ctx,
         errno = EACCES;
         return -1;
     }
-    buffer = rpath(ctx, path);
-    ret = lremovexattr(buffer, name);
-    g_free(buffer);
-    return ret;
+    return local_removexattr_nofollow(ctx, path, name);
 }
 
 XattrOperations mapped_user_xattr = {
diff --git a/hw/9pfs/9p-xattr.c b/hw/9pfs/9p-xattr.c
index a0167dd4d898..eec160b3c2ac 100644
--- a/hw/9pfs/9p-xattr.c
+++ b/hw/9pfs/9p-xattr.c
@@ -234,17 +234,43 @@ int pt_setxattr(FsContext *ctx, const char *path, const char *name, void *value,
     return local_setxattr_nofollow(ctx, path, name, value, size, flags);
 }
 
-int pt_removexattr(FsContext *ctx, const char *path, const char *name)
+static ssize_t fremovexattrat_nofollow(int dirfd, const char *filename,
+                                       const char *name)
 {
-    char *buffer;
+    char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename);
     int ret;
 
-    buffer = rpath(ctx, path);
-    ret = lremovexattr(path, name);
-    g_free(buffer);
+    ret = lremovexattr(proc_path, name);
+    g_free(proc_path);
     return ret;
 }
 
+ssize_t local_removexattr_nofollow(FsContext *ctx, const char *path,
+                                   const char *name)
+{
+    char *dirpath = g_path_get_dirname(path);
+    char *filename = g_path_get_basename(path);
+    int dirfd;
+    ssize_t ret = -1;
+
+    dirfd = local_opendir_nofollow(ctx, dirpath);
+    if (dirfd == -1) {
+        goto out;
+    }
+
+    ret = fremovexattrat_nofollow(dirfd, filename, name);
+    close_preserve_errno(dirfd);
+out:
+    g_free(dirpath);
+    g_free(filename);
+    return ret;
+}
+
+int pt_removexattr(FsContext *ctx, const char *path, const char *name)
+{
+    return local_removexattr_nofollow(ctx, path, name);
+}
+
 ssize_t notsup_getxattr(FsContext *ctx, const char *path, const char *name,
                         void *value, size_t size)
 {
diff --git a/hw/9pfs/9p-xattr.h b/hw/9pfs/9p-xattr.h
index 7558970d8511..0d83996575e1 100644
--- a/hw/9pfs/9p-xattr.h
+++ b/hw/9pfs/9p-xattr.h
@@ -34,6 +34,8 @@ ssize_t local_getxattr_nofollow(FsContext *ctx, const char *path,
 ssize_t local_setxattr_nofollow(FsContext *ctx, const char *path,
                                 const char *name, void *value, size_t size,
                                 int flags);
+ssize_t local_removexattr_nofollow(FsContext *ctx, const char *path,
+                                   const char *name);
 
 extern XattrOperations mapped_user_xattr;
 extern XattrOperations passthrough_user_xattr;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 14/31] 9pfs: local: unlinkat: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (12 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 13/31] 9pfs: local: lremovexattr: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 15/31] 9pfs: local: remove: " Greg Kurz
                   ` (19 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_unlinkat() callback is vulnerable to symlink attacks because it
calls remove() which follows symbolic links in all path elements but the
rightmost one.

This patch converts local_unlinkat() to rely on opendir_nofollow() and
unlinkat() instead.

Most of the code is moved to a separate local_unlinkat_common() helper
which will be reused in a subsequent patch to fix the same issue in
local_remove().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 99 ++++++++++++++++++++++++++++++------------------------
 1 file changed, 56 insertions(+), 43 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index af5f430e6c8e..2e36bc2c254a 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -969,6 +969,56 @@ static int local_utimensat(FsContext *s, V9fsPath *fs_path,
     return ret;
 }
 
+static int local_unlinkat_common(FsContext *ctx, int dirfd, const char *name,
+                                 int flags)
+{
+    int ret = -1;
+
+    if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
+        int map_dirfd;
+
+        if (flags == AT_REMOVEDIR) {
+            int fd;
+
+            fd = openat(dirfd, name, O_RDONLY | O_DIRECTORY | O_PATH);
+            if (fd == -1) {
+                goto err_out;
+            }
+            /*
+             * If directory remove .virtfs_metadata contained in the
+             * directory
+             */
+            ret = unlinkat(fd, VIRTFS_META_DIR, AT_REMOVEDIR);
+            close_preserve_errno(fd);
+            if (ret < 0 && errno != ENOENT) {
+                /*
+                 * We didn't had the .virtfs_metadata file. May be file created
+                 * in non-mapped mode ?. Ignore ENOENT.
+                 */
+                goto err_out;
+            }
+        }
+        /*
+         * Now remove the name from parent directory
+         * .virtfs_metadata directory.
+         */
+        map_dirfd = openat_dir(dirfd, VIRTFS_META_DIR);
+        ret = unlinkat(map_dirfd, name, 0);
+        close_preserve_errno(map_dirfd);
+        if (ret < 0 && errno != ENOENT) {
+            /*
+             * We didn't had the .virtfs_metadata file. May be file created
+             * in non-mapped mode ?. Ignore ENOENT.
+             */
+            goto err_out;
+        }
+    }
+
+    ret = unlinkat(dirfd, name, flags);
+err_out:
+    return ret;
+}
+
 static int local_remove(FsContext *ctx, const char *path)
 {
     int err;
@@ -1118,52 +1168,15 @@ static int local_unlinkat(FsContext *ctx, V9fsPath *dir,
                           const char *name, int flags)
 {
     int ret;
-    V9fsString fullname;
-    char *buffer;
-
-    v9fs_string_init(&fullname);
+    int dirfd;
 
-    v9fs_string_sprintf(&fullname, "%s/%s", dir->data, name);
-    if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
-        if (flags == AT_REMOVEDIR) {
-            /*
-             * If directory remove .virtfs_metadata contained in the
-             * directory
-             */
-            buffer = g_strdup_printf("%s/%s/%s", ctx->fs_root,
-                                     fullname.data, VIRTFS_META_DIR);
-            ret = remove(buffer);
-            g_free(buffer);
-            if (ret < 0 && errno != ENOENT) {
-                /*
-                 * We didn't had the .virtfs_metadata file. May be file created
-                 * in non-mapped mode ?. Ignore ENOENT.
-                 */
-                goto err_out;
-            }
-        }
-        /*
-         * Now remove the name from parent directory
-         * .virtfs_metadata directory.
-         */
-        buffer = local_mapped_attr_path(ctx, fullname.data);
-        ret = remove(buffer);
-        g_free(buffer);
-        if (ret < 0 && errno != ENOENT) {
-            /*
-             * We didn't had the .virtfs_metadata file. May be file created
-             * in non-mapped mode ?. Ignore ENOENT.
-             */
-            goto err_out;
-        }
+    dirfd = local_opendir_nofollow(ctx, dir->data);
+    if (dirfd == -1) {
+        return -1;
     }
-    /* Remove the name finally */
-    buffer = rpath(ctx, fullname.data);
-    ret = remove(buffer);
-    g_free(buffer);
 
-err_out:
-    v9fs_string_free(&fullname);
+    ret = local_unlinkat_common(ctx, dirfd, name, flags);
+    close_preserve_errno(dirfd);
     return ret;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 15/31] 9pfs: local: remove: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (13 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 14/31] 9pfs: local: unlinkat: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 16/31] 9pfs: local: utimensat: " Greg Kurz
                   ` (18 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_remove() callback is vulnerable to symlink attacks because it
calls:

(1) lstat() which follows symbolic links in all path elements but the
    rightmost one
(2) remove() which follows symbolic links in all path elements but the
    rightmost one

This patch converts local_remove() to rely on opendir_nofollow(),
fstatat(AT_SYMLINK_NOFOLLOW) to fix (1) and unlinkat() to fix (2).

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 64 ++++++++++++++++++------------------------------------
 1 file changed, 21 insertions(+), 43 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 2e36bc2c254a..53a2fd50edbb 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -1021,54 +1021,32 @@ err_out:
 
 static int local_remove(FsContext *ctx, const char *path)
 {
-    int err;
     struct stat stbuf;
-    char *buffer;
+    char *dirpath = g_path_get_dirname(path);
+    char *name = g_path_get_basename(path);
+    int flags = 0;
+    int dirfd;
+    int err = -1;
 
-    if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
-        buffer = rpath(ctx, path);
-        err =  lstat(buffer, &stbuf);
-        g_free(buffer);
-        if (err) {
-            goto err_out;
-        }
-        /*
-         * If directory remove .virtfs_metadata contained in the
-         * directory
-         */
-        if (S_ISDIR(stbuf.st_mode)) {
-            buffer = g_strdup_printf("%s/%s/%s", ctx->fs_root,
-                                     path, VIRTFS_META_DIR);
-            err = remove(buffer);
-            g_free(buffer);
-            if (err < 0 && errno != ENOENT) {
-                /*
-                 * We didn't had the .virtfs_metadata file. May be file created
-                 * in non-mapped mode ?. Ignore ENOENT.
-                 */
-                goto err_out;
-            }
-        }
-        /*
-         * Now remove the name from parent directory
-         * .virtfs_metadata directory
-         */
-        buffer = local_mapped_attr_path(ctx, path);
-        err = remove(buffer);
-        g_free(buffer);
-        if (err < 0 && errno != ENOENT) {
-            /*
-             * We didn't had the .virtfs_metadata file. May be file created
-             * in non-mapped mode ?. Ignore ENOENT.
-             */
-            goto err_out;
-        }
+    dirfd = local_opendir_nofollow(ctx, dirpath);
+    if (dirfd) {
+        goto out;
     }
 
-    buffer = rpath(ctx, path);
-    err = remove(buffer);
-    g_free(buffer);
+    if (fstatat(dirfd, path, &stbuf, AT_SYMLINK_NOFOLLOW) < 0) {
+        goto err_out;
+    }
+
+    if (S_ISDIR(stbuf.st_mode)) {
+        flags |= AT_REMOVEDIR;
+    }
+
+    err = local_unlinkat_common(ctx, dirfd, name, flags);
 err_out:
+    close_preserve_errno(dirfd);
+out:
+    g_free(name);
+    g_free(dirpath);
     return err;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 16/31] 9pfs: local: utimensat: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (14 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 15/31] 9pfs: local: remove: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 17/31] 9pfs: local: statfs: " Greg Kurz
                   ` (17 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_utimensat() callback is vulnerable to symlink attacks because it
calls qemu_utimens()->utimensat(AT_SYMLINK_NOFOLLOW) which follows symbolic
links in all path elements but the rightmost one or qemu_utimens()->utimes()
which follows symbolic links for all path elements.

This patch converts local_utimensat() to rely on opendir_nofollow() and
utimensat(AT_SYMLINK_NOFOLLOW) directly instead of using qemu_utimens().
It is hence assumed that the OS supports utimensat(), i.e. has glibc 2.6
or higher and linux 2.6.22 or higher, which seems reasonable nowadays.

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 53a2fd50edbb..bab095353da7 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -959,13 +959,20 @@ static int local_chown(FsContext *fs_ctx, V9fsPath *fs_path, FsCred *credp)
 static int local_utimensat(FsContext *s, V9fsPath *fs_path,
                            const struct timespec *buf)
 {
-    char *buffer;
-    int ret;
-    char *path = fs_path->data;
+    char *dirpath = g_path_get_dirname(fs_path->data);
+    char *name = g_path_get_basename(fs_path->data);
+    int dirfd, ret = -1;
 
-    buffer = rpath(s, path);
-    ret = qemu_utimens(buffer, buf);
-    g_free(buffer);
+    dirfd = local_opendir_nofollow(s, dirpath);
+    if (dirfd == -1) {
+        goto out;
+    }
+
+    ret = utimensat(dirfd, name, buf, AT_SYMLINK_NOFOLLOW);
+    close_preserve_errno(dirfd);
+out:
+    g_free(dirpath);
+    g_free(name);
     return ret;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 17/31] 9pfs: local: statfs: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (15 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 16/31] 9pfs: local: utimensat: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 18/31] 9pfs: local: truncate: " Greg Kurz
                   ` (16 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_statfs() callback is vulnerable to symlink attacks because it
calls statfs() which follows symbolic links in all path elements.

This patch converts local_statfs() to rely on open_nofollow() and fstatfs()
instead.

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index bab095353da7..ae5d26821791 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -1077,13 +1077,11 @@ static int local_fsync(FsContext *ctx, int fid_type,
 
 static int local_statfs(FsContext *s, V9fsPath *fs_path, struct statfs *stbuf)
 {
-    char *buffer;
-    int ret;
-    char *path = fs_path->data;
+    int fd, ret;
 
-    buffer = rpath(s, path);
-    ret = statfs(buffer, stbuf);
-    g_free(buffer);
+    fd = local_open_nofollow(s, fs_path->data, O_RDONLY, 0);
+    ret = fstatfs(fd, stbuf);
+    close_preserve_errno(fd);
     return ret;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 18/31] 9pfs: local: truncate: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (16 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 17/31] 9pfs: local: statfs: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 19/31] 9pfs: local: readlink: " Greg Kurz
                   ` (15 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_truncate() callback is vulnerable to symlink attacks because
it calls truncate() which follows symbolic links in all path elements.

This patch converts local_truncate() to rely on open_nofollow() and
ftruncate() instead.

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index ae5d26821791..c6c114839287 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -894,13 +894,14 @@ err_out:
 
 static int local_truncate(FsContext *ctx, V9fsPath *fs_path, off_t size)
 {
-    char *buffer;
-    int ret;
-    char *path = fs_path->data;
+    int fd, ret;
 
-    buffer = rpath(ctx, path);
-    ret = truncate(buffer, size);
-    g_free(buffer);
+    fd = local_open_nofollow(ctx, fs_path->data, O_WRONLY, 0);
+    if (fd == -1) {
+        return -1;
+    }
+    ret = ftruncate(fd, size);
+    close_preserve_errno(fd);
     return ret;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 19/31] 9pfs: local: readlink: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (17 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 18/31] 9pfs: local: truncate: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 20/31] 9pfs: local: lstat: " Greg Kurz
                   ` (14 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_readlink() callback is vulnerable to symlink attacks because it
calls:

(1) open(O_NOFOLLOW) which follows symbolic links for all path elements but
    the rightmost one
(2) readlink() which follows symbolic links for all path elements but the
    rightmost one

This patch converts local_readlink() to rely on open_nofollow() to fix (1)
and opendir_nofollow(), readlinkat() to fix (2).

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index c6c114839287..add1b2e83dbe 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -340,27 +340,35 @@ static ssize_t local_readlink(FsContext *fs_ctx, V9fsPath *fs_path,
                               char *buf, size_t bufsz)
 {
     ssize_t tsize = -1;
-    char *buffer;
-    char *path = fs_path->data;
 
     if ((fs_ctx->export_flags & V9FS_SM_MAPPED) ||
         (fs_ctx->export_flags & V9FS_SM_MAPPED_FILE)) {
         int fd;
-        buffer = rpath(fs_ctx, path);
-        fd = open(buffer, O_RDONLY | O_NOFOLLOW);
-        g_free(buffer);
+
+        fd = local_open_nofollow(fs_ctx, fs_path->data, O_RDONLY, 0);
         if (fd == -1) {
             return -1;
         }
         do {
             tsize = read(fd, (void *)buf, bufsz);
         } while (tsize == -1 && errno == EINTR);
-        close(fd);
+        close_preserve_errno(fd);
     } else if ((fs_ctx->export_flags & V9FS_SM_PASSTHROUGH) ||
                (fs_ctx->export_flags & V9FS_SM_NONE)) {
-        buffer = rpath(fs_ctx, path);
-        tsize = readlink(buffer, buf, bufsz);
-        g_free(buffer);
+        char *dirpath = g_path_get_dirname(fs_path->data);
+        char *name = g_path_get_basename(fs_path->data);
+        int dirfd;
+
+        dirfd = local_opendir_nofollow(fs_ctx, dirpath);
+        if (dirfd == -1) {
+            goto out;
+        }
+
+        tsize = readlinkat(dirfd, name, buf, bufsz);
+        close_preserve_errno(dirfd);
+    out:
+        g_free(name);
+        g_free(dirpath);
     }
     return tsize;
 }
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 20/31] 9pfs: local: lstat: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (18 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 19/31] 9pfs: local: readlink: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 21/31] 9pfs: local: renameat: " Greg Kurz
                   ` (13 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_lstat() callback is vulnerable to symlink attacks because it
calls:

(1) lstat() which follows symbolic links in all path elements but the
    rightmost one
(2) getxattr() which follows symbolic links in all path elements
(3) local_mapped_file_attr()->local_fopen()->openat(O_NOFOLLOW) which
    follows symbolic links in all path elements but the rightmost
    one

This patch converts local_lstat() to rely on opendir_nofollow() and
fstatat(AT_SYMLINK_NOFOLLOW) to fix (1), fgetxattrat_nofollow() to
fix (2).

A new local_fopenat() helper is introduced as a replacement to
local_fopen() to fix (3). No effort is made to factor out code
because local_fopen() will be dropped when all users have been
converted to call local_fopenat().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 78 ++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 61 insertions(+), 17 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index add1b2e83dbe..ee3c1bd0a2be 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -111,17 +111,49 @@ static FILE *local_fopen(const char *path, const char *mode)
     return fp;
 }
 
+static FILE *local_fopenat(int dirfd, const char *name, const char *mode)
+{
+    int fd, o_mode = 0;
+    FILE *fp;
+    int flags;
+    /*
+     * only supports two modes
+     */
+    if (mode[0] == 'r') {
+        flags = O_RDONLY;
+    } else if (mode[0] == 'w') {
+        flags = O_WRONLY | O_TRUNC | O_CREAT;
+        o_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+    } else {
+        return NULL;
+    }
+    fd = openat_file(dirfd, name, flags, o_mode);
+    if (fd == -1) {
+        return NULL;
+    }
+    fp = fdopen(fd, mode);
+    if (!fp) {
+        close(fd);
+    }
+    return fp;
+}
+
 #define ATTR_MAX 100
-static void local_mapped_file_attr(FsContext *ctx, const char *path,
+static void local_mapped_file_attr(int dirfd, const char *name,
                                    struct stat *stbuf)
 {
     FILE *fp;
     char buf[ATTR_MAX];
-    char *attr_path;
+    int map_dirfd;
 
-    attr_path = local_mapped_attr_path(ctx, path);
-    fp = local_fopen(attr_path, "r");
-    g_free(attr_path);
+    map_dirfd = openat(dirfd, VIRTFS_META_DIR,
+                       O_RDONLY | O_DIRECTORY | O_NOFOLLOW);
+    if (map_dirfd == -1) {
+        return;
+    }
+
+    fp = local_fopenat(map_dirfd, name, "r");
+    close_preserve_errno(map_dirfd);
     if (!fp) {
         return;
     }
@@ -143,12 +175,17 @@ static void local_mapped_file_attr(FsContext *ctx, const char *path,
 
 static int local_lstat(FsContext *fs_ctx, V9fsPath *fs_path, struct stat *stbuf)
 {
-    int err;
-    char *buffer;
-    char *path = fs_path->data;
+    int err = -1;
+    char *dirpath = g_path_get_dirname(fs_path->data);
+    char *name = g_path_get_basename(fs_path->data);
+    int dirfd;
 
-    buffer = rpath(fs_ctx, path);
-    err =  lstat(buffer, stbuf);
+    dirfd = local_opendir_nofollow(fs_ctx, dirpath);
+    if (dirfd == -1) {
+        goto out;
+    }
+
+    err = fstatat(dirfd, name, stbuf, AT_SYMLINK_NOFOLLOW);
     if (err) {
         goto err_out;
     }
@@ -158,25 +195,32 @@ static int local_lstat(FsContext *fs_ctx, V9fsPath *fs_path, struct stat *stbuf)
         gid_t tmp_gid;
         mode_t tmp_mode;
         dev_t tmp_dev;
-        if (getxattr(buffer, "user.virtfs.uid", &tmp_uid, sizeof(uid_t)) > 0) {
+
+        if (fgetxattrat_nofollow(dirfd, name, "user.virtfs.uid", &tmp_uid,
+                                 sizeof(uid_t)) > 0) {
             stbuf->st_uid = le32_to_cpu(tmp_uid);
         }
-        if (getxattr(buffer, "user.virtfs.gid", &tmp_gid, sizeof(gid_t)) > 0) {
+        if (fgetxattrat_nofollow(dirfd, name, "user.virtfs.gid", &tmp_gid,
+                                 sizeof(gid_t)) > 0) {
             stbuf->st_gid = le32_to_cpu(tmp_gid);
         }
-        if (getxattr(buffer, "user.virtfs.mode",
-                    &tmp_mode, sizeof(mode_t)) > 0) {
+        if (fgetxattrat_nofollow(dirfd, name, "user.virtfs.mode", &tmp_mode,
+                                 sizeof(mode_t)) > 0) {
             stbuf->st_mode = le32_to_cpu(tmp_mode);
         }
-        if (getxattr(buffer, "user.virtfs.rdev", &tmp_dev, sizeof(dev_t)) > 0) {
+        if (fgetxattrat_nofollow(dirfd, name, "user.virtfs.rdev", &tmp_dev,
+                                 sizeof(dev_t)) > 0) {
             stbuf->st_rdev = le64_to_cpu(tmp_dev);
         }
     } else if (fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
-        local_mapped_file_attr(fs_ctx, path, stbuf);
+        local_mapped_file_attr(dirfd, name, stbuf);
     }
 
 err_out:
-    g_free(buffer);
+    close_preserve_errno(dirfd);
+out:
+    g_free(name);
+    g_free(dirpath);
     return err;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 21/31] 9pfs: local: renameat: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (19 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 20/31] 9pfs: local: lstat: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 22/31] 9pfs: local: rename: use renameat Greg Kurz
                   ` (12 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_renameat() callback is currently a wrapper around local_rename()
which is vulnerable to symlink attacks.

This patch rewrites local_renameat() to have its own implementation, based
on local_opendir_nofollow() and renameat().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 64 insertions(+), 10 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index ee3c1bd0a2be..cf9e03d8e64f 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -67,6 +67,14 @@ int local_opendir_nofollow(FsContext *fs_ctx, const char *path)
     return local_open_nofollow(fs_ctx, path, O_DIRECTORY | O_RDONLY, 0);
 }
 
+static void renameat_preserve_errno(int odirfd, const char *opath, int ndirfd,
+                                    const char *npath)
+{
+    int serrno = errno;
+    renameat(odirfd, opath, ndirfd, npath);
+    errno = serrno;
+}
+
 #define VIRTFS_META_DIR ".virtfs_metadata"
 
 static char *local_mapped_attr_path(FsContext *ctx, const char *path)
@@ -146,8 +154,7 @@ static void local_mapped_file_attr(int dirfd, const char *name,
     char buf[ATTR_MAX];
     int map_dirfd;
 
-    map_dirfd = openat(dirfd, VIRTFS_META_DIR,
-                       O_RDONLY | O_DIRECTORY | O_NOFOLLOW);
+    map_dirfd = openat_dir(dirfd, VIRTFS_META_DIR);
     if (map_dirfd == -1) {
         return;
     }
@@ -1186,17 +1193,64 @@ static int local_renameat(FsContext *ctx, V9fsPath *olddir,
                           const char *new_name)
 {
     int ret;
-    V9fsString old_full_name, new_full_name;
+    int odirfd, ndirfd;
+
+    odirfd = local_opendir_nofollow(ctx, olddir->data);
+    if (odirfd == -1) {
+        return -1;
+    }
+
+    ndirfd = local_opendir_nofollow(ctx, newdir->data);
+    if (ndirfd == -1) {
+        close_preserve_errno(odirfd);
+        return -1;
+    }
+
+    ret = renameat(odirfd, old_name, ndirfd, new_name);
+    if (ret < 0) {
+        goto out;
+    }
 
-    v9fs_string_init(&old_full_name);
-    v9fs_string_init(&new_full_name);
+    if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
+        int omap_dirfd, nmap_dirfd;
 
-    v9fs_string_sprintf(&old_full_name, "%s/%s", olddir->data, old_name);
-    v9fs_string_sprintf(&new_full_name, "%s/%s", newdir->data, new_name);
+        ret = mkdirat(ndirfd, VIRTFS_META_DIR, 0700);
+        if (ret < 0 && errno != EEXIST) {
+            goto err_undo_rename;
+        }
 
-    ret = local_rename(ctx, old_full_name.data, new_full_name.data);
-    v9fs_string_free(&old_full_name);
-    v9fs_string_free(&new_full_name);
+        omap_dirfd = openat(odirfd, VIRTFS_META_DIR,
+                            O_RDONLY | O_DIRECTORY | O_NOFOLLOW);
+        if (omap_dirfd == -1) {
+            goto err;
+        }
+
+        nmap_dirfd = openat(ndirfd, VIRTFS_META_DIR,
+                            O_RDONLY | O_DIRECTORY | O_NOFOLLOW);
+        if (nmap_dirfd == -1) {
+            close_preserve_errno(omap_dirfd);
+            goto err;
+        }
+
+        /* rename the .virtfs_metadata files */
+        ret = renameat(omap_dirfd, old_name, nmap_dirfd, new_name);
+        close_preserve_errno(nmap_dirfd);
+        close_preserve_errno(omap_dirfd);
+        if (ret < 0 && errno != ENOENT) {
+            goto err_undo_rename;
+        }
+
+        ret = 0;
+    }
+    goto out;
+
+err:
+    ret = -1;
+err_undo_rename:
+    renameat_preserve_errno(ndirfd, new_name, odirfd, old_name);
+out:
+    close_preserve_errno(ndirfd);
+    close_preserve_errno(odirfd);
     return ret;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 22/31] 9pfs: local: rename: use renameat
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (20 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 21/31] 9pfs: local: renameat: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 23/31] 9pfs: local: improve error handling in link op Greg Kurz
                   ` (11 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_rename() callback is vulnerable to symlink attacks because it
uses rename() which follows symbolic links in all path elements but the
rightmost one.

This patch simply transforms local_rename() into a wrapper around
local_renameat() which is symlink-attack safe.

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 57 ++++++++++++++++++++++++++----------------------------
 1 file changed, 27 insertions(+), 30 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index cf9e03d8e64f..e7a7468a565b 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -964,36 +964,6 @@ static int local_truncate(FsContext *ctx, V9fsPath *fs_path, off_t size)
     return ret;
 }
 
-static int local_rename(FsContext *ctx, const char *oldpath,
-                        const char *newpath)
-{
-    int err;
-    char *buffer, *buffer1;
-
-    if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
-        err = local_create_mapped_attr_dir(ctx, newpath);
-        if (err < 0) {
-            return err;
-        }
-        /* rename the .virtfs_metadata files */
-        buffer = local_mapped_attr_path(ctx, oldpath);
-        buffer1 = local_mapped_attr_path(ctx, newpath);
-        err = rename(buffer, buffer1);
-        g_free(buffer);
-        g_free(buffer1);
-        if (err < 0 && errno != ENOENT) {
-            return err;
-        }
-    }
-
-    buffer = rpath(ctx, oldpath);
-    buffer1 = rpath(ctx, newpath);
-    err = rename(buffer, buffer1);
-    g_free(buffer);
-    g_free(buffer1);
-    return err;
-}
-
 static int local_chown(FsContext *fs_ctx, V9fsPath *fs_path, FsCred *credp)
 {
     char *buffer;
@@ -1254,6 +1224,33 @@ out:
     return ret;
 }
 
+static void v9fs_path_init_dirname(V9fsPath *path, const char *str)
+{
+    path->data = g_path_get_dirname(str);
+    path->size = strlen(path->data) + 1;
+}
+
+static int local_rename(FsContext *ctx, const char *oldpath,
+                        const char *newpath)
+{
+    int err;
+    char *oname = g_path_get_basename(oldpath);
+    char *nname = g_path_get_basename(newpath);
+    V9fsPath olddir, newdir;
+
+    v9fs_path_init_dirname(&olddir, oldpath);
+    v9fs_path_init_dirname(&newdir, newpath);
+
+    err = local_renameat(ctx, &olddir, oname, &newdir, nname);
+
+    v9fs_path_free(&newdir);
+    v9fs_path_free(&olddir);
+    g_free(nname);
+    g_free(oname);
+
+    return err;
+}
+
 static int local_unlinkat(FsContext *ctx, V9fsPath *dir,
                           const char *name, int flags)
 {
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 23/31] 9pfs: local: improve error handling in link op
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (21 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 22/31] 9pfs: local: rename: use renameat Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 24/31] 9pfs: local: link: don't follow symlinks Greg Kurz
                   ` (10 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

When using the mapped-file security model, we also have to create a link
for the metadata file if it exists. In case of failure, we should rollback.

That's what this patch does.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index e7a7468a565b..54a199e7ff15 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -920,6 +920,7 @@ static int local_link(FsContext *ctx, V9fsPath *oldpath,
     int ret;
     V9fsString newpath;
     char *buffer, *buffer1;
+    int serrno;
 
     v9fs_string_init(&newpath);
     v9fs_string_sprintf(&newpath, "%s/%s", dirpath->data, name);
@@ -928,25 +929,36 @@ static int local_link(FsContext *ctx, V9fsPath *oldpath,
     buffer1 = rpath(ctx, newpath.data);
     ret = link(buffer, buffer1);
     g_free(buffer);
-    g_free(buffer1);
+    if (ret < 0) {
+        goto out;
+    }
 
     /* now link the virtfs_metadata files */
-    if (!ret && (ctx->export_flags & V9FS_SM_MAPPED_FILE)) {
+    if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
+        char *vbuffer, *vbuffer1;
+
         /* Link the .virtfs_metadata files. Create the metada directory */
         ret = local_create_mapped_attr_dir(ctx, newpath.data);
         if (ret < 0) {
             goto err_out;
         }
-        buffer = local_mapped_attr_path(ctx, oldpath->data);
-        buffer1 = local_mapped_attr_path(ctx, newpath.data);
-        ret = link(buffer, buffer1);
-        g_free(buffer);
-        g_free(buffer1);
+        vbuffer = local_mapped_attr_path(ctx, oldpath->data);
+        vbuffer1 = local_mapped_attr_path(ctx, newpath.data);
+        ret = link(vbuffer, vbuffer1);
+        g_free(vbuffer);
+        g_free(vbuffer1);
         if (ret < 0 && errno != ENOENT) {
             goto err_out;
         }
     }
+    goto out;
+
 err_out:
+    serrno = errno;
+    remove(buffer1);
+    errno = serrno;
+out:
+    g_free(buffer1);
     v9fs_string_free(&newpath);
     return ret;
 }
@@ -1189,14 +1201,12 @@ static int local_renameat(FsContext *ctx, V9fsPath *olddir,
             goto err_undo_rename;
         }
 
-        omap_dirfd = openat(odirfd, VIRTFS_META_DIR,
-                            O_RDONLY | O_DIRECTORY | O_NOFOLLOW);
+        omap_dirfd = openat_dir(odirfd, VIRTFS_META_DIR);
         if (omap_dirfd == -1) {
             goto err;
         }
 
-        nmap_dirfd = openat(ndirfd, VIRTFS_META_DIR,
-                            O_RDONLY | O_DIRECTORY | O_NOFOLLOW);
+        nmap_dirfd = openat_dir(ndirfd, VIRTFS_META_DIR);
         if (nmap_dirfd == -1) {
             close_preserve_errno(omap_dirfd);
             goto err;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 24/31] 9pfs: local: link: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (22 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 23/31] 9pfs: local: improve error handling in link op Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 25/31] 9pfs: local: chmod: " Greg Kurz
                   ` (9 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_link() callback is vulnerable to symlink attacks because it calls:

(1) link() which follows symbolic links for all path elements but the
    rightmost one
(2) local_create_mapped_attr_dir()->mkdir() which follows symbolic links
    for all path elements but the rightmost one

This patch converts local_link() to rely on opendir_nofollow() and linkat()
to fix (1), mkdirat() to fix (2).

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 84 +++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 55 insertions(+), 29 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 54a199e7ff15..52b039625d1c 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -75,6 +75,13 @@ static void renameat_preserve_errno(int odirfd, const char *opath, int ndirfd,
     errno = serrno;
 }
 
+static void unlinkat_preserve_errno(int dirfd, const char *path, int flags)
+{
+    int serrno = errno;
+    unlinkat(dirfd, path, flags);
+    errno = serrno;
+}
+
 #define VIRTFS_META_DIR ".virtfs_metadata"
 
 static char *local_mapped_attr_path(FsContext *ctx, const char *path)
@@ -917,49 +924,68 @@ out:
 static int local_link(FsContext *ctx, V9fsPath *oldpath,
                       V9fsPath *dirpath, const char *name)
 {
-    int ret;
-    V9fsString newpath;
-    char *buffer, *buffer1;
-    int serrno;
+    char *odirpath = g_path_get_dirname(oldpath->data);
+    char *oname = g_path_get_basename(oldpath->data);
+    int ret = -1;
+    int odirfd, ndirfd;
 
-    v9fs_string_init(&newpath);
-    v9fs_string_sprintf(&newpath, "%s/%s", dirpath->data, name);
+    odirfd = local_opendir_nofollow(ctx, odirpath);
+    if (odirfd == -1) {
+        goto out;
+    }
 
-    buffer = rpath(ctx, oldpath->data);
-    buffer1 = rpath(ctx, newpath.data);
-    ret = link(buffer, buffer1);
-    g_free(buffer);
-    if (ret < 0) {
+    ndirfd = local_opendir_nofollow(ctx, dirpath->data);
+    if (ndirfd == -1) {
+        close_preserve_errno(odirfd);
         goto out;
     }
 
+    ret = linkat(odirfd, oname, ndirfd, name, 0);
+    if (ret < 0) {
+        goto out_close;
+    }
+
     /* now link the virtfs_metadata files */
     if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
-        char *vbuffer, *vbuffer1;
+        int omap_dirfd, nmap_dirfd;
 
-        /* Link the .virtfs_metadata files. Create the metada directory */
-        ret = local_create_mapped_attr_dir(ctx, newpath.data);
-        if (ret < 0) {
-            goto err_out;
+        ret = mkdirat(ndirfd, VIRTFS_META_DIR, 0700);
+        if (ret < 0 && errno != EEXIST) {
+            goto err_undo_link;
         }
-        vbuffer = local_mapped_attr_path(ctx, oldpath->data);
-        vbuffer1 = local_mapped_attr_path(ctx, newpath.data);
-        ret = link(vbuffer, vbuffer1);
-        g_free(vbuffer);
-        g_free(vbuffer1);
+
+        omap_dirfd = openat_dir(odirfd, VIRTFS_META_DIR);
+        if (omap_dirfd == -1) {
+            goto err;
+        }
+
+        nmap_dirfd = openat_dir(ndirfd, VIRTFS_META_DIR);
+        if (nmap_dirfd == -1) {
+            close_preserve_errno(omap_dirfd);
+            goto err;
+        }
+
+        ret = linkat(omap_dirfd, oname, nmap_dirfd, name, 0);
+        close_preserve_errno(nmap_dirfd);
+        close_preserve_errno(omap_dirfd);
         if (ret < 0 && errno != ENOENT) {
-            goto err_out;
+            goto err_undo_link;
         }
+
+        ret = 0;
     }
-    goto out;
+    goto out_close;
 
-err_out:
-    serrno = errno;
-    remove(buffer1);
-    errno = serrno;
+err:
+    ret = -1;
+err_undo_link:
+    unlinkat_preserve_errno(ndirfd, name, 0);
+out_close:
+    close_preserve_errno(ndirfd);
+    close_preserve_errno(odirfd);
 out:
-    g_free(buffer1);
-    v9fs_string_free(&newpath);
+    g_free(oname);
+    g_free(odirpath);
     return ret;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 25/31] 9pfs: local: chmod: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (23 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 24/31] 9pfs: local: link: don't follow symlinks Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 26/31] 9pfs: local: chown: " Greg Kurz
                   ` (8 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_chmod() callback is vulnerable to symlink attacks because it
calls:

(1) chmod() which follows symbolic links for all path elements
(2) local_set_xattr()->setxattr() which follows symbolic links for all
    path elements
(3) local_set_mapped_file_attr() which calls in turn local_fopen() and
    mkdir(), both functions following symbolic links for all path
    elements but the rightmost one

We would need fchmodat() to implement AT_SYMLINK_NOFOLLOW to fix (1). This
isn't the case on linux unfortunately: the kernel doesn't even have a flags
argument to the syscall :-\ It is impossible to fix it in userspace in
a race-free manner. This patch hence converts local_chmod() to rely on
open_nofollow() and fchmod(). This fixes the vulnerability but introduces
a limitation: the target file must readable and/or writable for the call
to openat() to succeed.

It introduces a local_set_xattrat() replacement to local_set_xattr()
based on fsetxattrat() to fix (2), and a local_set_mapped_file_attrat()
replacement to local_set_mapped_file_attr() based on local_fopenat()
and mkdirat() to fix (3). No effort is made to factor out code because
both local_set_xattr() and local_set_mapped_file_attr() will be dropped
when all users have been converted to use the "at" versions.

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 178 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 167 insertions(+), 11 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 52b039625d1c..9a979a3b7c56 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -367,6 +367,155 @@ static int local_set_xattr(const char *path, FsCred *credp)
     return 0;
 }
 
+static int local_set_mapped_file_attrat(int dirfd, const char *name,
+                                        FsCred *credp)
+{
+    FILE *fp;
+    int ret;
+    char buf[ATTR_MAX];
+    int uid = -1, gid = -1, mode = -1, rdev = -1;
+    int map_dirfd;
+
+    ret = mkdirat(dirfd, VIRTFS_META_DIR, 0700);
+    if (ret < 0 && errno != EEXIST) {
+        return -1;
+    }
+
+    map_dirfd = openat_dir(dirfd, VIRTFS_META_DIR);
+    if (map_dirfd == -1) {
+        return -1;
+    }
+
+    fp = local_fopenat(map_dirfd, name, "r");
+    if (!fp) {
+        if (errno == ENOENT) {
+            goto update_map_file;
+        } else {
+            close_preserve_errno(map_dirfd);
+            return -1;
+        }
+    }
+    memset(buf, 0, ATTR_MAX);
+    while (fgets(buf, ATTR_MAX, fp)) {
+        if (!strncmp(buf, "virtfs.uid", 10)) {
+            uid = atoi(buf + 11);
+        } else if (!strncmp(buf, "virtfs.gid", 10)) {
+            gid = atoi(buf + 11);
+        } else if (!strncmp(buf, "virtfs.mode", 11)) {
+            mode = atoi(buf + 12);
+        } else if (!strncmp(buf, "virtfs.rdev", 11)) {
+            rdev = atoi(buf + 12);
+        }
+        memset(buf, 0, ATTR_MAX);
+    }
+    fclose(fp);
+
+update_map_file:
+    fp = local_fopenat(map_dirfd, name, "w");
+    close_preserve_errno(map_dirfd);
+    if (!fp) {
+        return -1;
+    }
+
+    if (credp->fc_uid != -1) {
+        uid = credp->fc_uid;
+    }
+    if (credp->fc_gid != -1) {
+        gid = credp->fc_gid;
+    }
+    if (credp->fc_mode != -1) {
+        mode = credp->fc_mode;
+    }
+    if (credp->fc_rdev != -1) {
+        rdev = credp->fc_rdev;
+    }
+
+    if (uid != -1) {
+        fprintf(fp, "virtfs.uid=%d\n", uid);
+    }
+    if (gid != -1) {
+        fprintf(fp, "virtfs.gid=%d\n", gid);
+    }
+    if (mode != -1) {
+        fprintf(fp, "virtfs.mode=%d\n", mode);
+    }
+    if (rdev != -1) {
+        fprintf(fp, "virtfs.rdev=%d\n", rdev);
+    }
+    fclose(fp);
+
+    return 0;
+}
+
+static int fchmodat_nofollow(int dirfd, const char *name, mode_t mode)
+{
+    int fd, ret;
+
+    /* FIXME: this should be handled with fchmodat(AT_SYMLINK_NOFOLLOW).
+     * Unfortunately, the linux kernel doesn't implement it yet. As an
+     * alternative, let's open the file and use fchmod() instead. This
+     * may fail depending on the permissions of the file, but it is the
+     * best we can do to avoid TOCTTOU. We first try to open read-only
+     * in case name points to a directory. If that fails, we try write-only
+     * in case name doesn't point to a directory.
+     */
+    fd = openat_file(dirfd, name, O_RDONLY, 0);
+    if (fd == -1) {
+        /* In case the file is writable-only and isn't a directory. */
+        if (errno == EACCES) {
+            fd = openat_file(dirfd, name, O_WRONLY, 0);
+        }
+        if (fd == -1 && errno == EISDIR) {
+            errno = EACCES;
+        }
+    }
+    if (fd == -1) {
+        return -1;
+    }
+    ret = fchmod(fd, mode);
+    close_preserve_errno(fd);
+    return ret;
+}
+
+static int local_set_xattrat(int dirfd, const char *path, FsCred *credp)
+{
+    int err;
+
+    if (credp->fc_uid != -1) {
+        uint32_t tmp_uid = cpu_to_le32(credp->fc_uid);
+        err = fsetxattrat_nofollow(dirfd, path, "user.virtfs.uid", &tmp_uid,
+                                   sizeof(uid_t), 0);
+        if (err) {
+            return err;
+        }
+    }
+    if (credp->fc_gid != -1) {
+        uint32_t tmp_gid = cpu_to_le32(credp->fc_gid);
+        err = fsetxattrat_nofollow(dirfd, path, "user.virtfs.gid", &tmp_gid,
+                                   sizeof(gid_t), 0);
+        if (err) {
+            return err;
+        }
+    }
+    if (credp->fc_mode != -1) {
+        uint32_t tmp_mode = cpu_to_le32(credp->fc_mode);
+        err = fsetxattrat_nofollow(dirfd, path, "user.virtfs.mode", &tmp_mode,
+                                   sizeof(mode_t), 0);
+        if (err) {
+            return err;
+        }
+    }
+    if (credp->fc_rdev != -1) {
+        uint64_t tmp_rdev = cpu_to_le64(credp->fc_rdev);
+        err = fsetxattrat_nofollow(dirfd, path, "user.virtfs.rdev", &tmp_rdev,
+                                   sizeof(dev_t), 0);
+        if (err) {
+            return err;
+        }
+    }
+    return 0;
+}
+
 static int local_post_create_passthrough(FsContext *fs_ctx, const char *path,
                                          FsCred *credp)
 {
@@ -558,22 +707,29 @@ static ssize_t local_pwritev(FsContext *ctx, V9fsFidOpenState *fs,
 
 static int local_chmod(FsContext *fs_ctx, V9fsPath *fs_path, FsCred *credp)
 {
-    char *buffer;
+    char *dirpath = g_path_get_dirname(fs_path->data);
+    char *name = g_path_get_basename(fs_path->data);
     int ret = -1;
-    char *path = fs_path->data;
+    int dirfd;
+
+    dirfd = local_opendir_nofollow(fs_ctx, dirpath);
+    if (dirfd == -1) {
+        goto out;
+    }
 
     if (fs_ctx->export_flags & V9FS_SM_MAPPED) {
-        buffer = rpath(fs_ctx, path);
-        ret = local_set_xattr(buffer, credp);
-        g_free(buffer);
+        ret = local_set_xattrat(dirfd, name, credp);
     } else if (fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
-        return local_set_mapped_file_attr(fs_ctx, path, credp);
-    } else if ((fs_ctx->export_flags & V9FS_SM_PASSTHROUGH) ||
-               (fs_ctx->export_flags & V9FS_SM_NONE)) {
-        buffer = rpath(fs_ctx, path);
-        ret = chmod(buffer, credp->fc_mode);
-        g_free(buffer);
+        ret = local_set_mapped_file_attrat(dirfd, name, credp);
+    } else if (fs_ctx->export_flags & V9FS_SM_PASSTHROUGH ||
+               fs_ctx->export_flags & V9FS_SM_NONE) {
+        ret = fchmodat_nofollow(dirfd, name, credp->fc_mode);
     }
+    close_preserve_errno(dirfd);
+
+out:
+    g_free(dirpath);
+    g_free(name);
     return ret;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 26/31] 9pfs: local: chown: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (24 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 25/31] 9pfs: local: chmod: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 27/31] 9pfs: local: symlink: " Greg Kurz
                   ` (7 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_chown() callback is vulnerable to symlink attacks because it
calls:

(1) lchown() which follows symbolic links for all path elements but the
    rightmost one
(2) local_set_xattr()->setxattr() which follows symbolic links for all
    path elements
(3) local_set_mapped_file_attr() which calls in turn local_fopen() and
    mkdir(), both functions following symbolic links for all path
    elements but the rightmost one

This patch converts local_chown() to rely on open_nofollow() and
fchownat() to fix (1), as well as local_set_xattrat() and
local_set_mapped_file_attrat() to fix (2) and (3) respectively.

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 9a979a3b7c56..7c197417ebff 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -1160,23 +1160,31 @@ static int local_truncate(FsContext *ctx, V9fsPath *fs_path, off_t size)
 
 static int local_chown(FsContext *fs_ctx, V9fsPath *fs_path, FsCred *credp)
 {
-    char *buffer;
+    char *dirpath = g_path_get_dirname(fs_path->data);
+    char *name = g_path_get_basename(fs_path->data);
     int ret = -1;
-    char *path = fs_path->data;
+    int dirfd;
+
+    dirfd = local_opendir_nofollow(fs_ctx, dirpath);
+    if (dirfd == -1) {
+        goto out;
+    }
 
     if ((credp->fc_uid == -1 && credp->fc_gid == -1) ||
         (fs_ctx->export_flags & V9FS_SM_PASSTHROUGH) ||
         (fs_ctx->export_flags & V9FS_SM_NONE)) {
-        buffer = rpath(fs_ctx, path);
-        ret = lchown(buffer, credp->fc_uid, credp->fc_gid);
-        g_free(buffer);
+        ret = fchownat(dirfd, name, credp->fc_uid, credp->fc_gid,
+                       AT_SYMLINK_NOFOLLOW);
     } else if (fs_ctx->export_flags & V9FS_SM_MAPPED) {
-        buffer = rpath(fs_ctx, path);
-        ret = local_set_xattr(buffer, credp);
-        g_free(buffer);
+        ret = local_set_xattrat(dirfd, name, credp);
     } else if (fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
-        return local_set_mapped_file_attr(fs_ctx, path, credp);
+        ret = local_set_mapped_file_attrat(dirfd, name, credp);
     }
+
+    close_preserve_errno(dirfd);
+out:
+    g_free(name);
+    g_free(dirpath);
     return ret;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 27/31] 9pfs: local: symlink: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (25 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 26/31] 9pfs: local: chown: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 28/31] 9pfs: local: mknod: " Greg Kurz
                   ` (6 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_symlink() callback is vulnerable to symlink attacks because it
calls:

(1) symlink() which follows symbolic links for all path elements but the
    rightmost one
(2) open(O_NOFOLLOW) which follows symbolic links for all path elements but
    the rightmost one
(3) local_set_xattr()->setxattr() which follows symbolic links for all
    path elements
(4) local_set_mapped_file_attr() which calls in turn local_fopen() and
    mkdir(), both functions following symbolic links for all path
    elements but the rightmost one

This patch converts local_symlink() to rely on opendir_nofollow() and
symlinkat() to fix (1), openat(O_NOFOLLOW) to fix (2), as well as
local_set_xattrat() and local_set_mapped_file_attrat() to fix (3) and
(4) respectively.

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 81 +++++++++++++++++-------------------------------------
 1 file changed, 25 insertions(+), 56 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 7c197417ebff..907ecc59d494 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -978,23 +978,22 @@ static int local_symlink(FsContext *fs_ctx, const char *oldpath,
                          V9fsPath *dir_path, const char *name, FsCred *credp)
 {
     int err = -1;
-    int serrno = 0;
-    char *newpath;
-    V9fsString fullname;
-    char *buffer = NULL;
+    int dirfd;
 
-    v9fs_string_init(&fullname);
-    v9fs_string_sprintf(&fullname, "%s/%s", dir_path->data, name);
-    newpath = fullname.data;
+    dirfd = local_opendir_nofollow(fs_ctx, dir_path->data);
+    if (dirfd == -1) {
+        return -1;
+    }
 
     /* Determine the security model */
-    if (fs_ctx->export_flags & V9FS_SM_MAPPED) {
+    if (fs_ctx->export_flags & V9FS_SM_MAPPED ||
+        fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
         int fd;
         ssize_t oldpath_size, write_size;
-        buffer = rpath(fs_ctx, newpath);
-        fd = open(buffer, O_CREAT|O_EXCL|O_RDWR|O_NOFOLLOW, SM_LOCAL_MODE_BITS);
+
+        fd = openat_file(dirfd, name, O_CREAT | O_EXCL | O_RDWR,
+                         SM_LOCAL_MODE_BITS);
         if (fd == -1) {
-            err = fd;
             goto out;
         }
         /* Write the oldpath (target) to the file. */
@@ -1002,78 +1001,48 @@ static int local_symlink(FsContext *fs_ctx, const char *oldpath,
         do {
             write_size = write(fd, (void *)oldpath, oldpath_size);
         } while (write_size == -1 && errno == EINTR);
+        close_preserve_errno(fd);
 
         if (write_size != oldpath_size) {
-            serrno = errno;
-            close(fd);
-            err = -1;
             goto err_end;
         }
-        close(fd);
         /* Set cleint credentials in symlink's xattr */
-        credp->fc_mode = credp->fc_mode|S_IFLNK;
-        err = local_set_xattr(buffer, credp);
-        if (err == -1) {
-            serrno = errno;
-            goto err_end;
-        }
-    } else if (fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
-        int fd;
-        ssize_t oldpath_size, write_size;
-        buffer = rpath(fs_ctx, newpath);
-        fd = open(buffer, O_CREAT|O_EXCL|O_RDWR|O_NOFOLLOW, SM_LOCAL_MODE_BITS);
-        if (fd == -1) {
-            err = fd;
-            goto out;
-        }
-        /* Write the oldpath (target) to the file. */
-        oldpath_size = strlen(oldpath);
-        do {
-            write_size = write(fd, (void *)oldpath, oldpath_size);
-        } while (write_size == -1 && errno == EINTR);
+        credp->fc_mode = credp->fc_mode | S_IFLNK;
 
-        if (write_size != oldpath_size) {
-            serrno = errno;
-            close(fd);
-            err = -1;
-            goto err_end;
+        if (fs_ctx->export_flags & V9FS_SM_MAPPED) {
+            err = local_set_xattrat(dirfd, name, credp);
+        } else {
+            err = local_set_mapped_file_attrat(dirfd, name, credp);
         }
-        close(fd);
-        /* Set cleint credentials in symlink's xattr */
-        credp->fc_mode = credp->fc_mode|S_IFLNK;
-        err = local_set_mapped_file_attr(fs_ctx, newpath, credp);
         if (err == -1) {
-            serrno = errno;
             goto err_end;
         }
-    } else if ((fs_ctx->export_flags & V9FS_SM_PASSTHROUGH) ||
-               (fs_ctx->export_flags & V9FS_SM_NONE)) {
-        buffer = rpath(fs_ctx, newpath);
-        err = symlink(oldpath, buffer);
+    } else if (fs_ctx->export_flags & V9FS_SM_PASSTHROUGH ||
+               fs_ctx->export_flags & V9FS_SM_NONE) {
+        err = symlinkat(oldpath, dirfd, name);
         if (err) {
             goto out;
         }
-        err = lchown(buffer, credp->fc_uid, credp->fc_gid);
+        err = fchownat(dirfd, name, credp->fc_uid, credp->fc_gid,
+                       AT_SYMLINK_NOFOLLOW);
         if (err == -1) {
             /*
              * If we fail to change ownership and if we are
              * using security model none. Ignore the error
              */
             if ((fs_ctx->export_flags & V9FS_SEC_MASK) != V9FS_SM_NONE) {
-                serrno = errno;
                 goto err_end;
-            } else
+            } else {
                 err = 0;
+            }
         }
     }
     goto out;
 
 err_end:
-    remove(buffer);
-    errno = serrno;
+    unlinkat_preserve_errno(dirfd, name, 0);
 out:
-    g_free(buffer);
-    v9fs_string_free(&fullname);
+    close_preserve_errno(dirfd);
     return err;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 28/31] 9pfs: local: mknod: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (26 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 27/31] 9pfs: local: symlink: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 29/31] 9pfs: local: mkdir: " Greg Kurz
                   ` (5 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_mknod() callback is vulnerable to symlink attacks because it
calls:

(1) mknod() which follows symbolic links for all path elements but the
    rightmost one
(2) local_set_xattr()->setxattr() which follows symbolic links for all
    path elements
(3) local_set_mapped_file_attr() which calls in turn local_fopen() and
    mkdir(), both functions following symbolic links for all path
    elements but the rightmost one
(4) local_post_create_passthrough() which calls in turn lchown() and
    chmod(), both functions also following symbolic links

This patch converts local_mknod() to rely on opendir_nofollow() and
mknodat() to fix (1), as well as local_set_xattrat() and
local_set_mapped_file_attrat() to fix (2) and (3) respectively.

A new local_set_cred_passthrough() helper based on fchownat() and
fchmodat_nofollow() is introduced as a replacement to
local_post_create_passthrough() to fix (4).

The mapped and mapped-file security modes are supposed to be identical,
except for the place where credentials and file modes are stored. While
here, we also make that explicit by sharing the call to mknodat().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 68 ++++++++++++++++++++++++++++--------------------------
 1 file changed, 35 insertions(+), 33 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 907ecc59d494..bd95785ff129 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -543,6 +543,23 @@ err:
     return -1;
 }
 
+static int local_set_cred_passthrough(FsContext *fs_ctx, int dirfd,
+                                      const char *name, FsCred *credp)
+{
+    if (fchownat(dirfd, name, credp->fc_uid, credp->fc_gid,
+                 AT_SYMLINK_NOFOLLOW | AT_EMPTY_PATH) < 0) {
+        /*
+         * If we fail to change ownership and if we are
+         * using security model none. Ignore the error
+         */
+        if ((fs_ctx->export_flags & V9FS_SEC_MASK) != V9FS_SM_NONE) {
+            return -1;
+        }
+    }
+
+    return fchmodat_nofollow(dirfd, name, credp->fc_mode & 07777);
+}
+
 static ssize_t local_readlink(FsContext *fs_ctx, V9fsPath *fs_path,
                               char *buf, size_t bufsz)
 {
@@ -736,61 +753,46 @@ out:
 static int local_mknod(FsContext *fs_ctx, V9fsPath *dir_path,
                        const char *name, FsCred *credp)
 {
-    char *path;
     int err = -1;
-    int serrno = 0;
-    V9fsString fullname;
-    char *buffer = NULL;
+    int dirfd;
 
-    v9fs_string_init(&fullname);
-    v9fs_string_sprintf(&fullname, "%s/%s", dir_path->data, name);
-    path = fullname.data;
+    dirfd = local_opendir_nofollow(fs_ctx, dir_path->data);
+    if (dirfd == -1) {
+        return -1;
+    }
 
-    /* Determine the security model */
-    if (fs_ctx->export_flags & V9FS_SM_MAPPED) {
-        buffer = rpath(fs_ctx, path);
-        err = mknod(buffer, SM_LOCAL_MODE_BITS|S_IFREG, 0);
+    if (fs_ctx->export_flags & V9FS_SM_MAPPED ||
+        fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
+        err = mknodat(dirfd, name, SM_LOCAL_MODE_BITS | S_IFREG, 0);
         if (err == -1) {
             goto out;
         }
-        err = local_set_xattr(buffer, credp);
-        if (err == -1) {
-            serrno = errno;
-            goto err_end;
-        }
-    } else if (fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
 
-        buffer = rpath(fs_ctx, path);
-        err = mknod(buffer, SM_LOCAL_MODE_BITS|S_IFREG, 0);
-        if (err == -1) {
-            goto out;
+        if (fs_ctx->export_flags & V9FS_SM_MAPPED) {
+            err = local_set_xattrat(dirfd, name, credp);
+        } else {
+            err = local_set_mapped_file_attrat(dirfd, name, credp);
         }
-        err = local_set_mapped_file_attr(fs_ctx, path, credp);
         if (err == -1) {
-            serrno = errno;
             goto err_end;
         }
-    } else if ((fs_ctx->export_flags & V9FS_SM_PASSTHROUGH) ||
-               (fs_ctx->export_flags & V9FS_SM_NONE)) {
-        buffer = rpath(fs_ctx, path);
-        err = mknod(buffer, credp->fc_mode, credp->fc_rdev);
+    } else if (fs_ctx->export_flags & V9FS_SM_PASSTHROUGH ||
+               fs_ctx->export_flags & V9FS_SM_NONE) {
+        err = mknodat(dirfd, name, credp->fc_mode, credp->fc_rdev);
         if (err == -1) {
             goto out;
         }
-        err = local_post_create_passthrough(fs_ctx, path, credp);
+        err = local_set_cred_passthrough(fs_ctx, dirfd, name, credp);
         if (err == -1) {
-            serrno = errno;
             goto err_end;
         }
     }
     goto out;
 
 err_end:
-    remove(buffer);
-    errno = serrno;
+    unlinkat_preserve_errno(dirfd, name, 0);
 out:
-    g_free(buffer);
-    v9fs_string_free(&fullname);
+    close_preserve_errno(dirfd);
     return err;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 29/31] 9pfs: local: mkdir: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (27 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 28/31] 9pfs: local: mknod: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 30/31] 9pfs: local: open2: " Greg Kurz
                   ` (4 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_mkdir() callback is vulnerable to symlink attacks because it
calls:

(1) mkdir() which follows symbolic links for all path elements but the
    rightmost one
(2) local_set_xattr()->setxattr() which follows symbolic links for all
    path elements
(3) local_set_mapped_file_attr() which calls in turn local_fopen() and
    mkdir(), both functions following symbolic links for all path
    elements but the rightmost one
(4) local_post_create_passthrough() which calls in turn lchown() and
    chmod(), both functions also following symbolic links

This patch converts local_mkdir() to rely on opendir_nofollow() and
mkdirat() to fix (1), as well as local_set_xattrat(),
local_set_mapped_file_attrat() and local_set_cred_passthrough() to
fix (2), (3) and (4) respectively.

The mapped and mapped-file security modes are supposed to be identical,
except for the place where credentials and file modes are stored. While
here, we also make that explicit by sharing the call to mkdirat().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 55 ++++++++++++++++++++----------------------------------
 1 file changed, 20 insertions(+), 35 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index bd95785ff129..572eb5886e04 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -799,62 +799,47 @@ out:
 static int local_mkdir(FsContext *fs_ctx, V9fsPath *dir_path,
                        const char *name, FsCred *credp)
 {
-    char *path;
     int err = -1;
-    int serrno = 0;
-    V9fsString fullname;
-    char *buffer = NULL;
+    int dirfd;
 
-    v9fs_string_init(&fullname);
-    v9fs_string_sprintf(&fullname, "%s/%s", dir_path->data, name);
-    path = fullname.data;
+    dirfd = local_opendir_nofollow(fs_ctx, dir_path->data);
+    if (dirfd == -1) {
+        return -1;
+    }
 
-    /* Determine the security model */
-    if (fs_ctx->export_flags & V9FS_SM_MAPPED) {
-        buffer = rpath(fs_ctx, path);
-        err = mkdir(buffer, SM_LOCAL_DIR_MODE_BITS);
+    if (fs_ctx->export_flags & V9FS_SM_MAPPED ||
+        fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
+        err = mkdirat(dirfd, name, SM_LOCAL_DIR_MODE_BITS);
         if (err == -1) {
             goto out;
         }
-        credp->fc_mode = credp->fc_mode|S_IFDIR;
-        err = local_set_xattr(buffer, credp);
-        if (err == -1) {
-            serrno = errno;
-            goto err_end;
-        }
-    } else if (fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
-        buffer = rpath(fs_ctx, path);
-        err = mkdir(buffer, SM_LOCAL_DIR_MODE_BITS);
-        if (err == -1) {
-            goto out;
+        credp->fc_mode = credp->fc_mode | S_IFDIR;
+
+        if (fs_ctx->export_flags & V9FS_SM_MAPPED) {
+            err = local_set_xattrat(dirfd, name, credp);
+        } else {
+            err = local_set_mapped_file_attrat(dirfd, name, credp);
         }
-        credp->fc_mode = credp->fc_mode|S_IFDIR;
-        err = local_set_mapped_file_attr(fs_ctx, path, credp);
         if (err == -1) {
-            serrno = errno;
             goto err_end;
         }
-    } else if ((fs_ctx->export_flags & V9FS_SM_PASSTHROUGH) ||
-               (fs_ctx->export_flags & V9FS_SM_NONE)) {
-        buffer = rpath(fs_ctx, path);
-        err = mkdir(buffer, credp->fc_mode);
+    } else if (fs_ctx->export_flags & V9FS_SM_PASSTHROUGH ||
+               fs_ctx->export_flags & V9FS_SM_NONE) {
+        err = mkdirat(dirfd, name, credp->fc_mode);
         if (err == -1) {
             goto out;
         }
-        err = local_post_create_passthrough(fs_ctx, path, credp);
+        err = local_set_cred_passthrough(fs_ctx, dirfd, name, credp);
         if (err == -1) {
-            serrno = errno;
             goto err_end;
         }
     }
     goto out;
 
 err_end:
-    remove(buffer);
-    errno = serrno;
+    unlinkat_preserve_errno(dirfd, name, AT_REMOVEDIR);
 out:
-    g_free(buffer);
-    v9fs_string_free(&fullname);
+    close_preserve_errno(dirfd);
     return err;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 30/31] 9pfs: local: open2: don't follow symlinks
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (28 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 29/31] 9pfs: local: mkdir: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:00 ` [Qemu-devel] [PULL 31/31] 9pfs: local: drop unused code Greg Kurz
                   ` (3 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

The local_open2() callback is vulnerable to symlink attacks because it
calls:

(1) open() which follows symbolic links for all path elements but the
    rightmost one
(2) local_set_xattr()->setxattr() which follows symbolic links for all
    path elements
(3) local_set_mapped_file_attr() which calls in turn local_fopen() and
    mkdir(), both functions following symbolic links for all path
    elements but the rightmost one
(4) local_post_create_passthrough() which calls in turn lchown() and
    chmod(), both functions also following symbolic links

This patch converts local_open2() to rely on opendir_nofollow() and
mkdirat() to fix (1), as well as local_set_xattrat(),
local_set_mapped_file_attrat() and local_set_cred_passthrough() to
fix (2), (3) and (4) respectively. Since local_open2() already opens
a descriptor to the target file, local_set_cred_passthrough() is
modified to reuse it instead of opening a new one.

The mapped and mapped-file security modes are supposed to be identical,
except for the place where credentials and file modes are stored. While
here, we also make that explicit by sharing the call to openat().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 56 ++++++++++++++++++------------------------------------
 1 file changed, 19 insertions(+), 37 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 572eb5886e04..0b8bbf31a12d 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -887,62 +887,45 @@ static int local_fstat(FsContext *fs_ctx, int fid_type,
 static int local_open2(FsContext *fs_ctx, V9fsPath *dir_path, const char *name,
                        int flags, FsCred *credp, V9fsFidOpenState *fs)
 {
-    char *path;
     int fd = -1;
     int err = -1;
-    int serrno = 0;
-    V9fsString fullname;
-    char *buffer = NULL;
+    int dirfd;
 
     /*
      * Mark all the open to not follow symlinks
      */
     flags |= O_NOFOLLOW;
 
-    v9fs_string_init(&fullname);
-    v9fs_string_sprintf(&fullname, "%s/%s", dir_path->data, name);
-    path = fullname.data;
+    dirfd = local_opendir_nofollow(fs_ctx, dir_path->data);
+    if (dirfd == -1) {
+        return -1;
+    }
 
     /* Determine the security model */
-    if (fs_ctx->export_flags & V9FS_SM_MAPPED) {
-        buffer = rpath(fs_ctx, path);
-        fd = open(buffer, flags, SM_LOCAL_MODE_BITS);
+    if (fs_ctx->export_flags & V9FS_SM_MAPPED ||
+        fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
+        fd = openat_file(dirfd, name, flags, SM_LOCAL_MODE_BITS);
         if (fd == -1) {
-            err = fd;
             goto out;
         }
         credp->fc_mode = credp->fc_mode|S_IFREG;
-        /* Set cleint credentials in xattr */
-        err = local_set_xattr(buffer, credp);
-        if (err == -1) {
-            serrno = errno;
-            goto err_end;
-        }
-    } else if (fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
-        buffer = rpath(fs_ctx, path);
-        fd = open(buffer, flags, SM_LOCAL_MODE_BITS);
-        if (fd == -1) {
-            err = fd;
-            goto out;
+        if (fs_ctx->export_flags & V9FS_SM_MAPPED) {
+            /* Set cleint credentials in xattr */
+            err = local_set_xattrat(dirfd, name, credp);
+        } else {
+            err = local_set_mapped_file_attrat(dirfd, name, credp);
         }
-        credp->fc_mode = credp->fc_mode|S_IFREG;
-        /* Set client credentials in .virtfs_metadata directory files */
-        err = local_set_mapped_file_attr(fs_ctx, path, credp);
         if (err == -1) {
-            serrno = errno;
             goto err_end;
         }
     } else if ((fs_ctx->export_flags & V9FS_SM_PASSTHROUGH) ||
                (fs_ctx->export_flags & V9FS_SM_NONE)) {
-        buffer = rpath(fs_ctx, path);
-        fd = open(buffer, flags, credp->fc_mode);
+        fd = openat_file(dirfd, name, flags, credp->fc_mode);
         if (fd == -1) {
-            err = fd;
             goto out;
         }
-        err = local_post_create_passthrough(fs_ctx, path, credp);
+        err = local_set_cred_passthrough(fs_ctx, dirfd, name, credp);
         if (err == -1) {
-            serrno = errno;
             goto err_end;
         }
     }
@@ -951,12 +934,11 @@ static int local_open2(FsContext *fs_ctx, V9fsPath *dir_path, const char *name,
     goto out;
 
 err_end:
-    close(fd);
-    remove(buffer);
-    errno = serrno;
+    unlinkat_preserve_errno(dirfd, name,
+                            flags & O_DIRECTORY ? AT_REMOVEDIR : 0);
+    close_preserve_errno(fd);
 out:
-    g_free(buffer);
-    v9fs_string_free(&fullname);
+    close_preserve_errno(dirfd);
     return err;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [Qemu-devel] [PULL 31/31] 9pfs: local: drop unused code
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (29 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 30/31] 9pfs: local: open2: " Greg Kurz
@ 2017-02-27 23:00 ` Greg Kurz
  2017-02-27 23:41 ` [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze no-reply
                   ` (2 subsequent siblings)
  33 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-27 23:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V, Greg Kurz

Now that the all callbacks have been converted to use "at" syscalls, we
can drop this code.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/9pfs/9p-local.c | 198 -----------------------------------------------------
 1 file changed, 198 deletions(-)

diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 0b8bbf31a12d..f22a3c3654db 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -84,48 +84,6 @@ static void unlinkat_preserve_errno(int dirfd, const char *path, int flags)
 
 #define VIRTFS_META_DIR ".virtfs_metadata"
 
-static char *local_mapped_attr_path(FsContext *ctx, const char *path)
-{
-    int dirlen;
-    const char *name = strrchr(path, '/');
-    if (name) {
-        dirlen = name - path;
-        ++name;
-    } else {
-        name = path;
-        dirlen = 0;
-    }
-    return g_strdup_printf("%s/%.*s/%s/%s", ctx->fs_root,
-                           dirlen, path, VIRTFS_META_DIR, name);
-}
-
-static FILE *local_fopen(const char *path, const char *mode)
-{
-    int fd, o_mode = 0;
-    FILE *fp;
-    int flags = O_NOFOLLOW;
-    /*
-     * only supports two modes
-     */
-    if (mode[0] == 'r') {
-        flags |= O_RDONLY;
-    } else if (mode[0] == 'w') {
-        flags |= O_WRONLY | O_TRUNC | O_CREAT;
-        o_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
-    } else {
-        return NULL;
-    }
-    fd = open(path, flags, o_mode);
-    if (fd == -1) {
-        return NULL;
-    }
-    fp = fdopen(fd, mode);
-    if (!fp) {
-        close(fd);
-    }
-    return fp;
-}
-
 static FILE *local_fopenat(int dirfd, const char *name, const char *mode)
 {
     int fd, o_mode = 0;
@@ -238,135 +196,6 @@ out:
     return err;
 }
 
-static int local_create_mapped_attr_dir(FsContext *ctx, const char *path)
-{
-    int err;
-    char *attr_dir;
-    char *tmp_path = g_strdup(path);
-
-    attr_dir = g_strdup_printf("%s/%s/%s",
-             ctx->fs_root, dirname(tmp_path), VIRTFS_META_DIR);
-
-    err = mkdir(attr_dir, 0700);
-    if (err < 0 && errno == EEXIST) {
-        err = 0;
-    }
-    g_free(attr_dir);
-    g_free(tmp_path);
-    return err;
-}
-
-static int local_set_mapped_file_attr(FsContext *ctx,
-                                      const char *path, FsCred *credp)
-{
-    FILE *fp;
-    int ret = 0;
-    char buf[ATTR_MAX];
-    char *attr_path;
-    int uid = -1, gid = -1, mode = -1, rdev = -1;
-
-    attr_path = local_mapped_attr_path(ctx, path);
-    fp = local_fopen(attr_path, "r");
-    if (!fp) {
-        goto create_map_file;
-    }
-    memset(buf, 0, ATTR_MAX);
-    while (fgets(buf, ATTR_MAX, fp)) {
-        if (!strncmp(buf, "virtfs.uid", 10)) {
-            uid = atoi(buf+11);
-        } else if (!strncmp(buf, "virtfs.gid", 10)) {
-            gid = atoi(buf+11);
-        } else if (!strncmp(buf, "virtfs.mode", 11)) {
-            mode = atoi(buf+12);
-        } else if (!strncmp(buf, "virtfs.rdev", 11)) {
-            rdev = atoi(buf+12);
-        }
-        memset(buf, 0, ATTR_MAX);
-    }
-    fclose(fp);
-    goto update_map_file;
-
-create_map_file:
-    ret = local_create_mapped_attr_dir(ctx, path);
-    if (ret < 0) {
-        goto err_out;
-    }
-
-update_map_file:
-    fp = local_fopen(attr_path, "w");
-    if (!fp) {
-        ret = -1;
-        goto err_out;
-    }
-
-    if (credp->fc_uid != -1) {
-        uid = credp->fc_uid;
-    }
-    if (credp->fc_gid != -1) {
-        gid = credp->fc_gid;
-    }
-    if (credp->fc_mode != -1) {
-        mode = credp->fc_mode;
-    }
-    if (credp->fc_rdev != -1) {
-        rdev = credp->fc_rdev;
-    }
-
-
-    if (uid != -1) {
-        fprintf(fp, "virtfs.uid=%d\n", uid);
-    }
-    if (gid != -1) {
-        fprintf(fp, "virtfs.gid=%d\n", gid);
-    }
-    if (mode != -1) {
-        fprintf(fp, "virtfs.mode=%d\n", mode);
-    }
-    if (rdev != -1) {
-        fprintf(fp, "virtfs.rdev=%d\n", rdev);
-    }
-    fclose(fp);
-
-err_out:
-    g_free(attr_path);
-    return ret;
-}
-
-static int local_set_xattr(const char *path, FsCred *credp)
-{
-    int err;
-
-    if (credp->fc_uid != -1) {
-        uint32_t tmp_uid = cpu_to_le32(credp->fc_uid);
-        err = setxattr(path, "user.virtfs.uid", &tmp_uid, sizeof(uid_t), 0);
-        if (err) {
-            return err;
-        }
-    }
-    if (credp->fc_gid != -1) {
-        uint32_t tmp_gid = cpu_to_le32(credp->fc_gid);
-        err = setxattr(path, "user.virtfs.gid", &tmp_gid, sizeof(gid_t), 0);
-        if (err) {
-            return err;
-        }
-    }
-    if (credp->fc_mode != -1) {
-        uint32_t tmp_mode = cpu_to_le32(credp->fc_mode);
-        err = setxattr(path, "user.virtfs.mode", &tmp_mode, sizeof(mode_t), 0);
-        if (err) {
-            return err;
-        }
-    }
-    if (credp->fc_rdev != -1) {
-        uint64_t tmp_rdev = cpu_to_le64(credp->fc_rdev);
-        err = setxattr(path, "user.virtfs.rdev", &tmp_rdev, sizeof(dev_t), 0);
-        if (err) {
-            return err;
-        }
-    }
-    return 0;
-}
-
 static int local_set_mapped_file_attrat(int dirfd, const char *name,
                                         FsCred *credp)
 {
@@ -516,33 +345,6 @@ static int local_set_xattrat(int dirfd, const char *path, FsCred *credp)
     return 0;
 }
 
-static int local_post_create_passthrough(FsContext *fs_ctx, const char *path,
-                                         FsCred *credp)
-{
-    char *buffer;
-
-    buffer = rpath(fs_ctx, path);
-    if (lchown(buffer, credp->fc_uid, credp->fc_gid) < 0) {
-        /*
-         * If we fail to change ownership and if we are
-         * using security model none. Ignore the error
-         */
-        if ((fs_ctx->export_flags & V9FS_SEC_MASK) != V9FS_SM_NONE) {
-            goto err;
-        }
-    }
-
-    if (chmod(buffer, credp->fc_mode & 07777) < 0) {
-        goto err;
-    }
-
-    g_free(buffer);
-    return 0;
-err:
-    g_free(buffer);
-    return -1;
-}
-
 static int local_set_cred_passthrough(FsContext *fs_ctx, int dirfd,
                                       const char *name, FsCred *credp)
 {
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* Re: [Qemu-devel] [PULL 07/31] 9pfs: introduce relative_openat_nofollow() helper
  2017-02-27 22:59 ` [Qemu-devel] [PULL 07/31] 9pfs: introduce relative_openat_nofollow() helper Greg Kurz
@ 2017-02-27 23:37   ` Eric Blake
  2017-02-28  0:33     ` Greg Kurz
  0 siblings, 1 reply; 40+ messages in thread
From: Eric Blake @ 2017-02-27 23:37 UTC (permalink / raw)
  To: Greg Kurz, qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V

[-- Attachment #1: Type: text/plain, Size: 2413 bytes --]

On 02/27/2017 04:59 PM, Greg Kurz wrote:
> When using the passthrough security mode, symbolic links created by the
> guest are actual symbolic links on the host file system.
> 

Hmm, I just barely started reviewing the series, and see a pull request.
At this point, anything I point out can probably be done as followup
patches rather than forcing a respin of the pull (and soft freeze is
appropriate for that).

> Suggested-by: Jann Horn <jannh@google.com>
> Signed-off-by: Greg Kurz <groug@kaod.org>
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
> (renamed openat_nofollow() to relative_openat_nofollow(),
>  assert path is relative, Greg Kurz)
> Signed-off-by: Greg Kurz <groug@kaod.org>
> ---

> +int relative_openat_nofollow(int dirfd, const char *path, int flags,
> +                             mode_t mode)
> +{
> +    int fd;
> +
> +    assert(path[0] != '/');

If you move this assert...

> +
> +    fd = dup(dirfd);
> +    if (fd == -1) {
> +        return -1;
> +    }
> +
> +    while (*path) {
> +        const char *c;
> +        int next_fd;
> +        char *head;

...here, you can make sure there are no 'a//b' issues to worry about.

> +
> +        head = g_strdup(path);
> +        c = strchr(path, '/');
> +        if (c) {
> +            head[c - path] = 0;
> +            next_fd = openat_dir(fd, head);
> +        } else {
> +            next_fd = openat_file(fd, head, flags, mode);
> +        }
> +        g_free(head);
> +        if (next_fd == -1) {
> +            close_preserve_errno(fd);
> +            return -1;
> +        }
> +        close(fd);
> +        fd = next_fd;
> +
> +        if (!c) {
> +            break;
> +        }
> +        path = c + 1;

or else add an assert here.


> +static inline int openat_file(int dirfd, const char *name, int flags,
> +                              mode_t mode)
> +{
> +    int fd, serrno;
> +
> +    fd = openat(dirfd, name, flags | O_NOFOLLOW | O_NOCTTY | O_NONBLOCK,
> +                mode);
> +    if (fd == -1) {
> +        return -1;
> +    }
> +
> +    serrno = errno;
> +    /* O_NONBLOCK was only needed to open the file. Let's drop it. */
> +    assert(!fcntl(fd, F_SETFL, flags));

Ewww. Side effect inside an assert().  :(

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (30 preceding siblings ...)
  2017-02-27 23:00 ` [Qemu-devel] [PULL 31/31] 9pfs: local: drop unused code Greg Kurz
@ 2017-02-27 23:41 ` no-reply
  2017-02-28  0:00 ` no-reply
  2017-02-28  0:37 ` Greg Kurz
  33 siblings, 0 replies; 40+ messages in thread
From: no-reply @ 2017-02-27 23:41 UTC (permalink / raw)
  To: groug; +Cc: famz, qemu-devel, peter.maydell, aneesh.kumar

Hi,

This series seems to have some coding style problems. See output below for
more information:

Message-id: 1488236421-30983-1-git-send-email-groug@kaod.org
Type: series
Subject: [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze

=== TEST SCRIPT BEGIN ===
#!/bin/bash

BASE=base
n=1
total=$(git log --oneline $BASE.. | wc -l)
failed=0

# Useful git options
git config --local diff.renamelimit 0
git config --local diff.renames True

commits="$(git log --format=%H --reverse $BASE..)"
for c in $commits; do
    echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..."
    if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then
        failed=1
        echo
    fi
    n=$((n+1))
done

exit $failed
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 - [tag update]      patchew/1488145424-14974-1-git-send-email-armbru@redhat.com -> patchew/1488145424-14974-1-git-send-email-armbru@redhat.com
 * [new tag]         patchew/1488236421-30983-1-git-send-email-groug@kaod.org -> patchew/1488236421-30983-1-git-send-email-groug@kaod.org
 - [tag update]      patchew/cover.1488220970.git.jcody@redhat.com -> patchew/cover.1488220970.git.jcody@redhat.com
Switched to a new branch 'test'
f9b5a13 9pfs: local: drop unused code
cf1b63c 9pfs: local: open2: don't follow symlinks
9641242 9pfs: local: mkdir: don't follow symlinks
c3d9755 9pfs: local: mknod: don't follow symlinks
b0d698e 9pfs: local: symlink: don't follow symlinks
39fb819 9pfs: local: chown: don't follow symlinks
7462d9b 9pfs: local: chmod: don't follow symlinks
1e81f57 9pfs: local: link: don't follow symlinks
c24ccea 9pfs: local: improve error handling in link op
209a38b 9pfs: local: rename: use renameat
380a282 9pfs: local: renameat: don't follow symlinks
ba0f22c 9pfs: local: lstat: don't follow symlinks
4a0220b 9pfs: local: readlink: don't follow symlinks
a7c6dfc 9pfs: local: truncate: don't follow symlinks
9f617aa 9pfs: local: statfs: don't follow symlinks
990635a 9pfs: local: utimensat: don't follow symlinks
4244a9a 9pfs: local: remove: don't follow symlinks
152b2c9 9pfs: local: unlinkat: don't follow symlinks
3c5a97f 9pfs: local: lremovexattr: don't follow symlinks
24bdcad 9pfs: local: lsetxattr: don't follow symlinks
3d2628d 9pfs: local: llistxattr: don't follow symlinks
64eb4cf 9pfs: local: lgetxattr: don't follow symlinks
c9bebb7 9pfs: local: open/opendir: don't follow symlinks
05e374b 9pfs: local: keep a file descriptor on the shared folder
b6f4c75 9pfs: introduce relative_openat_nofollow() helper
68e34e0 9pfs: remove side-effects in local_open() and local_opendir()
19ee4dc 9pfs: remove side-effects in local_init()
e68cedb 9pfs: local: move xattr security ops to 9p-xattr.c
7bc1cc1 throttle: factor out duplicate code
17d2a01 fsdev: add IO throttle support to fsdev devices
563e39a 9pfs: fix v9fs_lock error case

=== OUTPUT BEGIN ===
Checking PATCH 1/31: 9pfs: fix v9fs_lock error case...
Checking PATCH 2/31: fsdev: add IO throttle support to fsdev devices...
Checking PATCH 3/31: throttle: factor out duplicate code...
ERROR: Macros with multiple statements should be enclosed in a do - while loop
#235: FILE: include/qemu/throttle-options.h:13:
+#define THROTTLE_OPTS \
+          { \
+            .name = "throttling.iops-total",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit total I/O operations per second",\
+        },{ \
+            .name = "throttling.iops-read",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit read operations per second",\
+        },{ \
+            .name = "throttling.iops-write",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit write operations per second",\
+        },{ \
+            .name = "throttling.bps-total",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit total bytes per second",\
+        },{ \
+            .name = "throttling.bps-read",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit read bytes per second",\
+        },{ \
+            .name = "throttling.bps-write",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "limit write bytes per second",\
+        },{ \
+            .name = "throttling.iops-total-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "I/O operations burst",\
+        },{ \
+            .name = "throttling.iops-read-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "I/O operations read burst",\
+        },{ \
+            .name = "throttling.iops-write-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "I/O operations write burst",\
+        },{ \
+            .name = "throttling.bps-total-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "total bytes burst",\
+        },{ \
+            .name = "throttling.bps-read-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "total bytes read burst",\
+        },{ \
+            .name = "throttling.bps-write-max",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "total bytes write burst",\
+        },{ \
+            .name = "throttling.iops-total-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the iops-total-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.iops-read-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the iops-read-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.iops-write-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the iops-write-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.bps-total-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the bps-total-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.bps-read-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the bps-read-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.bps-write-max-length",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "length of the bps-write-max burst period, in seconds",\
+        },{ \
+            .name = "throttling.iops-size",\
+            .type = QEMU_OPT_NUMBER,\
+            .help = "when limiting by iops max size of an I/O in bytes",\
+        }

total: 1 errors, 0 warnings, 280 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

Checking PATCH 4/31: 9pfs: local: move xattr security ops to 9p-xattr.c...
Checking PATCH 5/31: 9pfs: remove side-effects in local_init()...
Checking PATCH 6/31: 9pfs: remove side-effects in local_open() and local_opendir()...
Checking PATCH 7/31: 9pfs: introduce relative_openat_nofollow() helper...
Checking PATCH 8/31: 9pfs: local: keep a file descriptor on the shared folder...
Checking PATCH 9/31: 9pfs: local: open/opendir: don't follow symlinks...
Checking PATCH 10/31: 9pfs: local: lgetxattr: don't follow symlinks...
Checking PATCH 11/31: 9pfs: local: llistxattr: don't follow symlinks...
Checking PATCH 12/31: 9pfs: local: lsetxattr: don't follow symlinks...
Checking PATCH 13/31: 9pfs: local: lremovexattr: don't follow symlinks...
Checking PATCH 14/31: 9pfs: local: unlinkat: don't follow symlinks...
Checking PATCH 15/31: 9pfs: local: remove: don't follow symlinks...
Checking PATCH 16/31: 9pfs: local: utimensat: don't follow symlinks...
Checking PATCH 17/31: 9pfs: local: statfs: don't follow symlinks...
Checking PATCH 18/31: 9pfs: local: truncate: don't follow symlinks...
Checking PATCH 19/31: 9pfs: local: readlink: don't follow symlinks...
Checking PATCH 20/31: 9pfs: local: lstat: don't follow symlinks...
Checking PATCH 21/31: 9pfs: local: renameat: don't follow symlinks...
Checking PATCH 22/31: 9pfs: local: rename: use renameat...
Checking PATCH 23/31: 9pfs: local: improve error handling in link op...
Checking PATCH 24/31: 9pfs: local: link: don't follow symlinks...
Checking PATCH 25/31: 9pfs: local: chmod: don't follow symlinks...
Checking PATCH 26/31: 9pfs: local: chown: don't follow symlinks...
Checking PATCH 27/31: 9pfs: local: symlink: don't follow symlinks...
Checking PATCH 28/31: 9pfs: local: mknod: don't follow symlinks...
Checking PATCH 29/31: 9pfs: local: mkdir: don't follow symlinks...
Checking PATCH 30/31: 9pfs: local: open2: don't follow symlinks...
Checking PATCH 31/31: 9pfs: local: drop unused code...
=== OUTPUT END ===

Test command exited with code: 1


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (31 preceding siblings ...)
  2017-02-27 23:41 ` [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze no-reply
@ 2017-02-28  0:00 ` no-reply
  2017-02-28  0:36   ` Greg Kurz
  2017-02-28  0:37 ` Greg Kurz
  33 siblings, 1 reply; 40+ messages in thread
From: no-reply @ 2017-02-28  0:00 UTC (permalink / raw)
  To: groug; +Cc: famz, qemu-devel, peter.maydell, aneesh.kumar

Hi,

This series failed build test on s390x host. Please find the details below.

Type: series
Subject: [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze
Message-id: 1488236421-30983-1-git-send-email-groug@kaod.org

=== TEST SCRIPT BEGIN ===
#!/bin/bash
# Testing script will be invoked under the git checkout with
# HEAD pointing to a commit that has the patches applied on top of "base"
# branch
set -e
echo "=== ENV ==="
env
echo "=== PACKAGES ==="
rpm -qa
echo "=== TEST BEGIN ==="
CC=$HOME/bin/cc
INSTALL=$PWD/install
BUILD=/var/tmp/patchew-qemu-build
echo -n "Using CC: "
realpath $CC
test -e $BUILD && rm -rf $BUILD
mkdir -p $BUILD $INSTALL
SRC=$PWD
cd $BUILD
$SRC/configure --cc=$CC --prefix=$INSTALL
make -j4
make check -j4
make install
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 - [tag update]      patchew/1488236421-30983-1-git-send-email-groug@kaod.org -> patchew/1488236421-30983-1-git-send-email-groug@kaod.org
Switched to a new branch 'test'
07c3d33 9pfs: local: drop unused code
5ce7d8c 9pfs: local: open2: don't follow symlinks
aa37460 9pfs: local: mkdir: don't follow symlinks
a0173b8 9pfs: local: mknod: don't follow symlinks
69b7736 9pfs: local: symlink: don't follow symlinks
3e4489d 9pfs: local: chown: don't follow symlinks
c485ffa 9pfs: local: chmod: don't follow symlinks
86eeb62 9pfs: local: link: don't follow symlinks
85f4b20 9pfs: local: improve error handling in link op
b464899 9pfs: local: rename: use renameat
6b56008 9pfs: local: renameat: don't follow symlinks
08500f7 9pfs: local: lstat: don't follow symlinks
939b750 9pfs: local: readlink: don't follow symlinks
def2b5c 9pfs: local: truncate: don't follow symlinks
3590fd1 9pfs: local: statfs: don't follow symlinks
16cd7bf 9pfs: local: utimensat: don't follow symlinks
88b8a10 9pfs: local: remove: don't follow symlinks
0f81ee9 9pfs: local: unlinkat: don't follow symlinks
6dc3122 9pfs: local: lremovexattr: don't follow symlinks
ae5edcc 9pfs: local: lsetxattr: don't follow symlinks
2d68506 9pfs: local: llistxattr: don't follow symlinks
6ac09e6 9pfs: local: lgetxattr: don't follow symlinks
4e29bb4 9pfs: local: open/opendir: don't follow symlinks
f377113 9pfs: local: keep a file descriptor on the shared folder
5b8c8e3 9pfs: introduce relative_openat_nofollow() helper
11557d4 9pfs: remove side-effects in local_open() and local_opendir()
3cf5912 9pfs: remove side-effects in local_init()
9835545 9pfs: local: move xattr security ops to 9p-xattr.c
d462443 throttle: factor out duplicate code
8273ae8 fsdev: add IO throttle support to fsdev devices
48bdc6e 9pfs: fix v9fs_lock error case

=== OUTPUT BEGIN ===
=== ENV ===
XDG_SESSION_ID=40003
SHELL=/bin/sh
USER=fam
PATCHEW=/home/fam/patchew/patchew-cli -s http://patchew.org --nodebug
PATH=/usr/bin:/bin
PWD=/var/tmp/patchew-tester-tmp-g8vh4imz/src
LANG=en_US.UTF-8
HOME=/home/fam
SHLVL=2
LOGNAME=fam
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1012/bus
XDG_RUNTIME_DIR=/run/user/1012
_=/usr/bin/env
=== PACKAGES ===
gpg-pubkey-873529b8-54e386ff
xz-libs-5.2.2-2.fc24.s390x
libacl-2.2.52-11.fc24.s390x
libxshmfence-1.2-3.fc24.s390x
cdparanoia-libs-10.2-21.fc24.s390x
ustr-1.0.4-21.fc24.s390x
giflib-4.1.6-15.fc24.s390x
libusb-0.1.5-7.fc24.s390x
trousers-lib-0.3.13-6.fc24.s390x
readline-devel-6.3-8.fc24.s390x
python-srpm-macros-3-10.fc25.noarch
ncurses-base-6.0-6.20160709.fc25.noarch
gmp-6.1.1-1.fc25.s390x
chkconfig-1.8-1.fc25.s390x
libidn-1.33-1.fc25.s390x
file-5.28-4.fc25.s390x
slang-2.3.0-7.fc25.s390x
avahi-libs-0.6.32-4.fc25.s390x
libsemanage-2.5-8.fc25.s390x
perl-Unicode-Normalize-1.25-365.fc25.s390x
perl-libnet-3.10-1.fc25.noarch
perl-Thread-Queue-3.11-1.fc25.noarch
perl-podlators-4.09-1.fc25.noarch
jasper-libs-1.900.13-1.fc25.s390x
graphite2-1.3.6-1.fc25.s390x
libblkid-2.28.2-1.fc25.s390x
pkgconfig-0.29.1-1.fc25.s390x
dbus-python-1.2.4-2.fc25.s390x
alsa-lib-1.1.1-2.fc25.s390x
libgnome-keyring-3.12.0-7.fc25.s390x
yum-metadata-parser-1.1.4-17.fc25.s390x
python3-3.5.2-4.fc25.s390x
python3-slip-dbus-0.6.4-4.fc25.noarch
python2-cssselect-0.9.2-1.fc25.noarch
python-backports-1.0-8.fc25.s390x
python-magic-5.28-4.fc25.noarch
python-pycparser-2.14-7.fc25.noarch
python-fedora-0.8.0-2.fc25.noarch
createrepo_c-libs-0.10.0-6.fc25.s390x
initscripts-9.69-1.fc25.s390x
plymouth-scripts-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
cronie-1.5.1-2.fc25.s390x
python2-librepo-1.7.18-3.fc25.s390x
wget-1.18-2.fc25.s390x
python3-dnf-plugins-core-0.1.21-4.fc25.noarch
at-spi2-core-2.22.0-1.fc25.s390x
libXv-1.0.11-1.fc25.s390x
dhcp-client-4.3.5-1.fc25.s390x
python2-dnf-plugins-core-0.1.21-4.fc25.noarch
parted-3.2-21.fc25.s390x
python2-ndg_httpsclient-0.4.0-4.fc25.noarch
bash-completion-2.4-1.fc25.noarch
btrfs-progs-4.6.1-1.fc25.s390x
texinfo-6.1-3.fc25.s390x
perl-Filter-1.55-366.fc25.s390x
flex-2.6.0-3.fc25.s390x
libgcc-6.3.1-1.fc25.s390x
glib2-2.50.2-1.fc25.s390x
dbus-libs-1.11.8-1.fc25.s390x
libgomp-6.3.1-1.fc25.s390x
colord-libs-1.3.4-1.fc25.s390x
perl-Encode-2.88-5.fc25.s390x
gstreamer1-1.10.2-1.fc25.s390x
cracklib-2.9.6-4.fc25.s390x
rpm-build-libs-4.13.0-6.fc25.s390x
libobjc-6.3.1-1.fc25.s390x
pcre-devel-8.40-1.fc25.s390x
mariadb-config-10.1.20-1.fc25.s390x
gcc-6.3.1-1.fc25.s390x
mesa-libGL-13.0.3-1.fc25.s390x
python3-dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch
bind-libs-9.10.4-4.P5.fc25.s390x
python-osbs-client-0.33-3.fc25.noarch
NetworkManager-1.4.4-3.fc25.s390x
audit-2.7.1-1.fc25.s390x
glibc-static-2.24-4.fc25.s390x
perl-Pod-Simple-3.35-1.fc25.noarch
gdb-7.12-36.fc25.s390x
python2-simplejson-3.10.0-1.fc25.s390x
python3-sssdconfig-1.14.2-2.fc25.noarch
texlive-lib-2016-30.20160520.fc25.s390x
boost-random-1.60.0-10.fc25.s390x
brltty-5.4-2.fc25.s390x
libref_array-0.1.5-29.fc25.s390x
librados2-10.2.4-2.fc25.s390x
gnutls-dane-3.5.8-1.fc25.s390x
systemtap-client-3.1-0.20160725git91bfb36.fc25.s390x
libXrender-devel-0.9.10-1.fc25.s390x
libXi-devel-1.7.8-2.fc25.s390x
texlive-pdftex-doc-svn41149-30.fc25.noarch
tcp_wrappers-7.6-83.fc25.s390x
javapackages-tools-4.7.0-6.1.fc25.noarch
texlive-kpathsea-bin-svn40473-30.20160520.fc25.s390x
texlive-url-svn32528.3.4-30.fc25.noarch
texlive-latex-fonts-svn28888.0-30.fc25.noarch
texlive-mptopdf-bin-svn18674.0-30.20160520.fc25.noarch
texlive-underscore-svn18261.0-30.fc25.noarch
texlive-subfig-svn15878.1.3-30.fc25.noarch
texlive-dvipdfmx-def-svn40328-30.fc25.noarch
texlive-plain-svn40274-30.fc25.noarch
texlive-texlive-scripts-svn41433-30.fc25.noarch
texlive-fancyref-svn15878.0.9c-30.fc25.noarch
texlive-csquotes-svn39538-30.fc25.noarch
texlive-pxfonts-svn15878.0-30.fc25.noarch
texlive-cite-svn36428.5.5-30.fc25.noarch
texlive-section-svn20180.0-30.fc25.noarch
texlive-pslatex-svn16416.0-30.fc25.noarch
texlive-tex-gyre-math-svn41264-30.fc25.noarch
texlive-knuth-local-svn38627-30.fc25.noarch
texlive-type1cm-svn21820.0-30.fc25.noarch
texlive-finstrut-svn21719.0.5-30.fc25.noarch
texlive-ucharcat-svn38907-30.fc25.noarch
texlive-environ-svn33821.0.3-30.fc25.noarch
texlive-eso-pic-svn37925.2.0g-30.fc25.noarch
texlive-filehook-svn24280.0.5d-30.fc25.noarch
texlive-luatexbase-svn38550-30.fc25.noarch
texlive-pst-text-svn15878.1.00-30.fc25.noarch
texlive-pst-tree-svn24142.1.12-30.fc25.noarch
texlive-latex-bin-bin-svn14050.0-30.20160520.fc25.noarch
texlive-metalogo-svn18611.0.12-30.fc25.noarch
texlive-cm-super-svn15878.0-30.fc25.noarch
texlive-xetex-svn41438-30.fc25.noarch
keyutils-1.5.9-8.fc24.s390x
libcephfs_jni1-10.2.4-2.fc25.s390x
libcom_err-devel-1.43.3-1.fc25.s390x
mesa-libGLES-devel-13.0.3-1.fc25.s390x
graphite2-devel-1.3.6-1.fc25.s390x
nettle-devel-3.3-1.fc25.s390x
lzo-minilzo-2.08-8.fc24.s390x
bzip2-devel-1.0.6-21.fc25.s390x
libusbx-devel-1.0.21-1.fc25.s390x
SDL2-devel-2.0.5-2.fc25.s390x
virglrenderer-devel-0.5.0-1.20160411git61846f92f.fc25.s390x
glib2-static-2.50.2-1.fc25.s390x
mesa-libgbm-devel-13.0.3-1.fc25.s390x
acpica-tools-20160831-1.fc25.s390x
gdk-pixbuf2-2.36.4-1.fc25.s390x
nss-softokn-3.28.1-1.0.fc25.s390x
python3-dnf-1.1.10-5.fc25.noarch
python-gluster-3.9.1-1.fc25.noarch
perl-IO-1.36-382.fc25.s390x
glusterfs-devel-3.9.1-1.fc25.s390x
gtk3-3.22.7-1.fc25.s390x
vim-enhanced-8.0.206-1.fc25.s390x
nss-tools-3.28.1-1.3.fc25.s390x
libmicrohttpd-0.9.52-1.fc25.s390x
gpg-pubkey-a29cb19c-53bcbba6
libaio-0.3.110-6.fc24.s390x
m4-1.4.17-9.fc24.s390x
libfontenc-1.1.3-3.fc24.s390x
lzo-2.08-8.fc24.s390x
isl-0.14-5.fc24.s390x
libXau-1.0.8-6.fc24.s390x
liblockfile-1.09-4.fc24.s390x
linux-atm-libs-2.5.1-14.fc24.s390x
sg3_utils-1.41-3.fc24.s390x
libXext-1.3.3-4.fc24.s390x
libXinerama-1.1.3-6.fc24.s390x
libXxf86vm-1.1.4-3.fc24.s390x
libXft-2.3.2-4.fc24.s390x
ykpers-1.17.3-2.fc24.s390x
bison-3.0.4-4.fc24.s390x
perl-srpm-macros-1-20.fc25.noarch
gawk-4.1.3-8.fc25.s390x
tcp_wrappers-libs-7.6-83.fc25.s390x
libwayland-client-1.12.0-1.fc25.s390x
iptables-1.6.0-2.fc25.s390x
perl-Exporter-5.72-366.fc25.noarch
perl-Text-Tabs+Wrap-2013.0523-365.fc25.noarch
perl-Error-0.17024-7.fc25.noarch
perl-Term-Cap-1.17-365.fc25.noarch
perl-version-0.99.17-1.fc25.s390x
perl-Pod-Usage-1.69-1.fc25.noarch
fftw-libs-double-3.3.5-3.fc25.s390x
device-mapper-persistent-data-0.6.3-1.fc25.s390x
krb5-libs-1.14.4-4.fc25.s390x
system-python-libs-3.5.2-4.fc25.s390x
net-snmp-libs-5.7.3-13.fc25.s390x
libssh2-1.8.0-1.fc25.s390x
libgusb-0.2.9-1.fc25.s390x
ModemManager-glib-1.6.4-1.fc25.s390x
python3-six-1.10.0-3.fc25.noarch
newt-python3-0.52.19-2.fc25.s390x
python3-pysocks-1.5.6-5.fc25.noarch
python-chardet-2.3.0-1.fc25.noarch
python-munch-2.0.4-3.fc25.noarch
python2-cffi-1.7.0-2.fc25.s390x
python-bugzilla-1.2.2-4.fc25.noarch
openldap-2.4.44-2.fc25.s390x
libedit-3.1-16.20160618cvs.fc25.s390x
gc-devel-7.4.4-1.fc25.s390x
python-pycurl-7.43.0-4.fc25.s390x
createrepo_c-0.10.0-6.fc25.s390x
plymouth-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
device-mapper-multipath-libs-0.4.9-83.fc25.s390x
ebtables-2.0.10-21.fc25.s390x
python3-librepo-1.7.18-3.fc25.s390x
libwmf-lite-0.2.8.4-49.fc25.s390x
net-snmp-5.7.3-13.fc25.s390x
yum-3.4.3-510.fc25.noarch
dnf-plugins-core-0.1.21-4.fc25.noarch
at-spi2-atk-2.22.0-1.fc25.s390x
ImageMagick-libs-6.9.3.0-3.fc25.s390x
dhcp-common-4.3.5-1.fc25.noarch
kernel-modules-4.8.8-300.fc25.s390x
dracut-config-rescue-044-78.fc25.s390x
sendmail-8.15.2-7.fc25.s390x
avahi-autoipd-0.6.32-4.fc25.s390x
teamd-1.26-1.fc25.s390x
kernel-devel-4.8.8-300.fc25.s390x
mozjs17-17.0.0-16.fc25.s390x
libselinux-2.5-13.fc25.s390x
libcrypt-nss-2.24-4.fc25.s390x
systemd-libs-231-12.fc25.s390x
libgo-6.3.1-1.fc25.s390x
libgo-devel-6.3.1-1.fc25.s390x
NetworkManager-libnm-1.4.4-3.fc25.s390x
cpp-6.3.1-1.fc25.s390x
rpm-plugin-selinux-4.13.0-6.fc25.s390x
pcre-utf32-8.40-1.fc25.s390x
packagedb-cli-2.14-1.fc25.noarch
python2-pyparsing-2.1.10-1.fc25.noarch
glibc-devel-2.24-4.fc25.s390x
libdrm-2.4.74-1.fc25.s390x
kernel-modules-4.9.3-200.fc25.s390x
cairo-gobject-1.14.8-1.fc25.s390x
bind99-license-9.9.9-4.P5.fc25.noarch
pyrpkg-1.47-5.fc25.noarch
emacs-25.1-3.fc25.s390x
firewalld-0.4.4.2-2.fc25.noarch
pyparsing-2.1.10-1.fc25.noarch
kernel-devel-4.9.3-200.fc25.s390x
libproxy-0.4.14-1.fc25.s390x
ethtool-4.8-1.fc25.s390x
python3-pyparsing-2.1.10-1.fc25.noarch
xorg-x11-proto-devel-7.7-20.fc25.noarch
brlapi-0.6.5-2.fc25.s390x
libcollection-0.7.0-29.fc25.s390x
librados-devel-10.2.4-2.fc25.s390x
libcephfs-devel-10.2.4-2.fc25.s390x
libXdamage-devel-1.1.4-8.fc24.s390x
libXinerama-devel-1.1.3-6.fc24.s390x
quota-4.03-7.fc25.s390x
texlive-texlive-common-doc-svn40682-30.fc25.noarch
texlive-metafont-bin-svn40987-30.20160520.fc25.s390x
texlive-ifluatex-svn41346-30.fc25.noarch
texlive-dvips-bin-svn40987-30.20160520.fc25.s390x
texlive-marvosym-svn29349.2.2a-30.fc25.noarch
texlive-graphics-cfg-svn40269-30.fc25.noarch
texlive-carlisle-svn18258.0-30.fc25.noarch
texlive-glyphlist-svn28576.0-30.fc25.noarch
texlive-tex-bin-svn40987-30.20160520.fc25.s390x
texlive-texlive-scripts-bin-svn29741.0-30.20160520.fc25.noarch
texlive-mathtools-svn38833-30.fc25.noarch
texlive-euro-svn22191.1.1-30.fc25.noarch
texlive-palatino-svn31835.0-30.fc25.noarch
texlive-anysize-svn15878.0-30.fc25.noarch
texlive-sansmath-svn17997.1.1-30.fc25.noarch
texlive-mfnfss-svn19410.0-30.fc25.noarch
texlive-mathpazo-svn15878.1.003-30.fc25.noarch
texlive-knuth-lib-svn35820.0-30.fc25.noarch
texlive-updmap-map-svn41159-30.fc25.noarch
texlive-beton-svn15878.0-30.fc25.noarch
texlive-xetexconfig-svn41133-30.fc25.noarch
texlive-trimspaces-svn15878.1.1-30.fc25.noarch
texlive-memoir-svn41203-30.fc25.noarch
texlive-latex-svn40218-30.fc25.noarch
texlive-lualatex-math-svn40621-30.fc25.noarch
texlive-pst-grad-svn15878.1.06-30.fc25.noarch
texlive-pst-tools-svn34067.0.05-30.fc25.noarch
texlive-amscls-svn36804.0-30.fc25.noarch
texlive-tex-gyre-svn18651.2.004-30.fc25.noarch
texlive-ltxmisc-svn21927.0-30.fc25.noarch
texlive-xetex-bin-svn41091-30.20160520.fc25.s390x
lua-posix-33.3.1-3.fc25.s390x
gssproxy-0.5.1-3.fc25.s390x
java-1.8.0-openjdk-1.8.0.111-5.b16.fc25.s390x
libverto-devel-0.2.6-6.fc24.s390x
mesa-libGLES-13.0.3-1.fc25.s390x
p11-kit-devel-0.23.2-2.fc24.s390x
snappy-1.1.3-2.fc24.s390x
gnutls-devel-3.5.8-1.fc25.s390x
cairo-gobject-devel-1.14.8-1.fc25.s390x
usbredir-devel-0.7.1-2.fc24.s390x
systemtap-3.1-0.20160725git91bfb36.fc25.s390x
bluez-libs-devel-5.43-1.fc25.s390x
libcurl-devel-7.51.0-4.fc25.s390x
cyrus-sasl-devel-2.1.26-26.2.fc24.s390x
python-libs-2.7.13-1.fc25.s390x
nss-sysinit-3.28.1-1.3.fc25.s390x
dnf-1.1.10-5.fc25.noarch
glusterfs-extra-xlators-3.9.1-1.fc25.s390x
perl-5.24.1-382.fc25.s390x
linux-firmware-20161205-69.git91ddce49.fc25.noarch
libX11-devel-1.6.4-4.fc25.s390x
kernel-devel-4.9.5-200.fc25.s390x
python-devel-2.7.13-1.fc25.s390x
kernel-headers-4.9.5-200.fc25.s390x
gpg-pubkey-efe550f5-5220ba41
python-async-0.6.1-9.fc22.s390x
gpg-pubkey-81b46521-55b3ca9a
dejavu-sans-mono-fonts-2.35-3.fc24.noarch
filesystem-3.2-37.fc24.s390x
popt-1.16-7.fc24.s390x
libffi-3.1-9.fc24.s390x
cyrus-sasl-lib-2.1.26-26.2.fc24.s390x
xz-5.2.2-2.fc24.s390x
keyutils-libs-1.5.9-8.fc24.s390x
libnfnetlink-1.0.1-8.fc24.s390x
libnetfilter_conntrack-1.0.4-6.fc24.s390x
libtheora-1.1.1-14.fc24.s390x
xml-common-0.6.3-44.fc24.noarch
autoconf-2.69-22.fc24.noarch
libpipeline-1.4.1-2.fc24.s390x
libXt-1.1.5-3.fc24.s390x
kbd-legacy-2.0.3-3.fc24.noarch
ghostscript-fonts-5.50-35.fc24.noarch
libcroco-0.6.11-2.fc24.s390x
pinentry-0.9.7-2.fc24.s390x
libXevie-1.0.3-11.fc24.s390x
pth-2.0.7-27.fc24.s390x
python2-rpm-macros-3-10.fc25.noarch
libsepol-2.5-10.fc25.s390x
libcap-2.25-2.fc25.s390x
sqlite-libs-3.14.2-1.fc25.s390x
mpfr-3.1.5-1.fc25.s390x
libxcb-1.12-1.fc25.s390x
libicu-57.1-4.fc25.s390x
perl-Carp-1.40-365.fc25.noarch
perl-IO-Socket-IP-0.38-1.fc25.noarch
libmnl-1.0.4-1.fc25.s390x
perl-Unicode-EastAsianWidth-1.33-8.fc25.noarch
perl-Getopt-Long-2.49.1-1.fc25.noarch
libwayland-cursor-1.12.0-1.fc25.s390x
coreutils-common-8.25-15.fc25.s390x
libmount-2.28.2-1.fc25.s390x
python2-decorator-4.0.10-3.fc25.noarch
avahi-glib-0.6.32-4.fc25.s390x
python3-pip-8.1.2-2.fc25.noarch
python3-libcomps-0.1.7-5.fc25.s390x
python-slip-0.6.4-4.fc25.noarch
python-krbV-1.0.90-12.fc25.s390x
python2-libcomps-0.1.7-5.fc25.s390x
python2-urllib3-1.15.1-3.fc25.noarch
fipscheck-1.4.1-11.fc25.s390x
gc-7.4.4-1.fc25.s390x
libndp-1.6-1.fc25.s390x
libsolv-0.6.24-1.fc25.s390x
gnupg2-2.1.13-2.fc25.s390x
geoclue2-2.4.4-1.fc25.s390x
s390utils-cmsfs-1.36.0-1.fc25.s390x
libXfixes-5.0.3-1.fc25.s390x
libXi-1.7.8-2.fc25.s390x
adwaita-icon-theme-3.22.0-1.fc25.noarch
dconf-0.26.0-1.fc25.s390x
ncurses-devel-6.0-6.20160709.fc25.s390x
newt-python-0.52.19-2.fc25.s390x
perl-Test-Harness-3.36-367.fc25.noarch
valgrind-3.12.0-1.fc25.s390x
dejagnu-1.6-1.fc25.noarch
audit-libs-2.7.1-1.fc25.s390x
libstdc++-devel-6.3.1-1.fc25.s390x
emacs-filesystem-25.1-3.fc25.noarch
libdb-utils-5.3.28-16.fc25.s390x
libidn2-0.11-1.fc25.s390x
python3-rpm-4.13.0-6.fc25.s390x
gnutls-3.5.8-1.fc25.s390x
python-beautifulsoup4-4.5.3-1.fc25.noarch
qt5-srpm-macros-5.7.1-1.fc25.noarch
elfutils-default-yama-scope-0.168-1.fc25.noarch
device-mapper-1.02.136-3.fc25.s390x
device-mapper-event-1.02.136-3.fc25.s390x
systemd-container-231-12.fc25.s390x
python3-distro-1.0.1-2.fc25.noarch
fedpkg-1.26-4.fc25.noarch
gstreamer1-plugins-base-1.10.2-1.fc25.s390x
subversion-1.9.5-1.fc25.s390x
perl-Module-CoreList-5.20170115-1.fc25.noarch
perl-Class-Inspector-1.31-2.fc25.noarch
libtool-ltdl-2.4.6-13.fc25.s390x
python2-sssdconfig-1.14.2-2.fc25.noarch
glib2-devel-2.50.2-1.fc25.s390x
poppler-0.45.0-2.fc25.s390x
libbasicobjects-0.1.1-29.fc25.s390x
libevent-2.0.22-1.fc25.s390x
libradosstriper1-10.2.4-2.fc25.s390x
atk-devel-2.22.0-1.fc25.s390x
libXxf86vm-devel-1.1.4-3.fc24.s390x
libev-4.24-1.fc25.s390x
gsm-1.0.16-1.fc25.s390x
libnfsidmap-0.27-0.fc25.s390x
zziplib-0.13.62-7.fc24.s390x
texlive-metafont-svn40793-30.fc25.noarch
texlive-booktabs-svn40846-30.fc25.noarch
texlive-dvips-svn41149-30.fc25.noarch
texlive-zapfding-svn31835.0-30.fc25.noarch
texlive-graphics-svn41015-30.fc25.noarch
texlive-latexconfig-svn40274-30.fc25.noarch
texlive-gsftopk-bin-svn40473-30.20160520.fc25.s390x
texlive-tex-svn40793-30.fc25.noarch
texlive-xdvi-bin-svn40750-30.20160520.fc25.s390x
texlive-qstest-svn15878.0-30.fc25.noarch
texlive-avantgar-svn31835.0-30.fc25.noarch
texlive-ncntrsbk-svn31835.0-30.fc25.noarch
texlive-cm-svn32865.0-30.fc25.noarch
texlive-rcs-svn15878.0-30.fc25.noarch
texlive-fix2col-svn38770-30.fc25.noarch
texlive-lm-math-svn36915.1.959-30.fc25.noarch
texlive-hyphen-base-svn41138-30.fc25.noarch
texlive-unicode-data-svn39808-30.fc25.noarch
texlive-luatex-svn40963-30.fc25.noarch
texlive-xetex-def-svn40327-30.fc25.noarch
texlive-varwidth-svn24104.0.92-30.fc25.noarch
texlive-l3kernel-svn41246-30.fc25.noarch
texlive-hyperref-svn41396-30.fc25.noarch
texlive-unicode-math-svn38462-30.fc25.noarch
texlive-fancyvrb-svn18492.2.8-30.fc25.noarch
texlive-pst-plot-svn41242-30.fc25.noarch
texlive-rotating-svn16832.2.16b-30.fc25.noarch
texlive-pdfpages-svn40638-30.fc25.noarch
texlive-ae-svn15878.1.4-30.fc25.noarch
libpaper-1.1.24-12.fc24.s390x
texlive-collection-latexrecommended-svn35765.0-30.20160520.fc25.noarch
libini_config-1.3.0-29.fc25.s390x
xorg-x11-fonts-Type1-7.5-16.fc24.noarch
pcre2-devel-10.22-8.fc25.s390x
gnutls-c++-3.5.8-1.fc25.s390x
systemtap-devel-3.1-0.20160725git91bfb36.fc25.s390x
libtasn1-devel-4.10-1.fc25.s390x
pango-devel-1.40.3-1.fc25.s390x
vte291-devel-0.46.1-1.fc25.s390x
snappy-devel-1.1.3-2.fc24.s390x
brlapi-devel-0.6.5-2.fc25.s390x
man-pages-4.06-3.fc25.noarch
libcap-ng-devel-0.7.8-1.fc25.s390x
glusterfs-3.9.1-1.fc25.s390x
nss-util-devel-3.28.1-1.0.fc25.s390x
dnf-conf-1.1.10-5.fc25.noarch
libxkbcommon-devel-0.7.1-1.fc25.s390x
perl-macros-5.24.1-382.fc25.s390x
rpcbind-0.2.4-2.fc25.s390x
pulseaudio-libs-10.0-2.fc25.s390x
kernel-4.9.5-200.fc25.s390x
libnl3-cli-3.2.29-2.fc25.s390x
tzdata-2016j-2.fc25.noarch
gpg-pubkey-34ec9cba-54e38751
gpg-pubkey-030d5aed-55b577f0
basesystem-11-2.fc24.noarch
libattr-2.4.47-16.fc24.s390x
libmpc-1.0.2-5.fc24.s390x
apr-util-1.5.4-3.fc24.s390x
rsync-3.1.2-2.fc24.s390x
libunistring-0.9.4-3.fc24.s390x
jbigkit-libs-2.1-5.fc24.s390x
pixman-0.34.0-2.fc24.s390x
acl-2.2.52-11.fc24.s390x
dwz-0.12-2.fc24.s390x
expect-5.45-22.fc24.s390x
libmodman-2.0.1-12.fc24.s390x
libsigsegv-2.10-10.fc24.s390x
libvisual-0.4.0-20.fc24.s390x
fakeroot-libs-1.20.2-4.fc24.s390x
m17n-lib-1.7.0-5.fc24.s390x
libpcap-1.7.4-2.fc24.s390x
libverto-0.2.6-6.fc24.s390x
lsscsi-0.28-3.fc24.s390x
setup-2.10.4-1.fc25.noarch
rpmconf-base-1.0.18-2.fc25.noarch
bash-4.3.43-4.fc25.s390x
expat-2.2.0-1.fc25.s390x
libxml2-2.9.3-4.fc25.s390x
libgpg-error-1.24-1.fc25.s390x
nspr-4.13.1-1.fc25.s390x
libgcrypt-1.6.6-1.fc25.s390x
file-libs-5.28-4.fc25.s390x
findutils-4.6.0-8.fc25.s390x
libjpeg-turbo-1.5.1-0.fc25.s390x
kmod-23-1.fc25.s390x
libassuan-2.4.3-1.fc25.s390x
libusbx-1.0.21-1.fc25.s390x
newt-0.52.19-2.fc25.s390x
libxslt-1.1.28-13.fc25.s390x
libmetalink-0.1.3-1.fc25.s390x
perl-Socket-2.024-1.fc25.s390x
perl-File-Path-2.12-365.fc25.noarch
perl-MIME-Base64-3.15-365.fc25.s390x
perl-HTTP-Tiny-0.070-1.fc25.noarch
ncurses-6.0-6.20160709.fc25.s390x
libwayland-server-1.12.0-1.fc25.s390x
ipset-6.29-1.fc25.s390x
perl-Text-Unidecode-1.27-3.fc25.noarch
perl-Fedora-VSP-0.001-4.fc25.noarch
perl-libintl-perl-1.26-1.fc25.s390x
plymouth-core-libs-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
hunspell-1.4.1-1.fc25.s390x
which-2.21-1.fc25.s390x
coreutils-8.25-15.fc25.s390x
python2-setuptools-25.1.1-1.fc25.noarch
shadow-utils-4.2.1-11.fc25.s390x
atk-2.22.0-1.fc25.s390x
system-python-3.5.2-4.fc25.s390x
pam-1.3.0-1.fc25.s390x
python2-pyasn1-0.1.9-7.fc25.1.noarch
harfbuzz-icu-1.3.2-1.fc25.s390x
gsettings-desktop-schemas-3.22.0-1.fc25.s390x
libsecret-0.18.5-2.fc25.s390x
s390utils-iucvterm-1.36.0-1.fc25.s390x
python3-setuptools-25.1.1-1.fc25.noarch
python3-decorator-4.0.10-3.fc25.noarch
python3-slip-0.6.4-4.fc25.noarch
python3-magic-5.28-4.fc25.noarch
python3-requests-2.10.0-4.fc25.noarch
python3-systemd-232-1.fc25.s390x
pyusb-1.0.0-2.fc25.noarch
python-slip-dbus-0.6.4-4.fc25.noarch
python-enum34-1.0.4-6.fc25.noarch
python-lockfile-0.11.0-4.fc25.noarch
python2-ply-3.8-2.fc25.noarch
pyOpenSSL-16.0.0-2.fc25.noarch
python2-requests-2.10.0-4.fc25.noarch
pyxattr-0.5.3-8.fc25.s390x
libarchive-3.2.2-1.fc25.s390x
libkadm5-1.14.4-4.fc25.s390x
dtc-1.4.2-1.fc25.s390x
libbabeltrace-1.4.0-3.fc25.s390x
guile-2.0.13-1.fc25.s390x
libthai-0.1.25-1.fc25.s390x
libnghttp2-1.13.0-2.fc25.s390x
deltarpm-3.6-17.fc25.s390x
python-urlgrabber-3.10.1-9.fc25.noarch
iputils-20161105-1.fc25.s390x
s390utils-mon_statd-1.36.0-1.fc25.s390x
cryptsetup-libs-1.7.2-3.fc25.s390x
device-mapper-multipath-0.4.9-83.fc25.s390x
cronie-anacron-1.5.1-2.fc25.s390x
ghostscript-core-9.20-5.fc25.s390x
python3-pygpgme-0.3-18.fc25.s390x
rest-0.8.0-1.fc25.s390x
libreport-filesystem-2.8.0-1.fc25.s390x
libXtst-1.2.3-1.fc25.s390x
iso-codes-3.70-1.fc25.noarch
ghc-srpm-macros-1.4.2-4.fc25.noarch
adwaita-cursor-theme-3.22.0-1.fc25.noarch
rpmdevtools-8.9-1.fc25.noarch
kernel-4.8.8-300.fc25.s390x
python-dnf-plugins-extras-migrate-0.0.12-4.fc25.noarch
s390utils-1.36.0-1.fc25.s390x
authconfig-6.2.10-14.fc25.s390x
fedora-cert-0.6.0.1-1.fc25.noarch
glibc-2.24-4.fc25.s390x
elfutils-libelf-0.168-1.fc25.s390x
libstdc++-6.3.1-1.fc25.s390x
perl-Scalar-List-Utils-1.47-1.fc25.s390x
gdb-headless-7.12-36.fc25.s390x
bzip2-1.0.6-21.fc25.s390x
bind-license-9.10.4-4.P5.fc25.noarch
pcre-cpp-8.40-1.fc25.s390x
perl-threads-2.12-1.fc25.s390x
subversion-libs-1.9.5-1.fc25.s390x
libss-1.43.3-1.fc25.s390x
shared-mime-info-1.8-1.fc25.s390x
libselinux-utils-2.5-13.fc25.s390x
libgfortran-6.3.1-1.fc25.s390x
rpm-4.13.0-6.fc25.s390x
python2-rpm-4.13.0-6.fc25.s390x
policycoreutils-2.5-19.fc25.s390x
libtasn1-4.10-1.fc25.s390x
mesa-libwayland-egl-13.0.3-1.fc25.s390x
pigz-2.3.4-1.fc25.s390x
koji-1.11.0-1.fc25.noarch
python3-enchant-1.6.8-1.fc25.noarch
mariadb-common-10.1.20-1.fc25.s390x
firewalld-filesystem-0.4.4.2-2.fc25.noarch
systemd-231-12.fc25.s390x
device-mapper-libs-1.02.136-3.fc25.s390x
systemd-udev-231-12.fc25.s390x
dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch
mesa-libEGL-13.0.3-1.fc25.s390x
dnsmasq-2.76-2.fc25.s390x
distribution-gpg-keys-1.9-1.fc25.noarch
bind-libs-lite-9.10.4-4.P5.fc25.s390x
mock-1.3.3-1.fc25.noarch
python2-dockerfile-parse-0.0.5-7.fc25.noarch
fedora-packager-0.6.0.1-1.fc25.noarch
openssl-1.0.2j-3.fc25.s390x
lvm2-2.02.167-3.fc25.s390x
systemd-bootchart-231-2.fc25.s390x
gcc-c++-6.3.1-1.fc25.s390x
texlive-base-2016-30.20160520.fc25.noarch
boost-system-1.60.0-10.fc25.s390x
pcre2-10.22-8.fc25.s390x
libpng-devel-1.6.27-1.fc25.s390x
perl-XML-Parser-2.44-5.fc25.s390x
libtirpc-1.0.1-3.rc3.fc25.s390x
lttng-ust-2.8.1-2.fc25.s390x
libasyncns-0.8-10.fc24.s390x
unbound-libs-1.5.10-1.fc25.s390x
libradosstriper-devel-10.2.4-2.fc25.s390x
systemtap-runtime-3.1-0.20160725git91bfb36.fc25.s390x
libXau-devel-1.0.8-6.fc24.s390x
libXfixes-devel-5.0.3-1.fc25.s390x
mesa-libEGL-devel-13.0.3-1.fc25.s390x
libXcomposite-devel-0.4.4-8.fc24.s390x
libverto-libev-0.2.6-6.fc24.s390x
texlive-kpathsea-doc-svn41139-30.fc25.noarch
flac-libs-1.3.2-1.fc25.s390x
quota-nls-4.03-7.fc25.noarch
python3-html5lib-0.999-9.fc25.noarch
python3-javapackages-4.7.0-6.1.fc25.noarch
perl-Digest-1.17-366.fc25.noarch
texlive-texlive.infra-svn41280-30.fc25.noarch
texlive-tetex-svn41059-30.fc25.noarch
texlive-amsfonts-svn29208.3.04-30.fc25.noarch
texlive-etex-pkg-svn39355-30.fc25.noarch
texlive-lm-svn28119.2.004-30.fc25.noarch
texlive-fp-svn15878.0-30.fc25.noarch
texlive-mptopdf-svn41282-30.fc25.noarch
texlive-euler-svn17261.2.5-30.fc25.noarch
texlive-setspace-svn24881.6.7a-30.fc25.noarch
texlive-tools-svn40934-30.fc25.noarch
texlive-colortbl-svn29803.v1.0a-30.fc25.noarch
texlive-natbib-svn20668.8.31b-30.fc25.noarch
texlive-bibtex-svn40768-30.fc25.noarch
texlive-gsftopk-svn40768-30.fc25.noarch
texlive-mfware-svn40768-30.fc25.noarch
texlive-tex-ini-files-svn40533-30.fc25.noarch
texlive-texconfig-bin-svn29741.0-30.20160520.fc25.noarch
libXmu-1.1.2-4.fc24.s390x
libXcursor-1.1.14-6.fc24.s390x
kbd-misc-2.0.3-3.fc24.noarch
libutempter-1.1.6-8.fc24.s390x
python-kitchen-1.2.4-2.fc24.noarch
polkit-libs-0.113-5.fc24.s390x
libgudev-230-3.fc24.s390x
popt-devel-1.16-7.fc24.s390x
make-4.1-5.fc24.s390x
fakeroot-1.20.2-4.fc24.s390x
blktrace-1.1.0-3.fc24.s390x
hicolor-icon-theme-0.15-3.fc24.noarch
usermode-1.111-8.fc24.s390x
kbd-2.0.3-3.fc24.s390x
libaio-devel-0.3.110-6.fc24.s390x
web-assets-filesystem-5-4.fc24.noarch
perl-IO-Socket-SSL-2.038-1.fc25.noarch
python-backports-ssl_match_hostname-3.5.0.1-3.fc25.noarch
mc-4.8.18-2.fc25.s390x
expat-devel-2.2.0-1.fc25.s390x
automake-1.15-7.fc25.noarch
perl-File-ShareDir-1.102-7.fc25.noarch
lua-5.3.3-3.fc25.s390x
tcl-8.6.6-1.fc25.s390x
gcc-objc-6.3.1-1.fc25.s390x
libselinux-devel-2.5-13.fc25.s390x
e2fsprogs-1.43.3-1.fc25.s390x
perl-Storable-2.56-367.fc25.s390x
libstdc++-static-6.3.1-1.fc25.s390x
perl-Time-Local-1.250-1.fc25.noarch
libwebp-0.5.2-1.fc25.s390x
xkeyboard-config-2.19-1.1.fc25.noarch
python-firewall-0.4.4.2-2.fc25.noarch
texlive-xdvi-svn40768-30.fc25.noarch
texlive-wasy2-ps-svn35830.0-30.fc25.noarch
texlive-ltabptch-svn17533.1.74d-30.fc25.noarch
texlive-sauerj-svn15878.0-30.fc25.noarch
texlive-bookman-svn31835.0-30.fc25.noarch
texlive-courier-svn35058.0-30.fc25.noarch
texlive-mflogo-font-svn36898.1.002-30.fc25.noarch
texlive-rsfs-svn15878.0-30.fc25.noarch
texlive-zapfchan-svn31835.0-30.fc25.noarch
texlive-cmap-svn41168-30.fc25.noarch
texlive-parskip-svn19963.2.0-30.fc25.noarch
texlive-sepnum-svn20186.2.0-30.fc25.noarch
texlive-fancyhdr-svn15878.3.1-30.fc25.noarch
texlive-pspicture-svn15878.0-30.fc25.noarch
texlive-fpl-svn15878.1.002-30.fc25.noarch
texlive-utopia-svn15878.0-30.fc25.noarch
texlive-hyph-utf8-svn41189-30.fc25.noarch
texlive-lua-alt-getopt-svn29349.0.7.0-30.fc25.noarch
texlive-texlive-msg-translations-svn41431-30.fc25.noarch
texlive-parallel-svn15878.0-30.fc25.noarch
texlive-luatex-bin-svn41091-30.20160520.fc25.s390x
texlive-lineno-svn21442.4.41-30.fc25.noarch
texlive-kastrup-svn15878.0-30.fc25.noarch
texlive-chngcntr-svn17157.1.0a-30.fc25.noarch
texlive-lualibs-svn40370-30.fc25.noarch
texlive-xunicode-svn30466.0.981-30.fc25.noarch
texlive-l3packages-svn41246-30.fc25.noarch
texlive-pgf-svn40966-30.fc25.noarch
texlive-koma-script-svn41508-30.fc25.noarch
texlive-currfile-svn40725-30.fc25.noarch
texlive-luaotfload-svn40902-30.fc25.noarch
texlive-ifplatform-svn21156.0.4-30.fc25.noarch
texlive-showexpl-svn32737.v0.3l-30.fc25.noarch
texlive-pst-3d-svn17257.1.10-30.fc25.noarch
texlive-pst-node-svn40743-30.fc25.noarch
texlive-pstricks-add-svn40744-30.fc25.noarch
texlive-pst-pdf-svn31660.1.1v-30.fc25.noarch
texlive-latex-bin-svn41438-30.fc25.noarch
texlive-powerdot-svn38984-30.fc25.noarch
texlive-sansmathaccent-svn30187.0-30.fc25.noarch
texlive-typehtml-svn17134.0-30.fc25.noarch
texlive-ucs-svn35853.2.2-30.fc25.noarch
teckit-2.5.1-15.fc24.s390x
texlive-dvipdfmx-svn41149-30.fc25.noarch
texlive-collection-latex-svn41011-30.20160520.fc25.noarch
netpbm-10.76.00-2.fc25.s390x
libpath_utils-0.2.1-29.fc25.s390x
nfs-utils-1.3.4-1.rc3.fc25.s390x
ttmkfdir-3.0.9-48.fc24.s390x
libcephfs_jni-devel-10.2.4-2.fc25.s390x
pcre2-utf16-10.22-8.fc25.s390x
keyutils-libs-devel-1.5.9-8.fc24.s390x
libicu-devel-57.1-4.fc25.s390x
attr-2.4.47-16.fc24.s390x
harfbuzz-devel-1.3.2-1.fc25.s390x
libidn-devel-1.33-1.fc25.s390x
usbredir-0.7.1-2.fc24.s390x
libnfs-1.9.8-2.fc24.s390x
SDL2-2.0.5-2.fc25.s390x
freetype-devel-2.6.5-1.fc25.s390x
cairo-devel-1.14.8-1.fc25.s390x
libepoxy-devel-1.3.1-3.fc25.s390x
libcacard-devel-2.5.2-2.fc24.s390x
lzo-devel-2.08-8.fc24.s390x
libssh2-devel-1.8.0-1.fc25.s390x
pcre-static-8.40-1.fc25.s390x
qemu-sanity-check-nodeps-1.1.5-5.fc24.s390x
libcap-devel-2.25-2.fc25.s390x
alsa-lib-devel-1.1.1-2.fc25.s390x
nss-util-3.28.1-1.0.fc25.s390x
glusterfs-client-xlators-3.9.1-1.fc25.s390x
nss-softokn-freebl-3.28.1-1.0.fc25.s390x
libnl3-3.2.29-2.fc25.s390x
python3-hawkey-0.6.3-6.1.fc25.s390x
git-core-doc-2.9.3-2.fc25.s390x
glusterfs-fuse-3.9.1-1.fc25.s390x
gdk-pixbuf2-devel-2.36.4-1.fc25.s390x
perl-Errno-1.25-382.fc25.s390x
git-2.9.3-2.fc25.s390x
glusterfs-server-3.9.1-1.fc25.s390x
kernel-modules-4.9.5-200.fc25.s390x
pulseaudio-libs-glib2-10.0-2.fc25.s390x
libpsl-0.17.0-1.fc25.s390x
glusterfs-api-devel-3.9.1-1.fc25.s390x
nss-devel-3.28.1-1.3.fc25.s390x
wpa_supplicant-2.6-1.fc25.s390x
xemacs-filesystem-21.5.34-19.20170114hgd0e8ec0fe015.fc25.noarch
opus-1.1.3-2.fc25.s390x
copy-jdk-configs-2.0-1.fc25.noarch
gpg-pubkey-a0a7badb-52844296
fontpackages-filesystem-1.44-17.fc24.noarch
readline-6.3-8.fc24.s390x
cpio-2.12-3.fc24.s390x
groff-base-1.22.3-8.fc24.s390x
ilmbase-2.2.0-5.fc24.s390x
p11-kit-trust-0.23.2-2.fc24.s390x
OpenEXR-libs-2.2.0-5.fc24.s390x
hesiod-3.2.1-6.fc24.s390x
sysfsutils-2.1.0-19.fc24.s390x
qrencode-libs-3.4.2-6.fc24.s390x
GeoIP-1.6.9-2.fc24.s390x
ocaml-srpm-macros-2-4.fc24.noarch
libXcomposite-0.4.4-8.fc24.s390x
procps-ng-3.3.10-11.fc24.s390x
GConf2-3.2.6-16.fc24.s390x
mailx-12.5-19.fc24.s390x
xz-devel-5.2.2-2.fc24.s390x
fedora-logos-22.0.0-3.fc24.s390x
telnet-0.17-65.fc24.s390x
gpg-pubkey-e372e838-56fd7943
fedora-repos-25-1.noarch
ncurses-libs-6.0-6.20160709.fc25.s390x
lua-libs-5.3.3-3.fc25.s390x
kmod-libs-23-1.fc25.s390x
libseccomp-2.3.1-1.fc25.s390x
perl-parent-0.236-1.fc25.noarch
libICE-1.0.9-5.fc25.s390x
ipset-libs-6.29-1.fc25.s390x
perl-TermReadKey-2.37-1.fc25.s390x
dhcp-libs-4.3.5-1.fc25.s390x
gmp-devel-6.1.1-1.fc25.s390x
ncurses-c++-libs-6.0-6.20160709.fc25.s390x
python-pip-8.1.2-2.fc25.noarch
gzip-1.8-1.fc25.s390x
harfbuzz-1.3.2-1.fc25.s390x
python2-iniparse-0.4-20.fc25.noarch
libfdisk-2.28.2-1.fc25.s390x
python3-iniparse-0.4-20.fc25.noarch
python3-gobject-base-3.22.0-1.fc25.s390x
python3-kickstart-2.32-1.fc25.noarch
python2-yubico-1.3.2-3.fc25.noarch
python-idna-2.0-4.fc25.noarch
nss-pem-1.0.2-2.fc25.s390x
perl-Net-SSLeay-1.78-1.fc25.s390x
krb5-workstation-1.14.4-4.fc25.s390x
libepoxy-1.3.1-3.fc25.s390x
drpm-0.3.0-3.fc25.s390x
libsmartcols-2.28.2-1.fc25.s390x
s390utils-ziomon-1.36.0-1.fc25.s390x
librepo-1.7.18-3.fc25.s390x
glib-networking-2.50.0-1.fc25.s390x
librsvg2-2.40.16-2.fc25.s390x
gnat-srpm-macros-4-1.fc25.noarch
webkitgtk3-2.4.11-3.fc25.s390x
libXaw-1.0.13-4.fc25.s390x
sudo-1.8.18p1-1.fc25.s390x
systemtap-sdt-devel-3.1-0.20160725git91bfb36.fc25.s390x
xorg-x11-font-utils-7.5-32.fc25.s390x
python-decoratortools-1.8-12.fc25.noarch
m17n-db-1.7.0-7.fc25.noarch
hardlink-1.1-1.fc25.s390x
glibc-common-2.24-4.fc25.s390x
libcom_err-1.43.3-1.fc25.s390x
grep-2.27-1.fc25.s390x
iproute-4.6.0-6.fc25.s390x
e2fsprogs-libs-1.43.3-1.fc25.s390x
curl-7.51.0-4.fc25.s390x
libvorbis-1.3.5-1.fc25.s390x
python2-dateutil-2.6.0-1.fc25.noarch
python3-firewall-0.4.4.2-2.fc25.noarch
libXpm-3.5.12-1.fc25.s390x
systemd-pam-231-12.fc25.s390x
mesa-libgbm-13.0.3-1.fc25.s390x
rpm-build-4.13.0-6.fc25.s390x
openssl-libs-1.0.2j-3.fc25.s390x
python2-smmap-2.0.1-1.fc25.noarch
bind99-libs-9.9.9-4.P5.fc25.s390x
kernel-4.9.3-200.fc25.s390x
gcc-gdb-plugin-6.3.1-1.fc25.s390x
selinux-policy-targeted-3.13.1-225.6.fc25.noarch
perl-Time-HiRes-1.9741-1.fc25.s390x
npth-1.3-1.fc25.s390x
poppler-data-0.4.7-6.fc25.noarch
nspr-devel-4.13.1-1.fc25.s390x
libcephfs1-10.2.4-2.fc25.s390x
wayland-devel-1.12.0-1.fc25.s390x
librbd1-10.2.4-2.fc25.s390x
libxcb-devel-1.12-1.fc25.s390x
mesa-libGL-devel-13.0.3-1.fc25.s390x
perl-encoding-2.19-5.fc25.s390x
libsndfile-1.0.27-1.fc25.s390x
python3-cssselect-0.9.2-1.fc25.noarch
perl-Digest-MD5-2.55-2.fc25.s390x
texlive-tetex-bin-svn36770.0-30.20160520.fc25.noarch
texlive-etoolbox-svn38031.2.2a-30.fc25.noarch
texlive-babel-svn40706-30.fc25.noarch
texlive-fancybox-svn18304.1.4-30.fc25.noarch
texlive-xkeyval-svn35741.2.7a-30.fc25.noarch
texlive-pdftex-def-svn22653.0.06d-30.fc25.noarch
texlive-makeindex-bin-svn40473-30.20160520.fc25.s390x
texlive-pdftex-bin-svn40987-30.20160520.fc25.s390x
texlive-pst-ovl-svn40873-30.fc25.noarch
texlive-crop-svn15878.1.5-30.fc25.noarch
texlive-manfnt-font-svn35799.0-30.fc25.noarch
texlive-txfonts-svn15878.0-30.fc25.noarch
texlive-ntgclass-svn15878.2.1a-30.fc25.noarch
texlive-dvisvgm-def-svn41011-30.fc25.noarch
texlive-ec-svn25033.1.0-30.fc25.noarch
texlive-etex-svn37057.0-30.fc25.noarch
texlive-texlive-en-svn41185-30.fc25.noarch
texlive-graphics-def-svn41879-30.fc25.noarch
texlive-iftex-svn29654.0.2-30.fc25.noarch
texlive-pst-math-svn34786.0.63-30.fc25.noarch
texlive-bera-svn20031.0-30.fc25.noarch
texlive-ms-svn29849.0-30.fc25.noarch
texlive-luaotfload-bin-svn34647.0-30.20160520.fc25.noarch
texlive-listings-svn37534.1.6-30.fc25.noarch
texlive-pst-fill-svn15878.1.01-30.fc25.noarch
texlive-pst-pdf-bin-svn7838.0-30.20160520.fc25.noarch
texlive-pst-slpe-svn24391.1.31-30.fc25.noarch
texlive-seminar-svn34011.1.62-30.fc25.noarch
texlive-l3experimental-svn41163-30.fc25.noarch
texlive-collection-fontsrecommended-svn35830.0-30.20160520.fc25.noarch
gettext-libs-0.19.8.1-3.fc25.s390x
java-1.8.0-openjdk-headless-1.8.0.111-5.b16.fc25.s390x
pcre2-utf32-10.22-8.fc25.s390x
at-spi2-atk-devel-2.22.0-1.fc25.s390x
wayland-protocols-devel-1.7-1.fc25.noarch
virglrenderer-0.5.0-1.20160411git61846f92f.fc25.s390x
libcacard-2.5.2-2.fc24.s390x
pixman-devel-0.34.0-2.fc24.s390x
libacl-devel-2.2.52-11.fc24.s390x
libnfs-devel-1.9.8-2.fc24.s390x
texi2html-5.0-4.fc24.noarch
libseccomp-devel-2.3.1-1.fc25.s390x
perl-libs-5.24.1-382.fc25.s390x
libxkbcommon-0.7.1-1.fc25.s390x
git-core-2.9.3-2.fc25.s390x
nss-softokn-freebl-devel-3.28.1-1.0.fc25.s390x
gtk-update-icon-cache-3.22.7-1.fc25.s390x
vim-filesystem-8.0.206-1.fc25.s390x
libX11-common-1.6.4-4.fc25.noarch
gtk3-devel-3.22.7-1.fc25.s390x
python2-dnf-1.1.10-5.fc25.noarch
vim-minimal-8.0.206-1.fc25.s390x
GeoIP-GeoLite-data-2017.01-1.fc25.noarch
gpg-pubkey-95a43f54-5284415a
dejavu-fonts-common-2.35-3.fc24.noarch
libSM-1.2.2-4.fc24.s390x
diffutils-3.3-13.fc24.s390x
libogg-1.3.2-5.fc24.s390x
hunspell-en-US-0.20140811.1-5.fc24.noarch
libdaemon-0.14-10.fc24.s390x
patch-2.7.5-3.fc24.s390x
libsysfs-2.1.0-19.fc24.s390x
procmail-3.22-39.fc24.s390x
libXdamage-1.1.4-8.fc24.s390x
libotf-0.9.13-7.fc24.s390x
urw-fonts-2.4-22.fc24.noarch
crontabs-1.11-12.20150630git.fc24.noarch
ppp-2.4.7-9.fc24.s390x
polkit-0.113-5.fc24.s390x
cyrus-sasl-2.1.26-26.2.fc24.s390x
zlib-devel-1.2.8-10.fc24.s390x
time-1.7-49.fc24.s390x
gpg-pubkey-fdb19c98-56fd6333
fedora-release-25-1.noarch
freetype-2.6.5-1.fc25.s390x
libcap-ng-0.7.8-1.fc25.s390x
gdbm-1.12-1.fc25.s390x
binutils-2.26.1-1.fc25.s390x
lcms2-2.8-2.fc25.s390x
libcomps-0.1.7-5.fc25.s390x
less-481-6.fc25.s390x
apr-1.5.2-4.fc25.s390x
perl-constant-1.33-367.fc25.noarch
perl-Data-Dumper-2.161-1.fc25.s390x
ipcalc-0.1.8-1.fc25.s390x
perl-Pod-Perldoc-3.27-1.fc25.noarch
libteam-1.26-1.fc25.s390x
gmp-c++-6.1.1-1.fc25.s390x
fontconfig-2.12.1-1.fc25.s390x
enchant-1.6.0-14.fc25.s390x
json-glib-1.2.2-1.fc25.s390x
pyliblzma-0.5.3-16.fc25.s390x
libsepol-devel-2.5-10.fc25.s390x
python3-libs-3.5.2-4.fc25.s390x
python3-ordered-set-2.0.0-4.fc25.noarch
python3-rpmconf-1.0.18-2.fc25.noarch
python-ipaddress-1.0.16-3.fc25.noarch
python2-kerberos-1.2.5-1.fc25.s390x
python2-pysocks-1.5.6-5.fc25.noarch
fipscheck-lib-1.4.1-11.fc25.s390x
libatomic_ops-7.4.4-1.fc25.s390x
net-snmp-agent-libs-5.7.3-13.fc25.s390x
util-linux-2.28.2-1.fc25.s390x
dracut-044-78.fc25.s390x
python2-pygpgme-0.3-18.fc25.s390x
libsoup-2.56.0-2.fc25.s390x
orc-0.4.26-1.fc25.s390x
yum-utils-1.1.31-511.fc25.noarch
libXrender-0.9.10-1.fc25.s390x
libXrandr-1.5.1-1.fc25.s390x
go-srpm-macros-2-7.fc25.noarch
gnupg2-smime-2.1.13-2.fc25.s390x
guile-devel-2.0.13-1.fc25.s390x
uboot-tools-2016.09.01-2.fc25.s390x
pykickstart-2.32-1.fc25.noarch
python-bunch-1.0.1-9.fc25.noarch
perl-generators-1.10-1.fc25.noarch
perl-Mozilla-CA-20160104-3.fc25.noarch
glibc-all-langpacks-2.24-4.fc25.s390x
bzip2-libs-1.0.6-21.fc25.s390x
libpng-1.6.27-1.fc25.s390x
libtiff-4.0.7-1.fc25.s390x
desktop-file-utils-0.23-2.fc25.s390x
python2-cccolutils-1.4-1.fc25.s390x
libcurl-7.51.0-4.fc25.s390x
rpm-plugin-systemd-inhibit-4.13.0-6.fc25.s390x
cups-libs-2.2.0-5.fc25.s390x
python2-lxml-3.7.2-1.fc25.s390x
redhat-rpm-config-45-1.fc25.noarch
elfutils-libs-0.168-1.fc25.s390x
device-mapper-event-libs-1.02.136-3.fc25.s390x
lvm2-libs-2.02.167-3.fc25.s390x
elfutils-0.168-1.fc25.s390x
openssh-7.4p1-1.fc25.s390x
python2-gitdb-2.0.0-1.fc25.noarch
openssh-server-7.4p1-1.fc25.s390x
gcc-gfortran-6.3.1-1.fc25.s390x
rpm-devel-4.13.0-6.fc25.s390x
libselinux-python-2.5-13.fc25.s390x
openjpeg2-2.1.2-3.fc25.s390x
js-jquery-2.2.4-1.fc25.noarch
boost-thread-1.60.0-10.fc25.s390x
json-c-0.12-7.fc24.s390x
ghostscript-x11-9.20-5.fc25.s390x
libdrm-devel-2.4.74-1.fc25.s390x
libuuid-devel-2.28.2-1.fc25.s390x
librbd-devel-10.2.4-2.fc25.s390x
libXcursor-devel-1.1.14-6.fc24.s390x
python3-beautifulsoup4-4.5.3-1.fc25.noarch
texlive-kpathsea-svn41139-30.fc25.noarch
texlive-amsmath-svn41561-30.fc25.noarch
texlive-thumbpdf-svn34621.3.16-30.fc25.noarch
texlive-multido-svn18302.1.42-30.fc25.noarch
texlive-float-svn15878.1.3d-30.fc25.noarch
texlive-psnfss-svn33946.9.2a-30.fc25.noarch
texlive-wasy-svn35831.0-30.fc25.noarch
texlive-makeindex-svn40768-30.fc25.noarch
texlive-pdftex-svn41149-30.fc25.noarch
texlive-enumitem-svn24146.3.5.2-30.fc25.noarch
texlive-microtype-svn41127-30.fc25.noarch
texlive-helvetic-svn31835.0-30.fc25.noarch
texlive-times-svn35058.0-30.fc25.noarch
texlive-mdwtools-svn15878.1.05.4-30.fc25.noarch
texlive-babel-english-svn30264.3.3p-30.fc25.noarch
texlive-cmextra-svn32831.0-30.fc25.noarch
texlive-enctex-svn34957.0-30.fc25.noarch
texlive-texlive-docindex-svn41430-30.fc25.noarch
texlive-ifetex-svn24853.1.2-30.fc25.noarch
texlive-mparhack-svn15878.1.4-30.fc25.noarch
texlive-paralist-svn39247-30.fc25.noarch
texlive-algorithms-svn38085.0.1-30.fc25.noarch
texlive-geometry-svn19716.5.6-30.fc25.noarch
texlive-fontspec-svn41262-30.fc25.noarch
texlive-oberdiek-svn41346-30.fc25.noarch
texlive-pst-eps-svn15878.1.0-30.fc25.noarch
texlive-pstricks-svn41321-30.fc25.noarch
texlive-pst-blur-svn15878.2.0-30.fc25.noarch
texlive-jknapltx-svn19440.0-30.fc25.noarch
texlive-breqn-svn38099.0.98d-30.fc25.noarch
texlive-collection-basic-svn41149-30.20160520.fc25.noarch
latex2html-2012-7.fc24.noarch
lksctp-tools-1.0.16-5.fc24.s390x
vte291-0.46.1-1.fc25.s390x
openssl-devel-1.0.2j-3.fc25.s390x
at-spi2-core-devel-2.22.0-1.fc25.s390x
libfdt-1.4.2-1.fc25.s390x
libXft-devel-2.3.2-4.fc24.s390x
libattr-devel-2.4.47-16.fc24.s390x
libiscsi-devel-1.15.0-2.fc24.s390x
gettext-0.19.8.1-3.fc25.s390x
libjpeg-turbo-devel-1.5.1-0.fc25.s390x
glusterfs-libs-3.9.1-1.fc25.s390x
glusterfs-api-3.9.1-1.fc25.s390x
hawkey-0.6.3-6.1.fc25.s390x
nss-softokn-devel-3.28.1-1.0.fc25.s390x
glusterfs-cli-3.9.1-1.fc25.s390x
vim-common-8.0.206-1.fc25.s390x
libX11-1.6.4-4.fc25.s390x
pulseaudio-libs-devel-10.0-2.fc25.s390x
dnf-yum-1.1.10-5.fc25.noarch
tzdata-java-2016j-2.fc25.noarch
ccache-3.3.3-1.fc25.s390x
gpg-pubkey-8e1431d5-53bcbac7
zlib-1.2.8-10.fc24.s390x
sed-4.2.2-15.fc24.s390x
p11-kit-0.23.2-2.fc24.s390x
psmisc-22.21-8.fc24.s390x
gpm-libs-1.20.7-9.fc24.s390x
zip-3.0-16.fc24.s390x
hostname-3.15-7.fc24.s390x
libyubikey-1.13-2.fc24.s390x
sg3_utils-libs-1.41-3.fc24.s390x
polkit-pkla-compat-0.1-7.fc24.s390x
passwd-0.79-8.fc24.s390x
trousers-0.3.13-6.fc24.s390x
grubby-8.40-3.fc24.s390x
rootfiles-8.1-19.fc24.noarch
python-rpm-macros-3-10.fc25.noarch
info-6.1-3.fc25.s390x
libuuid-2.28.2-1.fc25.s390x
iptables-libs-1.6.0-2.fc25.s390x
nettle-3.3-1.fc25.s390x
jansson-2.9-1.fc25.s390x
libksba-1.3.5-1.fc25.s390x
perl-Text-ParseWords-3.30-365.fc25.noarch
perl-PathTools-3.63-366.fc25.s390x
perl-File-Temp-0.23.04-365.fc25.noarch
fuse-libs-2.9.7-1.fc25.s390x
perl-Pod-Escapes-1.07-365.fc25.noarch
perl-Term-ANSIColor-4.05-2.fc25.noarch
perl-URI-1.71-5.fc25.noarch
libXfont-1.5.2-1.fc25.s390x
crypto-policies-20160921-2.git75b9b04.fc25.noarch
python-six-1.10.0-3.fc25.noarch
dbus-glib-0.108-1.fc25.s390x
gobject-introspection-1.50.0-1.fc25.s390x
libpwquality-1.3.0-6.fc25.s390x
python-gobject-base-3.22.0-1.fc25.s390x
python-html5lib-0.999-9.fc25.noarch
python3-dbus-1.2.4-2.fc25.s390x
python3-chardet-2.3.0-1.fc25.noarch
python3-urllib3-1.15.1-3.fc25.noarch
python-offtrac-0.1.0-7.fc25.noarch
python2-cryptography-1.5.3-3.fc25.s390x
python2-requests-kerberos-0.10.0-2.fc25.noarch
libserf-1.3.9-1.fc25.s390x
libdatrie-0.2.9-3.fc25.s390x
s390utils-base-1.36.0-1.fc25.s390x
kpartx-0.4.9-83.fc25.s390x
s390utils-cpuplugd-1.36.0-1.fc25.s390x
rpmconf-1.0.18-2.fc25.noarch
s390utils-osasnmpd-1.36.0-1.fc25.s390x
python-dnf-plugins-extras-common-0.0.12-4.fc25.noarch
pango-1.40.3-1.fc25.s390x
fpc-srpm-macros-1.0-1.fc25.noarch
kernel-core-4.8.8-300.fc25.s390x
fedora-upgrade-25.2-1.fc25.noarch
net-tools-2.0-0.38.20160329git.fc25.s390x
libuser-0.62-4.fc25.s390x
screen-4.4.0-4.fc25.s390x
man-db-2.7.5-3.fc25.s390x
sqlite-3.14.2-1.fc25.s390x
python-systemd-doc-232-1.fc25.s390x
pcre-8.40-1.fc25.s390x
libdb-5.3.28-16.fc25.s390x
lz4-1.7.5-1.fc25.s390x
tar-1.29-3.fc25.s390x
emacs-common-25.1-3.fc25.s390x
perl-threads-shared-1.54-1.fc25.s390x
unzip-6.0-31.fc25.s390x
mesa-libglapi-13.0.3-1.fc25.s390x
rpm-libs-4.13.0-6.fc25.s390x
selinux-policy-3.13.1-225.6.fc25.noarch
pcre-utf16-8.40-1.fc25.s390x
bodhi-client-0.9.12.2-6.fc25.noarch
rpmlint-1.9-5.fc25.noarch
glibc-headers-2.24-4.fc25.s390x
dbus-1.11.8-1.fc25.s390x
kernel-core-4.9.3-200.fc25.s390x
cairo-1.14.8-1.fc25.s390x
ca-certificates-2017.2.11-1.0.fc25.noarch
openssh-clients-7.4p1-1.fc25.s390x
python2-GitPython-2.1.1-2.fc25.noarch
mariadb-libs-10.1.20-1.fc25.s390x
NetworkManager-glib-1.4.4-3.fc25.s390x
gcc-go-6.3.1-1.fc25.s390x
cracklib-dicts-2.9.6-4.fc25.s390x
iproute-tc-4.6.0-6.fc25.s390x
libselinux-python3-2.5-13.fc25.s390x
strace-4.15-1.fc25.s390x
python2-enchant-1.6.8-1.fc25.noarch
boost-iostreams-1.60.0-10.fc25.s390x
bluez-libs-5.43-1.fc25.s390x
ghostscript-9.20-5.fc25.s390x
userspace-rcu-0.9.2-2.fc25.s390x
mesa-libwayland-egl-devel-13.0.3-1.fc25.s390x
libXext-devel-1.3.3-4.fc24.s390x
libXrandr-devel-1.5.1-1.fc25.s390x
perl-XML-XPath-1.39-1.fc25.noarch
python3-lxml-3.7.2-1.fc25.s390x
texlive-texlive.infra-bin-svn40312-30.20160520.fc25.s390x
texlive-ifxetex-svn19685.0.5-30.fc25.noarch
texlive-thumbpdf-bin-svn6898.0-30.20160520.fc25.noarch
texlive-babelbib-svn25245.1.31-30.fc25.noarch
texlive-index-svn24099.4.1beta-30.fc25.noarch
texlive-caption-svn41409-30.fc25.noarch
texlive-bibtex-bin-svn40473-30.20160520.fc25.s390x
texlive-mfware-bin-svn40473-30.20160520.fc25.s390x
texlive-texconfig-svn40768-30.fc25.noarch
texlive-footmisc-svn23330.5.5b-30.fc25.noarch
texlive-psfrag-svn15878.3.04-30.fc25.noarch
texlive-eurosym-svn17265.1.4_subrfix-30.fc25.noarch
texlive-symbol-svn31835.0-30.fc25.noarch
texlive-euenc-svn19795.0.1h-30.fc25.noarch
texlive-textcase-svn15878.0-30.fc25.noarch
texlive-charter-svn15878.0-30.fc25.noarch
texlive-wasysym-svn15878.2.0-30.fc25.noarch
texlive-mflogo-svn38628-30.fc25.noarch
texlive-soul-svn15878.2.4-30.fc25.noarch
texlive-marginnote-svn41382-30.fc25.noarch
texlive-filecontents-svn24250.1.3-30.fc25.noarch
texlive-tipa-svn29349.1.3-30.fc25.noarch
texlive-xcolor-svn41044-30.fc25.noarch
texlive-breakurl-svn29901.1.40-30.fc25.noarch
texlive-attachfile-svn38830-30.fc25.noarch
texlive-pst-coil-svn37377.1.07-30.fc25.noarch
texlive-auto-pst-pdf-svn23723.0.6-30.fc25.noarch
texlive-ctable-svn38672-30.fc25.noarch
texlive-extsizes-svn17263.1.4a-30.fc25.noarch
texlive-beamer-svn36461.3.36-30.fc25.noarch
texlive-dvipdfmx-bin-svn40273-30.20160520.fc25.s390x
netpbm-progs-10.76.00-2.fc25.s390x
vte-profile-0.46.1-1.fc25.s390x
krb5-devel-1.14.4-4.fc25.s390x
dbus-devel-1.11.8-1.fc25.s390x
sqlite-devel-3.14.2-1.fc25.s390x
libiscsi-1.15.0-2.fc24.s390x
fontconfig-devel-2.12.1-1.fc25.s390x
libfdt-devel-1.4.2-1.fc25.s390x
ceph-devel-compat-10.2.4-2.fc25.s390x
zlib-static-1.2.8-10.fc24.s390x
chrpath-0.16-3.fc24.s390x
python-2.7.13-1.fc25.s390x
nss-3.28.1-1.3.fc25.s390x
python2-hawkey-0.6.3-6.1.fc25.s390x
gdk-pixbuf2-modules-2.36.4-1.fc25.s390x
perl-Git-2.9.3-2.fc25.noarch
kernel-core-4.9.5-200.fc25.s390x
publicsuffix-list-dafsa-20170116-1.fc25.noarch
perl-SelfLoader-1.23-382.fc25.noarch
perl-open-1.10-382.fc25.noarch
gpgme-1.8.0-8.fc25.s390x
=== TEST BEGIN ===
Using CC: /home/fam/bin/cc
rm: cannot remove '/var/tmp/patchew-qemu-build': Directory not empty
=== OUTPUT END ===

Test command exited with code: 1


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [Qemu-devel] [PULL 07/31] 9pfs: introduce relative_openat_nofollow() helper
  2017-02-27 23:37   ` Eric Blake
@ 2017-02-28  0:33     ` Greg Kurz
  0 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-28  0:33 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel, Peter Maydell, Aneesh Kumar K.V

[-- Attachment #1: Type: text/plain, Size: 2864 bytes --]

On Mon, 27 Feb 2017 17:37:56 -0600
Eric Blake <eblake@redhat.com> wrote:

> On 02/27/2017 04:59 PM, Greg Kurz wrote:
> > When using the passthrough security mode, symbolic links created by the
> > guest are actual symbolic links on the host file system.
> >   
> 
> Hmm, I just barely started reviewing the series, and see a pull request.
> At this point, anything I point out can probably be done as followup
> patches rather than forcing a respin of the pull (and soft freeze is
> appropriate for that).
> 

Yes but I now realize I have another nit... Patch 2/31 should have

From: Pradeep <pradeepkiruvale@gmail.com>

but for unknown reasons, it got dropped at some point, and cannot be
fixed in a followup patch.

For simplicity, I guess I'd rather fix all the issues and respin a new
pull tomorrow.

> > Suggested-by: Jann Horn <jannh@google.com>
> > Signed-off-by: Greg Kurz <groug@kaod.org>
> > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
> > (renamed openat_nofollow() to relative_openat_nofollow(),
> >  assert path is relative, Greg Kurz)
> > Signed-off-by: Greg Kurz <groug@kaod.org>
> > ---  
> 
> > +int relative_openat_nofollow(int dirfd, const char *path, int flags,
> > +                             mode_t mode)
> > +{
> > +    int fd;
> > +
> > +    assert(path[0] != '/');  
> 
> If you move this assert...
> 
> > +
> > +    fd = dup(dirfd);
> > +    if (fd == -1) {
> > +        return -1;
> > +    }
> > +
> > +    while (*path) {
> > +        const char *c;
> > +        int next_fd;
> > +        char *head;  
> 
> ...here, you can make sure there are no 'a//b' issues to worry about.
> 
> > +
> > +        head = g_strdup(path);
> > +        c = strchr(path, '/');
> > +        if (c) {
> > +            head[c - path] = 0;
> > +            next_fd = openat_dir(fd, head);
> > +        } else {
> > +            next_fd = openat_file(fd, head, flags, mode);
> > +        }
> > +        g_free(head);
> > +        if (next_fd == -1) {
> > +            close_preserve_errno(fd);
> > +            return -1;
> > +        }
> > +        close(fd);
> > +        fd = next_fd;
> > +
> > +        if (!c) {
> > +            break;
> > +        }
> > +        path = c + 1;  
> 
> or else add an assert here.
> 
> 
> > +static inline int openat_file(int dirfd, const char *name, int flags,
> > +                              mode_t mode)
> > +{
> > +    int fd, serrno;
> > +
> > +    fd = openat(dirfd, name, flags | O_NOFOLLOW | O_NOCTTY | O_NONBLOCK,
> > +                mode);
> > +    if (fd == -1) {
> > +        return -1;
> > +    }
> > +
> > +    serrno = errno;
> > +    /* O_NONBLOCK was only needed to open the file. Let's drop it. */
> > +    assert(!fcntl(fd, F_SETFL, flags));  
> 
> Ewww. Side effect inside an assert().  :(
> 

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze
  2017-02-28  0:00 ` no-reply
@ 2017-02-28  0:36   ` Greg Kurz
  0 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-28  0:36 UTC (permalink / raw)
  To: no-reply; +Cc: qemu-devel, famz, peter.maydell, aneesh.kumar

[-- Attachment #1: Type: text/plain, Size: 49057 bytes --]

On Mon, 27 Feb 2017 16:00:25 -0800 (PST)
no-reply@patchew.org wrote:

> Hi,
> 
> This series failed build test on s390x host. Please find the details below.
> 

Hmm... I don't understand how this is related to this pull request... :-\

> Type: series
> Subject: [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze
> Message-id: 1488236421-30983-1-git-send-email-groug@kaod.org
> 
> === TEST SCRIPT BEGIN ===
> #!/bin/bash
> # Testing script will be invoked under the git checkout with
> # HEAD pointing to a commit that has the patches applied on top of "base"
> # branch
> set -e
> echo "=== ENV ==="
> env
> echo "=== PACKAGES ==="
> rpm -qa
> echo "=== TEST BEGIN ==="
> CC=$HOME/bin/cc
> INSTALL=$PWD/install
> BUILD=/var/tmp/patchew-qemu-build
> echo -n "Using CC: "
> realpath $CC
> test -e $BUILD && rm -rf $BUILD
> mkdir -p $BUILD $INSTALL
> SRC=$PWD
> cd $BUILD
> $SRC/configure --cc=$CC --prefix=$INSTALL
> make -j4
> make check -j4
> make install
> === TEST SCRIPT END ===
> 
> Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
> From https://github.com/patchew-project/qemu
>  - [tag update]      patchew/1488236421-30983-1-git-send-email-groug@kaod.org -> patchew/1488236421-30983-1-git-send-email-groug@kaod.org
> Switched to a new branch 'test'
> 07c3d33 9pfs: local: drop unused code
> 5ce7d8c 9pfs: local: open2: don't follow symlinks
> aa37460 9pfs: local: mkdir: don't follow symlinks
> a0173b8 9pfs: local: mknod: don't follow symlinks
> 69b7736 9pfs: local: symlink: don't follow symlinks
> 3e4489d 9pfs: local: chown: don't follow symlinks
> c485ffa 9pfs: local: chmod: don't follow symlinks
> 86eeb62 9pfs: local: link: don't follow symlinks
> 85f4b20 9pfs: local: improve error handling in link op
> b464899 9pfs: local: rename: use renameat
> 6b56008 9pfs: local: renameat: don't follow symlinks
> 08500f7 9pfs: local: lstat: don't follow symlinks
> 939b750 9pfs: local: readlink: don't follow symlinks
> def2b5c 9pfs: local: truncate: don't follow symlinks
> 3590fd1 9pfs: local: statfs: don't follow symlinks
> 16cd7bf 9pfs: local: utimensat: don't follow symlinks
> 88b8a10 9pfs: local: remove: don't follow symlinks
> 0f81ee9 9pfs: local: unlinkat: don't follow symlinks
> 6dc3122 9pfs: local: lremovexattr: don't follow symlinks
> ae5edcc 9pfs: local: lsetxattr: don't follow symlinks
> 2d68506 9pfs: local: llistxattr: don't follow symlinks
> 6ac09e6 9pfs: local: lgetxattr: don't follow symlinks
> 4e29bb4 9pfs: local: open/opendir: don't follow symlinks
> f377113 9pfs: local: keep a file descriptor on the shared folder
> 5b8c8e3 9pfs: introduce relative_openat_nofollow() helper
> 11557d4 9pfs: remove side-effects in local_open() and local_opendir()
> 3cf5912 9pfs: remove side-effects in local_init()
> 9835545 9pfs: local: move xattr security ops to 9p-xattr.c
> d462443 throttle: factor out duplicate code
> 8273ae8 fsdev: add IO throttle support to fsdev devices
> 48bdc6e 9pfs: fix v9fs_lock error case
> 
> === OUTPUT BEGIN ===
> === ENV ===
> XDG_SESSION_ID=40003
> SHELL=/bin/sh
> USER=fam
> PATCHEW=/home/fam/patchew/patchew-cli -s http://patchew.org --nodebug
> PATH=/usr/bin:/bin
> PWD=/var/tmp/patchew-tester-tmp-g8vh4imz/src
> LANG=en_US.UTF-8
> HOME=/home/fam
> SHLVL=2
> LOGNAME=fam
> DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1012/bus
> XDG_RUNTIME_DIR=/run/user/1012
> _=/usr/bin/env
> === PACKAGES ===
> gpg-pubkey-873529b8-54e386ff
> xz-libs-5.2.2-2.fc24.s390x
> libacl-2.2.52-11.fc24.s390x
> libxshmfence-1.2-3.fc24.s390x
> cdparanoia-libs-10.2-21.fc24.s390x
> ustr-1.0.4-21.fc24.s390x
> giflib-4.1.6-15.fc24.s390x
> libusb-0.1.5-7.fc24.s390x
> trousers-lib-0.3.13-6.fc24.s390x
> readline-devel-6.3-8.fc24.s390x
> python-srpm-macros-3-10.fc25.noarch
> ncurses-base-6.0-6.20160709.fc25.noarch
> gmp-6.1.1-1.fc25.s390x
> chkconfig-1.8-1.fc25.s390x
> libidn-1.33-1.fc25.s390x
> file-5.28-4.fc25.s390x
> slang-2.3.0-7.fc25.s390x
> avahi-libs-0.6.32-4.fc25.s390x
> libsemanage-2.5-8.fc25.s390x
> perl-Unicode-Normalize-1.25-365.fc25.s390x
> perl-libnet-3.10-1.fc25.noarch
> perl-Thread-Queue-3.11-1.fc25.noarch
> perl-podlators-4.09-1.fc25.noarch
> jasper-libs-1.900.13-1.fc25.s390x
> graphite2-1.3.6-1.fc25.s390x
> libblkid-2.28.2-1.fc25.s390x
> pkgconfig-0.29.1-1.fc25.s390x
> dbus-python-1.2.4-2.fc25.s390x
> alsa-lib-1.1.1-2.fc25.s390x
> libgnome-keyring-3.12.0-7.fc25.s390x
> yum-metadata-parser-1.1.4-17.fc25.s390x
> python3-3.5.2-4.fc25.s390x
> python3-slip-dbus-0.6.4-4.fc25.noarch
> python2-cssselect-0.9.2-1.fc25.noarch
> python-backports-1.0-8.fc25.s390x
> python-magic-5.28-4.fc25.noarch
> python-pycparser-2.14-7.fc25.noarch
> python-fedora-0.8.0-2.fc25.noarch
> createrepo_c-libs-0.10.0-6.fc25.s390x
> initscripts-9.69-1.fc25.s390x
> plymouth-scripts-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
> cronie-1.5.1-2.fc25.s390x
> python2-librepo-1.7.18-3.fc25.s390x
> wget-1.18-2.fc25.s390x
> python3-dnf-plugins-core-0.1.21-4.fc25.noarch
> at-spi2-core-2.22.0-1.fc25.s390x
> libXv-1.0.11-1.fc25.s390x
> dhcp-client-4.3.5-1.fc25.s390x
> python2-dnf-plugins-core-0.1.21-4.fc25.noarch
> parted-3.2-21.fc25.s390x
> python2-ndg_httpsclient-0.4.0-4.fc25.noarch
> bash-completion-2.4-1.fc25.noarch
> btrfs-progs-4.6.1-1.fc25.s390x
> texinfo-6.1-3.fc25.s390x
> perl-Filter-1.55-366.fc25.s390x
> flex-2.6.0-3.fc25.s390x
> libgcc-6.3.1-1.fc25.s390x
> glib2-2.50.2-1.fc25.s390x
> dbus-libs-1.11.8-1.fc25.s390x
> libgomp-6.3.1-1.fc25.s390x
> colord-libs-1.3.4-1.fc25.s390x
> perl-Encode-2.88-5.fc25.s390x
> gstreamer1-1.10.2-1.fc25.s390x
> cracklib-2.9.6-4.fc25.s390x
> rpm-build-libs-4.13.0-6.fc25.s390x
> libobjc-6.3.1-1.fc25.s390x
> pcre-devel-8.40-1.fc25.s390x
> mariadb-config-10.1.20-1.fc25.s390x
> gcc-6.3.1-1.fc25.s390x
> mesa-libGL-13.0.3-1.fc25.s390x
> python3-dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch
> bind-libs-9.10.4-4.P5.fc25.s390x
> python-osbs-client-0.33-3.fc25.noarch
> NetworkManager-1.4.4-3.fc25.s390x
> audit-2.7.1-1.fc25.s390x
> glibc-static-2.24-4.fc25.s390x
> perl-Pod-Simple-3.35-1.fc25.noarch
> gdb-7.12-36.fc25.s390x
> python2-simplejson-3.10.0-1.fc25.s390x
> python3-sssdconfig-1.14.2-2.fc25.noarch
> texlive-lib-2016-30.20160520.fc25.s390x
> boost-random-1.60.0-10.fc25.s390x
> brltty-5.4-2.fc25.s390x
> libref_array-0.1.5-29.fc25.s390x
> librados2-10.2.4-2.fc25.s390x
> gnutls-dane-3.5.8-1.fc25.s390x
> systemtap-client-3.1-0.20160725git91bfb36.fc25.s390x
> libXrender-devel-0.9.10-1.fc25.s390x
> libXi-devel-1.7.8-2.fc25.s390x
> texlive-pdftex-doc-svn41149-30.fc25.noarch
> tcp_wrappers-7.6-83.fc25.s390x
> javapackages-tools-4.7.0-6.1.fc25.noarch
> texlive-kpathsea-bin-svn40473-30.20160520.fc25.s390x
> texlive-url-svn32528.3.4-30.fc25.noarch
> texlive-latex-fonts-svn28888.0-30.fc25.noarch
> texlive-mptopdf-bin-svn18674.0-30.20160520.fc25.noarch
> texlive-underscore-svn18261.0-30.fc25.noarch
> texlive-subfig-svn15878.1.3-30.fc25.noarch
> texlive-dvipdfmx-def-svn40328-30.fc25.noarch
> texlive-plain-svn40274-30.fc25.noarch
> texlive-texlive-scripts-svn41433-30.fc25.noarch
> texlive-fancyref-svn15878.0.9c-30.fc25.noarch
> texlive-csquotes-svn39538-30.fc25.noarch
> texlive-pxfonts-svn15878.0-30.fc25.noarch
> texlive-cite-svn36428.5.5-30.fc25.noarch
> texlive-section-svn20180.0-30.fc25.noarch
> texlive-pslatex-svn16416.0-30.fc25.noarch
> texlive-tex-gyre-math-svn41264-30.fc25.noarch
> texlive-knuth-local-svn38627-30.fc25.noarch
> texlive-type1cm-svn21820.0-30.fc25.noarch
> texlive-finstrut-svn21719.0.5-30.fc25.noarch
> texlive-ucharcat-svn38907-30.fc25.noarch
> texlive-environ-svn33821.0.3-30.fc25.noarch
> texlive-eso-pic-svn37925.2.0g-30.fc25.noarch
> texlive-filehook-svn24280.0.5d-30.fc25.noarch
> texlive-luatexbase-svn38550-30.fc25.noarch
> texlive-pst-text-svn15878.1.00-30.fc25.noarch
> texlive-pst-tree-svn24142.1.12-30.fc25.noarch
> texlive-latex-bin-bin-svn14050.0-30.20160520.fc25.noarch
> texlive-metalogo-svn18611.0.12-30.fc25.noarch
> texlive-cm-super-svn15878.0-30.fc25.noarch
> texlive-xetex-svn41438-30.fc25.noarch
> keyutils-1.5.9-8.fc24.s390x
> libcephfs_jni1-10.2.4-2.fc25.s390x
> libcom_err-devel-1.43.3-1.fc25.s390x
> mesa-libGLES-devel-13.0.3-1.fc25.s390x
> graphite2-devel-1.3.6-1.fc25.s390x
> nettle-devel-3.3-1.fc25.s390x
> lzo-minilzo-2.08-8.fc24.s390x
> bzip2-devel-1.0.6-21.fc25.s390x
> libusbx-devel-1.0.21-1.fc25.s390x
> SDL2-devel-2.0.5-2.fc25.s390x
> virglrenderer-devel-0.5.0-1.20160411git61846f92f.fc25.s390x
> glib2-static-2.50.2-1.fc25.s390x
> mesa-libgbm-devel-13.0.3-1.fc25.s390x
> acpica-tools-20160831-1.fc25.s390x
> gdk-pixbuf2-2.36.4-1.fc25.s390x
> nss-softokn-3.28.1-1.0.fc25.s390x
> python3-dnf-1.1.10-5.fc25.noarch
> python-gluster-3.9.1-1.fc25.noarch
> perl-IO-1.36-382.fc25.s390x
> glusterfs-devel-3.9.1-1.fc25.s390x
> gtk3-3.22.7-1.fc25.s390x
> vim-enhanced-8.0.206-1.fc25.s390x
> nss-tools-3.28.1-1.3.fc25.s390x
> libmicrohttpd-0.9.52-1.fc25.s390x
> gpg-pubkey-a29cb19c-53bcbba6
> libaio-0.3.110-6.fc24.s390x
> m4-1.4.17-9.fc24.s390x
> libfontenc-1.1.3-3.fc24.s390x
> lzo-2.08-8.fc24.s390x
> isl-0.14-5.fc24.s390x
> libXau-1.0.8-6.fc24.s390x
> liblockfile-1.09-4.fc24.s390x
> linux-atm-libs-2.5.1-14.fc24.s390x
> sg3_utils-1.41-3.fc24.s390x
> libXext-1.3.3-4.fc24.s390x
> libXinerama-1.1.3-6.fc24.s390x
> libXxf86vm-1.1.4-3.fc24.s390x
> libXft-2.3.2-4.fc24.s390x
> ykpers-1.17.3-2.fc24.s390x
> bison-3.0.4-4.fc24.s390x
> perl-srpm-macros-1-20.fc25.noarch
> gawk-4.1.3-8.fc25.s390x
> tcp_wrappers-libs-7.6-83.fc25.s390x
> libwayland-client-1.12.0-1.fc25.s390x
> iptables-1.6.0-2.fc25.s390x
> perl-Exporter-5.72-366.fc25.noarch
> perl-Text-Tabs+Wrap-2013.0523-365.fc25.noarch
> perl-Error-0.17024-7.fc25.noarch
> perl-Term-Cap-1.17-365.fc25.noarch
> perl-version-0.99.17-1.fc25.s390x
> perl-Pod-Usage-1.69-1.fc25.noarch
> fftw-libs-double-3.3.5-3.fc25.s390x
> device-mapper-persistent-data-0.6.3-1.fc25.s390x
> krb5-libs-1.14.4-4.fc25.s390x
> system-python-libs-3.5.2-4.fc25.s390x
> net-snmp-libs-5.7.3-13.fc25.s390x
> libssh2-1.8.0-1.fc25.s390x
> libgusb-0.2.9-1.fc25.s390x
> ModemManager-glib-1.6.4-1.fc25.s390x
> python3-six-1.10.0-3.fc25.noarch
> newt-python3-0.52.19-2.fc25.s390x
> python3-pysocks-1.5.6-5.fc25.noarch
> python-chardet-2.3.0-1.fc25.noarch
> python-munch-2.0.4-3.fc25.noarch
> python2-cffi-1.7.0-2.fc25.s390x
> python-bugzilla-1.2.2-4.fc25.noarch
> openldap-2.4.44-2.fc25.s390x
> libedit-3.1-16.20160618cvs.fc25.s390x
> gc-devel-7.4.4-1.fc25.s390x
> python-pycurl-7.43.0-4.fc25.s390x
> createrepo_c-0.10.0-6.fc25.s390x
> plymouth-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
> device-mapper-multipath-libs-0.4.9-83.fc25.s390x
> ebtables-2.0.10-21.fc25.s390x
> python3-librepo-1.7.18-3.fc25.s390x
> libwmf-lite-0.2.8.4-49.fc25.s390x
> net-snmp-5.7.3-13.fc25.s390x
> yum-3.4.3-510.fc25.noarch
> dnf-plugins-core-0.1.21-4.fc25.noarch
> at-spi2-atk-2.22.0-1.fc25.s390x
> ImageMagick-libs-6.9.3.0-3.fc25.s390x
> dhcp-common-4.3.5-1.fc25.noarch
> kernel-modules-4.8.8-300.fc25.s390x
> dracut-config-rescue-044-78.fc25.s390x
> sendmail-8.15.2-7.fc25.s390x
> avahi-autoipd-0.6.32-4.fc25.s390x
> teamd-1.26-1.fc25.s390x
> kernel-devel-4.8.8-300.fc25.s390x
> mozjs17-17.0.0-16.fc25.s390x
> libselinux-2.5-13.fc25.s390x
> libcrypt-nss-2.24-4.fc25.s390x
> systemd-libs-231-12.fc25.s390x
> libgo-6.3.1-1.fc25.s390x
> libgo-devel-6.3.1-1.fc25.s390x
> NetworkManager-libnm-1.4.4-3.fc25.s390x
> cpp-6.3.1-1.fc25.s390x
> rpm-plugin-selinux-4.13.0-6.fc25.s390x
> pcre-utf32-8.40-1.fc25.s390x
> packagedb-cli-2.14-1.fc25.noarch
> python2-pyparsing-2.1.10-1.fc25.noarch
> glibc-devel-2.24-4.fc25.s390x
> libdrm-2.4.74-1.fc25.s390x
> kernel-modules-4.9.3-200.fc25.s390x
> cairo-gobject-1.14.8-1.fc25.s390x
> bind99-license-9.9.9-4.P5.fc25.noarch
> pyrpkg-1.47-5.fc25.noarch
> emacs-25.1-3.fc25.s390x
> firewalld-0.4.4.2-2.fc25.noarch
> pyparsing-2.1.10-1.fc25.noarch
> kernel-devel-4.9.3-200.fc25.s390x
> libproxy-0.4.14-1.fc25.s390x
> ethtool-4.8-1.fc25.s390x
> python3-pyparsing-2.1.10-1.fc25.noarch
> xorg-x11-proto-devel-7.7-20.fc25.noarch
> brlapi-0.6.5-2.fc25.s390x
> libcollection-0.7.0-29.fc25.s390x
> librados-devel-10.2.4-2.fc25.s390x
> libcephfs-devel-10.2.4-2.fc25.s390x
> libXdamage-devel-1.1.4-8.fc24.s390x
> libXinerama-devel-1.1.3-6.fc24.s390x
> quota-4.03-7.fc25.s390x
> texlive-texlive-common-doc-svn40682-30.fc25.noarch
> texlive-metafont-bin-svn40987-30.20160520.fc25.s390x
> texlive-ifluatex-svn41346-30.fc25.noarch
> texlive-dvips-bin-svn40987-30.20160520.fc25.s390x
> texlive-marvosym-svn29349.2.2a-30.fc25.noarch
> texlive-graphics-cfg-svn40269-30.fc25.noarch
> texlive-carlisle-svn18258.0-30.fc25.noarch
> texlive-glyphlist-svn28576.0-30.fc25.noarch
> texlive-tex-bin-svn40987-30.20160520.fc25.s390x
> texlive-texlive-scripts-bin-svn29741.0-30.20160520.fc25.noarch
> texlive-mathtools-svn38833-30.fc25.noarch
> texlive-euro-svn22191.1.1-30.fc25.noarch
> texlive-palatino-svn31835.0-30.fc25.noarch
> texlive-anysize-svn15878.0-30.fc25.noarch
> texlive-sansmath-svn17997.1.1-30.fc25.noarch
> texlive-mfnfss-svn19410.0-30.fc25.noarch
> texlive-mathpazo-svn15878.1.003-30.fc25.noarch
> texlive-knuth-lib-svn35820.0-30.fc25.noarch
> texlive-updmap-map-svn41159-30.fc25.noarch
> texlive-beton-svn15878.0-30.fc25.noarch
> texlive-xetexconfig-svn41133-30.fc25.noarch
> texlive-trimspaces-svn15878.1.1-30.fc25.noarch
> texlive-memoir-svn41203-30.fc25.noarch
> texlive-latex-svn40218-30.fc25.noarch
> texlive-lualatex-math-svn40621-30.fc25.noarch
> texlive-pst-grad-svn15878.1.06-30.fc25.noarch
> texlive-pst-tools-svn34067.0.05-30.fc25.noarch
> texlive-amscls-svn36804.0-30.fc25.noarch
> texlive-tex-gyre-svn18651.2.004-30.fc25.noarch
> texlive-ltxmisc-svn21927.0-30.fc25.noarch
> texlive-xetex-bin-svn41091-30.20160520.fc25.s390x
> lua-posix-33.3.1-3.fc25.s390x
> gssproxy-0.5.1-3.fc25.s390x
> java-1.8.0-openjdk-1.8.0.111-5.b16.fc25.s390x
> libverto-devel-0.2.6-6.fc24.s390x
> mesa-libGLES-13.0.3-1.fc25.s390x
> p11-kit-devel-0.23.2-2.fc24.s390x
> snappy-1.1.3-2.fc24.s390x
> gnutls-devel-3.5.8-1.fc25.s390x
> cairo-gobject-devel-1.14.8-1.fc25.s390x
> usbredir-devel-0.7.1-2.fc24.s390x
> systemtap-3.1-0.20160725git91bfb36.fc25.s390x
> bluez-libs-devel-5.43-1.fc25.s390x
> libcurl-devel-7.51.0-4.fc25.s390x
> cyrus-sasl-devel-2.1.26-26.2.fc24.s390x
> python-libs-2.7.13-1.fc25.s390x
> nss-sysinit-3.28.1-1.3.fc25.s390x
> dnf-1.1.10-5.fc25.noarch
> glusterfs-extra-xlators-3.9.1-1.fc25.s390x
> perl-5.24.1-382.fc25.s390x
> linux-firmware-20161205-69.git91ddce49.fc25.noarch
> libX11-devel-1.6.4-4.fc25.s390x
> kernel-devel-4.9.5-200.fc25.s390x
> python-devel-2.7.13-1.fc25.s390x
> kernel-headers-4.9.5-200.fc25.s390x
> gpg-pubkey-efe550f5-5220ba41
> python-async-0.6.1-9.fc22.s390x
> gpg-pubkey-81b46521-55b3ca9a
> dejavu-sans-mono-fonts-2.35-3.fc24.noarch
> filesystem-3.2-37.fc24.s390x
> popt-1.16-7.fc24.s390x
> libffi-3.1-9.fc24.s390x
> cyrus-sasl-lib-2.1.26-26.2.fc24.s390x
> xz-5.2.2-2.fc24.s390x
> keyutils-libs-1.5.9-8.fc24.s390x
> libnfnetlink-1.0.1-8.fc24.s390x
> libnetfilter_conntrack-1.0.4-6.fc24.s390x
> libtheora-1.1.1-14.fc24.s390x
> xml-common-0.6.3-44.fc24.noarch
> autoconf-2.69-22.fc24.noarch
> libpipeline-1.4.1-2.fc24.s390x
> libXt-1.1.5-3.fc24.s390x
> kbd-legacy-2.0.3-3.fc24.noarch
> ghostscript-fonts-5.50-35.fc24.noarch
> libcroco-0.6.11-2.fc24.s390x
> pinentry-0.9.7-2.fc24.s390x
> libXevie-1.0.3-11.fc24.s390x
> pth-2.0.7-27.fc24.s390x
> python2-rpm-macros-3-10.fc25.noarch
> libsepol-2.5-10.fc25.s390x
> libcap-2.25-2.fc25.s390x
> sqlite-libs-3.14.2-1.fc25.s390x
> mpfr-3.1.5-1.fc25.s390x
> libxcb-1.12-1.fc25.s390x
> libicu-57.1-4.fc25.s390x
> perl-Carp-1.40-365.fc25.noarch
> perl-IO-Socket-IP-0.38-1.fc25.noarch
> libmnl-1.0.4-1.fc25.s390x
> perl-Unicode-EastAsianWidth-1.33-8.fc25.noarch
> perl-Getopt-Long-2.49.1-1.fc25.noarch
> libwayland-cursor-1.12.0-1.fc25.s390x
> coreutils-common-8.25-15.fc25.s390x
> libmount-2.28.2-1.fc25.s390x
> python2-decorator-4.0.10-3.fc25.noarch
> avahi-glib-0.6.32-4.fc25.s390x
> python3-pip-8.1.2-2.fc25.noarch
> python3-libcomps-0.1.7-5.fc25.s390x
> python-slip-0.6.4-4.fc25.noarch
> python-krbV-1.0.90-12.fc25.s390x
> python2-libcomps-0.1.7-5.fc25.s390x
> python2-urllib3-1.15.1-3.fc25.noarch
> fipscheck-1.4.1-11.fc25.s390x
> gc-7.4.4-1.fc25.s390x
> libndp-1.6-1.fc25.s390x
> libsolv-0.6.24-1.fc25.s390x
> gnupg2-2.1.13-2.fc25.s390x
> geoclue2-2.4.4-1.fc25.s390x
> s390utils-cmsfs-1.36.0-1.fc25.s390x
> libXfixes-5.0.3-1.fc25.s390x
> libXi-1.7.8-2.fc25.s390x
> adwaita-icon-theme-3.22.0-1.fc25.noarch
> dconf-0.26.0-1.fc25.s390x
> ncurses-devel-6.0-6.20160709.fc25.s390x
> newt-python-0.52.19-2.fc25.s390x
> perl-Test-Harness-3.36-367.fc25.noarch
> valgrind-3.12.0-1.fc25.s390x
> dejagnu-1.6-1.fc25.noarch
> audit-libs-2.7.1-1.fc25.s390x
> libstdc++-devel-6.3.1-1.fc25.s390x
> emacs-filesystem-25.1-3.fc25.noarch
> libdb-utils-5.3.28-16.fc25.s390x
> libidn2-0.11-1.fc25.s390x
> python3-rpm-4.13.0-6.fc25.s390x
> gnutls-3.5.8-1.fc25.s390x
> python-beautifulsoup4-4.5.3-1.fc25.noarch
> qt5-srpm-macros-5.7.1-1.fc25.noarch
> elfutils-default-yama-scope-0.168-1.fc25.noarch
> device-mapper-1.02.136-3.fc25.s390x
> device-mapper-event-1.02.136-3.fc25.s390x
> systemd-container-231-12.fc25.s390x
> python3-distro-1.0.1-2.fc25.noarch
> fedpkg-1.26-4.fc25.noarch
> gstreamer1-plugins-base-1.10.2-1.fc25.s390x
> subversion-1.9.5-1.fc25.s390x
> perl-Module-CoreList-5.20170115-1.fc25.noarch
> perl-Class-Inspector-1.31-2.fc25.noarch
> libtool-ltdl-2.4.6-13.fc25.s390x
> python2-sssdconfig-1.14.2-2.fc25.noarch
> glib2-devel-2.50.2-1.fc25.s390x
> poppler-0.45.0-2.fc25.s390x
> libbasicobjects-0.1.1-29.fc25.s390x
> libevent-2.0.22-1.fc25.s390x
> libradosstriper1-10.2.4-2.fc25.s390x
> atk-devel-2.22.0-1.fc25.s390x
> libXxf86vm-devel-1.1.4-3.fc24.s390x
> libev-4.24-1.fc25.s390x
> gsm-1.0.16-1.fc25.s390x
> libnfsidmap-0.27-0.fc25.s390x
> zziplib-0.13.62-7.fc24.s390x
> texlive-metafont-svn40793-30.fc25.noarch
> texlive-booktabs-svn40846-30.fc25.noarch
> texlive-dvips-svn41149-30.fc25.noarch
> texlive-zapfding-svn31835.0-30.fc25.noarch
> texlive-graphics-svn41015-30.fc25.noarch
> texlive-latexconfig-svn40274-30.fc25.noarch
> texlive-gsftopk-bin-svn40473-30.20160520.fc25.s390x
> texlive-tex-svn40793-30.fc25.noarch
> texlive-xdvi-bin-svn40750-30.20160520.fc25.s390x
> texlive-qstest-svn15878.0-30.fc25.noarch
> texlive-avantgar-svn31835.0-30.fc25.noarch
> texlive-ncntrsbk-svn31835.0-30.fc25.noarch
> texlive-cm-svn32865.0-30.fc25.noarch
> texlive-rcs-svn15878.0-30.fc25.noarch
> texlive-fix2col-svn38770-30.fc25.noarch
> texlive-lm-math-svn36915.1.959-30.fc25.noarch
> texlive-hyphen-base-svn41138-30.fc25.noarch
> texlive-unicode-data-svn39808-30.fc25.noarch
> texlive-luatex-svn40963-30.fc25.noarch
> texlive-xetex-def-svn40327-30.fc25.noarch
> texlive-varwidth-svn24104.0.92-30.fc25.noarch
> texlive-l3kernel-svn41246-30.fc25.noarch
> texlive-hyperref-svn41396-30.fc25.noarch
> texlive-unicode-math-svn38462-30.fc25.noarch
> texlive-fancyvrb-svn18492.2.8-30.fc25.noarch
> texlive-pst-plot-svn41242-30.fc25.noarch
> texlive-rotating-svn16832.2.16b-30.fc25.noarch
> texlive-pdfpages-svn40638-30.fc25.noarch
> texlive-ae-svn15878.1.4-30.fc25.noarch
> libpaper-1.1.24-12.fc24.s390x
> texlive-collection-latexrecommended-svn35765.0-30.20160520.fc25.noarch
> libini_config-1.3.0-29.fc25.s390x
> xorg-x11-fonts-Type1-7.5-16.fc24.noarch
> pcre2-devel-10.22-8.fc25.s390x
> gnutls-c++-3.5.8-1.fc25.s390x
> systemtap-devel-3.1-0.20160725git91bfb36.fc25.s390x
> libtasn1-devel-4.10-1.fc25.s390x
> pango-devel-1.40.3-1.fc25.s390x
> vte291-devel-0.46.1-1.fc25.s390x
> snappy-devel-1.1.3-2.fc24.s390x
> brlapi-devel-0.6.5-2.fc25.s390x
> man-pages-4.06-3.fc25.noarch
> libcap-ng-devel-0.7.8-1.fc25.s390x
> glusterfs-3.9.1-1.fc25.s390x
> nss-util-devel-3.28.1-1.0.fc25.s390x
> dnf-conf-1.1.10-5.fc25.noarch
> libxkbcommon-devel-0.7.1-1.fc25.s390x
> perl-macros-5.24.1-382.fc25.s390x
> rpcbind-0.2.4-2.fc25.s390x
> pulseaudio-libs-10.0-2.fc25.s390x
> kernel-4.9.5-200.fc25.s390x
> libnl3-cli-3.2.29-2.fc25.s390x
> tzdata-2016j-2.fc25.noarch
> gpg-pubkey-34ec9cba-54e38751
> gpg-pubkey-030d5aed-55b577f0
> basesystem-11-2.fc24.noarch
> libattr-2.4.47-16.fc24.s390x
> libmpc-1.0.2-5.fc24.s390x
> apr-util-1.5.4-3.fc24.s390x
> rsync-3.1.2-2.fc24.s390x
> libunistring-0.9.4-3.fc24.s390x
> jbigkit-libs-2.1-5.fc24.s390x
> pixman-0.34.0-2.fc24.s390x
> acl-2.2.52-11.fc24.s390x
> dwz-0.12-2.fc24.s390x
> expect-5.45-22.fc24.s390x
> libmodman-2.0.1-12.fc24.s390x
> libsigsegv-2.10-10.fc24.s390x
> libvisual-0.4.0-20.fc24.s390x
> fakeroot-libs-1.20.2-4.fc24.s390x
> m17n-lib-1.7.0-5.fc24.s390x
> libpcap-1.7.4-2.fc24.s390x
> libverto-0.2.6-6.fc24.s390x
> lsscsi-0.28-3.fc24.s390x
> setup-2.10.4-1.fc25.noarch
> rpmconf-base-1.0.18-2.fc25.noarch
> bash-4.3.43-4.fc25.s390x
> expat-2.2.0-1.fc25.s390x
> libxml2-2.9.3-4.fc25.s390x
> libgpg-error-1.24-1.fc25.s390x
> nspr-4.13.1-1.fc25.s390x
> libgcrypt-1.6.6-1.fc25.s390x
> file-libs-5.28-4.fc25.s390x
> findutils-4.6.0-8.fc25.s390x
> libjpeg-turbo-1.5.1-0.fc25.s390x
> kmod-23-1.fc25.s390x
> libassuan-2.4.3-1.fc25.s390x
> libusbx-1.0.21-1.fc25.s390x
> newt-0.52.19-2.fc25.s390x
> libxslt-1.1.28-13.fc25.s390x
> libmetalink-0.1.3-1.fc25.s390x
> perl-Socket-2.024-1.fc25.s390x
> perl-File-Path-2.12-365.fc25.noarch
> perl-MIME-Base64-3.15-365.fc25.s390x
> perl-HTTP-Tiny-0.070-1.fc25.noarch
> ncurses-6.0-6.20160709.fc25.s390x
> libwayland-server-1.12.0-1.fc25.s390x
> ipset-6.29-1.fc25.s390x
> perl-Text-Unidecode-1.27-3.fc25.noarch
> perl-Fedora-VSP-0.001-4.fc25.noarch
> perl-libintl-perl-1.26-1.fc25.s390x
> plymouth-core-libs-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
> hunspell-1.4.1-1.fc25.s390x
> which-2.21-1.fc25.s390x
> coreutils-8.25-15.fc25.s390x
> python2-setuptools-25.1.1-1.fc25.noarch
> shadow-utils-4.2.1-11.fc25.s390x
> atk-2.22.0-1.fc25.s390x
> system-python-3.5.2-4.fc25.s390x
> pam-1.3.0-1.fc25.s390x
> python2-pyasn1-0.1.9-7.fc25.1.noarch
> harfbuzz-icu-1.3.2-1.fc25.s390x
> gsettings-desktop-schemas-3.22.0-1.fc25.s390x
> libsecret-0.18.5-2.fc25.s390x
> s390utils-iucvterm-1.36.0-1.fc25.s390x
> python3-setuptools-25.1.1-1.fc25.noarch
> python3-decorator-4.0.10-3.fc25.noarch
> python3-slip-0.6.4-4.fc25.noarch
> python3-magic-5.28-4.fc25.noarch
> python3-requests-2.10.0-4.fc25.noarch
> python3-systemd-232-1.fc25.s390x
> pyusb-1.0.0-2.fc25.noarch
> python-slip-dbus-0.6.4-4.fc25.noarch
> python-enum34-1.0.4-6.fc25.noarch
> python-lockfile-0.11.0-4.fc25.noarch
> python2-ply-3.8-2.fc25.noarch
> pyOpenSSL-16.0.0-2.fc25.noarch
> python2-requests-2.10.0-4.fc25.noarch
> pyxattr-0.5.3-8.fc25.s390x
> libarchive-3.2.2-1.fc25.s390x
> libkadm5-1.14.4-4.fc25.s390x
> dtc-1.4.2-1.fc25.s390x
> libbabeltrace-1.4.0-3.fc25.s390x
> guile-2.0.13-1.fc25.s390x
> libthai-0.1.25-1.fc25.s390x
> libnghttp2-1.13.0-2.fc25.s390x
> deltarpm-3.6-17.fc25.s390x
> python-urlgrabber-3.10.1-9.fc25.noarch
> iputils-20161105-1.fc25.s390x
> s390utils-mon_statd-1.36.0-1.fc25.s390x
> cryptsetup-libs-1.7.2-3.fc25.s390x
> device-mapper-multipath-0.4.9-83.fc25.s390x
> cronie-anacron-1.5.1-2.fc25.s390x
> ghostscript-core-9.20-5.fc25.s390x
> python3-pygpgme-0.3-18.fc25.s390x
> rest-0.8.0-1.fc25.s390x
> libreport-filesystem-2.8.0-1.fc25.s390x
> libXtst-1.2.3-1.fc25.s390x
> iso-codes-3.70-1.fc25.noarch
> ghc-srpm-macros-1.4.2-4.fc25.noarch
> adwaita-cursor-theme-3.22.0-1.fc25.noarch
> rpmdevtools-8.9-1.fc25.noarch
> kernel-4.8.8-300.fc25.s390x
> python-dnf-plugins-extras-migrate-0.0.12-4.fc25.noarch
> s390utils-1.36.0-1.fc25.s390x
> authconfig-6.2.10-14.fc25.s390x
> fedora-cert-0.6.0.1-1.fc25.noarch
> glibc-2.24-4.fc25.s390x
> elfutils-libelf-0.168-1.fc25.s390x
> libstdc++-6.3.1-1.fc25.s390x
> perl-Scalar-List-Utils-1.47-1.fc25.s390x
> gdb-headless-7.12-36.fc25.s390x
> bzip2-1.0.6-21.fc25.s390x
> bind-license-9.10.4-4.P5.fc25.noarch
> pcre-cpp-8.40-1.fc25.s390x
> perl-threads-2.12-1.fc25.s390x
> subversion-libs-1.9.5-1.fc25.s390x
> libss-1.43.3-1.fc25.s390x
> shared-mime-info-1.8-1.fc25.s390x
> libselinux-utils-2.5-13.fc25.s390x
> libgfortran-6.3.1-1.fc25.s390x
> rpm-4.13.0-6.fc25.s390x
> python2-rpm-4.13.0-6.fc25.s390x
> policycoreutils-2.5-19.fc25.s390x
> libtasn1-4.10-1.fc25.s390x
> mesa-libwayland-egl-13.0.3-1.fc25.s390x
> pigz-2.3.4-1.fc25.s390x
> koji-1.11.0-1.fc25.noarch
> python3-enchant-1.6.8-1.fc25.noarch
> mariadb-common-10.1.20-1.fc25.s390x
> firewalld-filesystem-0.4.4.2-2.fc25.noarch
> systemd-231-12.fc25.s390x
> device-mapper-libs-1.02.136-3.fc25.s390x
> systemd-udev-231-12.fc25.s390x
> dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch
> mesa-libEGL-13.0.3-1.fc25.s390x
> dnsmasq-2.76-2.fc25.s390x
> distribution-gpg-keys-1.9-1.fc25.noarch
> bind-libs-lite-9.10.4-4.P5.fc25.s390x
> mock-1.3.3-1.fc25.noarch
> python2-dockerfile-parse-0.0.5-7.fc25.noarch
> fedora-packager-0.6.0.1-1.fc25.noarch
> openssl-1.0.2j-3.fc25.s390x
> lvm2-2.02.167-3.fc25.s390x
> systemd-bootchart-231-2.fc25.s390x
> gcc-c++-6.3.1-1.fc25.s390x
> texlive-base-2016-30.20160520.fc25.noarch
> boost-system-1.60.0-10.fc25.s390x
> pcre2-10.22-8.fc25.s390x
> libpng-devel-1.6.27-1.fc25.s390x
> perl-XML-Parser-2.44-5.fc25.s390x
> libtirpc-1.0.1-3.rc3.fc25.s390x
> lttng-ust-2.8.1-2.fc25.s390x
> libasyncns-0.8-10.fc24.s390x
> unbound-libs-1.5.10-1.fc25.s390x
> libradosstriper-devel-10.2.4-2.fc25.s390x
> systemtap-runtime-3.1-0.20160725git91bfb36.fc25.s390x
> libXau-devel-1.0.8-6.fc24.s390x
> libXfixes-devel-5.0.3-1.fc25.s390x
> mesa-libEGL-devel-13.0.3-1.fc25.s390x
> libXcomposite-devel-0.4.4-8.fc24.s390x
> libverto-libev-0.2.6-6.fc24.s390x
> texlive-kpathsea-doc-svn41139-30.fc25.noarch
> flac-libs-1.3.2-1.fc25.s390x
> quota-nls-4.03-7.fc25.noarch
> python3-html5lib-0.999-9.fc25.noarch
> python3-javapackages-4.7.0-6.1.fc25.noarch
> perl-Digest-1.17-366.fc25.noarch
> texlive-texlive.infra-svn41280-30.fc25.noarch
> texlive-tetex-svn41059-30.fc25.noarch
> texlive-amsfonts-svn29208.3.04-30.fc25.noarch
> texlive-etex-pkg-svn39355-30.fc25.noarch
> texlive-lm-svn28119.2.004-30.fc25.noarch
> texlive-fp-svn15878.0-30.fc25.noarch
> texlive-mptopdf-svn41282-30.fc25.noarch
> texlive-euler-svn17261.2.5-30.fc25.noarch
> texlive-setspace-svn24881.6.7a-30.fc25.noarch
> texlive-tools-svn40934-30.fc25.noarch
> texlive-colortbl-svn29803.v1.0a-30.fc25.noarch
> texlive-natbib-svn20668.8.31b-30.fc25.noarch
> texlive-bibtex-svn40768-30.fc25.noarch
> texlive-gsftopk-svn40768-30.fc25.noarch
> texlive-mfware-svn40768-30.fc25.noarch
> texlive-tex-ini-files-svn40533-30.fc25.noarch
> texlive-texconfig-bin-svn29741.0-30.20160520.fc25.noarch
> libXmu-1.1.2-4.fc24.s390x
> libXcursor-1.1.14-6.fc24.s390x
> kbd-misc-2.0.3-3.fc24.noarch
> libutempter-1.1.6-8.fc24.s390x
> python-kitchen-1.2.4-2.fc24.noarch
> polkit-libs-0.113-5.fc24.s390x
> libgudev-230-3.fc24.s390x
> popt-devel-1.16-7.fc24.s390x
> make-4.1-5.fc24.s390x
> fakeroot-1.20.2-4.fc24.s390x
> blktrace-1.1.0-3.fc24.s390x
> hicolor-icon-theme-0.15-3.fc24.noarch
> usermode-1.111-8.fc24.s390x
> kbd-2.0.3-3.fc24.s390x
> libaio-devel-0.3.110-6.fc24.s390x
> web-assets-filesystem-5-4.fc24.noarch
> perl-IO-Socket-SSL-2.038-1.fc25.noarch
> python-backports-ssl_match_hostname-3.5.0.1-3.fc25.noarch
> mc-4.8.18-2.fc25.s390x
> expat-devel-2.2.0-1.fc25.s390x
> automake-1.15-7.fc25.noarch
> perl-File-ShareDir-1.102-7.fc25.noarch
> lua-5.3.3-3.fc25.s390x
> tcl-8.6.6-1.fc25.s390x
> gcc-objc-6.3.1-1.fc25.s390x
> libselinux-devel-2.5-13.fc25.s390x
> e2fsprogs-1.43.3-1.fc25.s390x
> perl-Storable-2.56-367.fc25.s390x
> libstdc++-static-6.3.1-1.fc25.s390x
> perl-Time-Local-1.250-1.fc25.noarch
> libwebp-0.5.2-1.fc25.s390x
> xkeyboard-config-2.19-1.1.fc25.noarch
> python-firewall-0.4.4.2-2.fc25.noarch
> texlive-xdvi-svn40768-30.fc25.noarch
> texlive-wasy2-ps-svn35830.0-30.fc25.noarch
> texlive-ltabptch-svn17533.1.74d-30.fc25.noarch
> texlive-sauerj-svn15878.0-30.fc25.noarch
> texlive-bookman-svn31835.0-30.fc25.noarch
> texlive-courier-svn35058.0-30.fc25.noarch
> texlive-mflogo-font-svn36898.1.002-30.fc25.noarch
> texlive-rsfs-svn15878.0-30.fc25.noarch
> texlive-zapfchan-svn31835.0-30.fc25.noarch
> texlive-cmap-svn41168-30.fc25.noarch
> texlive-parskip-svn19963.2.0-30.fc25.noarch
> texlive-sepnum-svn20186.2.0-30.fc25.noarch
> texlive-fancyhdr-svn15878.3.1-30.fc25.noarch
> texlive-pspicture-svn15878.0-30.fc25.noarch
> texlive-fpl-svn15878.1.002-30.fc25.noarch
> texlive-utopia-svn15878.0-30.fc25.noarch
> texlive-hyph-utf8-svn41189-30.fc25.noarch
> texlive-lua-alt-getopt-svn29349.0.7.0-30.fc25.noarch
> texlive-texlive-msg-translations-svn41431-30.fc25.noarch
> texlive-parallel-svn15878.0-30.fc25.noarch
> texlive-luatex-bin-svn41091-30.20160520.fc25.s390x
> texlive-lineno-svn21442.4.41-30.fc25.noarch
> texlive-kastrup-svn15878.0-30.fc25.noarch
> texlive-chngcntr-svn17157.1.0a-30.fc25.noarch
> texlive-lualibs-svn40370-30.fc25.noarch
> texlive-xunicode-svn30466.0.981-30.fc25.noarch
> texlive-l3packages-svn41246-30.fc25.noarch
> texlive-pgf-svn40966-30.fc25.noarch
> texlive-koma-script-svn41508-30.fc25.noarch
> texlive-currfile-svn40725-30.fc25.noarch
> texlive-luaotfload-svn40902-30.fc25.noarch
> texlive-ifplatform-svn21156.0.4-30.fc25.noarch
> texlive-showexpl-svn32737.v0.3l-30.fc25.noarch
> texlive-pst-3d-svn17257.1.10-30.fc25.noarch
> texlive-pst-node-svn40743-30.fc25.noarch
> texlive-pstricks-add-svn40744-30.fc25.noarch
> texlive-pst-pdf-svn31660.1.1v-30.fc25.noarch
> texlive-latex-bin-svn41438-30.fc25.noarch
> texlive-powerdot-svn38984-30.fc25.noarch
> texlive-sansmathaccent-svn30187.0-30.fc25.noarch
> texlive-typehtml-svn17134.0-30.fc25.noarch
> texlive-ucs-svn35853.2.2-30.fc25.noarch
> teckit-2.5.1-15.fc24.s390x
> texlive-dvipdfmx-svn41149-30.fc25.noarch
> texlive-collection-latex-svn41011-30.20160520.fc25.noarch
> netpbm-10.76.00-2.fc25.s390x
> libpath_utils-0.2.1-29.fc25.s390x
> nfs-utils-1.3.4-1.rc3.fc25.s390x
> ttmkfdir-3.0.9-48.fc24.s390x
> libcephfs_jni-devel-10.2.4-2.fc25.s390x
> pcre2-utf16-10.22-8.fc25.s390x
> keyutils-libs-devel-1.5.9-8.fc24.s390x
> libicu-devel-57.1-4.fc25.s390x
> attr-2.4.47-16.fc24.s390x
> harfbuzz-devel-1.3.2-1.fc25.s390x
> libidn-devel-1.33-1.fc25.s390x
> usbredir-0.7.1-2.fc24.s390x
> libnfs-1.9.8-2.fc24.s390x
> SDL2-2.0.5-2.fc25.s390x
> freetype-devel-2.6.5-1.fc25.s390x
> cairo-devel-1.14.8-1.fc25.s390x
> libepoxy-devel-1.3.1-3.fc25.s390x
> libcacard-devel-2.5.2-2.fc24.s390x
> lzo-devel-2.08-8.fc24.s390x
> libssh2-devel-1.8.0-1.fc25.s390x
> pcre-static-8.40-1.fc25.s390x
> qemu-sanity-check-nodeps-1.1.5-5.fc24.s390x
> libcap-devel-2.25-2.fc25.s390x
> alsa-lib-devel-1.1.1-2.fc25.s390x
> nss-util-3.28.1-1.0.fc25.s390x
> glusterfs-client-xlators-3.9.1-1.fc25.s390x
> nss-softokn-freebl-3.28.1-1.0.fc25.s390x
> libnl3-3.2.29-2.fc25.s390x
> python3-hawkey-0.6.3-6.1.fc25.s390x
> git-core-doc-2.9.3-2.fc25.s390x
> glusterfs-fuse-3.9.1-1.fc25.s390x
> gdk-pixbuf2-devel-2.36.4-1.fc25.s390x
> perl-Errno-1.25-382.fc25.s390x
> git-2.9.3-2.fc25.s390x
> glusterfs-server-3.9.1-1.fc25.s390x
> kernel-modules-4.9.5-200.fc25.s390x
> pulseaudio-libs-glib2-10.0-2.fc25.s390x
> libpsl-0.17.0-1.fc25.s390x
> glusterfs-api-devel-3.9.1-1.fc25.s390x
> nss-devel-3.28.1-1.3.fc25.s390x
> wpa_supplicant-2.6-1.fc25.s390x
> xemacs-filesystem-21.5.34-19.20170114hgd0e8ec0fe015.fc25.noarch
> opus-1.1.3-2.fc25.s390x
> copy-jdk-configs-2.0-1.fc25.noarch
> gpg-pubkey-a0a7badb-52844296
> fontpackages-filesystem-1.44-17.fc24.noarch
> readline-6.3-8.fc24.s390x
> cpio-2.12-3.fc24.s390x
> groff-base-1.22.3-8.fc24.s390x
> ilmbase-2.2.0-5.fc24.s390x
> p11-kit-trust-0.23.2-2.fc24.s390x
> OpenEXR-libs-2.2.0-5.fc24.s390x
> hesiod-3.2.1-6.fc24.s390x
> sysfsutils-2.1.0-19.fc24.s390x
> qrencode-libs-3.4.2-6.fc24.s390x
> GeoIP-1.6.9-2.fc24.s390x
> ocaml-srpm-macros-2-4.fc24.noarch
> libXcomposite-0.4.4-8.fc24.s390x
> procps-ng-3.3.10-11.fc24.s390x
> GConf2-3.2.6-16.fc24.s390x
> mailx-12.5-19.fc24.s390x
> xz-devel-5.2.2-2.fc24.s390x
> fedora-logos-22.0.0-3.fc24.s390x
> telnet-0.17-65.fc24.s390x
> gpg-pubkey-e372e838-56fd7943
> fedora-repos-25-1.noarch
> ncurses-libs-6.0-6.20160709.fc25.s390x
> lua-libs-5.3.3-3.fc25.s390x
> kmod-libs-23-1.fc25.s390x
> libseccomp-2.3.1-1.fc25.s390x
> perl-parent-0.236-1.fc25.noarch
> libICE-1.0.9-5.fc25.s390x
> ipset-libs-6.29-1.fc25.s390x
> perl-TermReadKey-2.37-1.fc25.s390x
> dhcp-libs-4.3.5-1.fc25.s390x
> gmp-devel-6.1.1-1.fc25.s390x
> ncurses-c++-libs-6.0-6.20160709.fc25.s390x
> python-pip-8.1.2-2.fc25.noarch
> gzip-1.8-1.fc25.s390x
> harfbuzz-1.3.2-1.fc25.s390x
> python2-iniparse-0.4-20.fc25.noarch
> libfdisk-2.28.2-1.fc25.s390x
> python3-iniparse-0.4-20.fc25.noarch
> python3-gobject-base-3.22.0-1.fc25.s390x
> python3-kickstart-2.32-1.fc25.noarch
> python2-yubico-1.3.2-3.fc25.noarch
> python-idna-2.0-4.fc25.noarch
> nss-pem-1.0.2-2.fc25.s390x
> perl-Net-SSLeay-1.78-1.fc25.s390x
> krb5-workstation-1.14.4-4.fc25.s390x
> libepoxy-1.3.1-3.fc25.s390x
> drpm-0.3.0-3.fc25.s390x
> libsmartcols-2.28.2-1.fc25.s390x
> s390utils-ziomon-1.36.0-1.fc25.s390x
> librepo-1.7.18-3.fc25.s390x
> glib-networking-2.50.0-1.fc25.s390x
> librsvg2-2.40.16-2.fc25.s390x
> gnat-srpm-macros-4-1.fc25.noarch
> webkitgtk3-2.4.11-3.fc25.s390x
> libXaw-1.0.13-4.fc25.s390x
> sudo-1.8.18p1-1.fc25.s390x
> systemtap-sdt-devel-3.1-0.20160725git91bfb36.fc25.s390x
> xorg-x11-font-utils-7.5-32.fc25.s390x
> python-decoratortools-1.8-12.fc25.noarch
> m17n-db-1.7.0-7.fc25.noarch
> hardlink-1.1-1.fc25.s390x
> glibc-common-2.24-4.fc25.s390x
> libcom_err-1.43.3-1.fc25.s390x
> grep-2.27-1.fc25.s390x
> iproute-4.6.0-6.fc25.s390x
> e2fsprogs-libs-1.43.3-1.fc25.s390x
> curl-7.51.0-4.fc25.s390x
> libvorbis-1.3.5-1.fc25.s390x
> python2-dateutil-2.6.0-1.fc25.noarch
> python3-firewall-0.4.4.2-2.fc25.noarch
> libXpm-3.5.12-1.fc25.s390x
> systemd-pam-231-12.fc25.s390x
> mesa-libgbm-13.0.3-1.fc25.s390x
> rpm-build-4.13.0-6.fc25.s390x
> openssl-libs-1.0.2j-3.fc25.s390x
> python2-smmap-2.0.1-1.fc25.noarch
> bind99-libs-9.9.9-4.P5.fc25.s390x
> kernel-4.9.3-200.fc25.s390x
> gcc-gdb-plugin-6.3.1-1.fc25.s390x
> selinux-policy-targeted-3.13.1-225.6.fc25.noarch
> perl-Time-HiRes-1.9741-1.fc25.s390x
> npth-1.3-1.fc25.s390x
> poppler-data-0.4.7-6.fc25.noarch
> nspr-devel-4.13.1-1.fc25.s390x
> libcephfs1-10.2.4-2.fc25.s390x
> wayland-devel-1.12.0-1.fc25.s390x
> librbd1-10.2.4-2.fc25.s390x
> libxcb-devel-1.12-1.fc25.s390x
> mesa-libGL-devel-13.0.3-1.fc25.s390x
> perl-encoding-2.19-5.fc25.s390x
> libsndfile-1.0.27-1.fc25.s390x
> python3-cssselect-0.9.2-1.fc25.noarch
> perl-Digest-MD5-2.55-2.fc25.s390x
> texlive-tetex-bin-svn36770.0-30.20160520.fc25.noarch
> texlive-etoolbox-svn38031.2.2a-30.fc25.noarch
> texlive-babel-svn40706-30.fc25.noarch
> texlive-fancybox-svn18304.1.4-30.fc25.noarch
> texlive-xkeyval-svn35741.2.7a-30.fc25.noarch
> texlive-pdftex-def-svn22653.0.06d-30.fc25.noarch
> texlive-makeindex-bin-svn40473-30.20160520.fc25.s390x
> texlive-pdftex-bin-svn40987-30.20160520.fc25.s390x
> texlive-pst-ovl-svn40873-30.fc25.noarch
> texlive-crop-svn15878.1.5-30.fc25.noarch
> texlive-manfnt-font-svn35799.0-30.fc25.noarch
> texlive-txfonts-svn15878.0-30.fc25.noarch
> texlive-ntgclass-svn15878.2.1a-30.fc25.noarch
> texlive-dvisvgm-def-svn41011-30.fc25.noarch
> texlive-ec-svn25033.1.0-30.fc25.noarch
> texlive-etex-svn37057.0-30.fc25.noarch
> texlive-texlive-en-svn41185-30.fc25.noarch
> texlive-graphics-def-svn41879-30.fc25.noarch
> texlive-iftex-svn29654.0.2-30.fc25.noarch
> texlive-pst-math-svn34786.0.63-30.fc25.noarch
> texlive-bera-svn20031.0-30.fc25.noarch
> texlive-ms-svn29849.0-30.fc25.noarch
> texlive-luaotfload-bin-svn34647.0-30.20160520.fc25.noarch
> texlive-listings-svn37534.1.6-30.fc25.noarch
> texlive-pst-fill-svn15878.1.01-30.fc25.noarch
> texlive-pst-pdf-bin-svn7838.0-30.20160520.fc25.noarch
> texlive-pst-slpe-svn24391.1.31-30.fc25.noarch
> texlive-seminar-svn34011.1.62-30.fc25.noarch
> texlive-l3experimental-svn41163-30.fc25.noarch
> texlive-collection-fontsrecommended-svn35830.0-30.20160520.fc25.noarch
> gettext-libs-0.19.8.1-3.fc25.s390x
> java-1.8.0-openjdk-headless-1.8.0.111-5.b16.fc25.s390x
> pcre2-utf32-10.22-8.fc25.s390x
> at-spi2-atk-devel-2.22.0-1.fc25.s390x
> wayland-protocols-devel-1.7-1.fc25.noarch
> virglrenderer-0.5.0-1.20160411git61846f92f.fc25.s390x
> libcacard-2.5.2-2.fc24.s390x
> pixman-devel-0.34.0-2.fc24.s390x
> libacl-devel-2.2.52-11.fc24.s390x
> libnfs-devel-1.9.8-2.fc24.s390x
> texi2html-5.0-4.fc24.noarch
> libseccomp-devel-2.3.1-1.fc25.s390x
> perl-libs-5.24.1-382.fc25.s390x
> libxkbcommon-0.7.1-1.fc25.s390x
> git-core-2.9.3-2.fc25.s390x
> nss-softokn-freebl-devel-3.28.1-1.0.fc25.s390x
> gtk-update-icon-cache-3.22.7-1.fc25.s390x
> vim-filesystem-8.0.206-1.fc25.s390x
> libX11-common-1.6.4-4.fc25.noarch
> gtk3-devel-3.22.7-1.fc25.s390x
> python2-dnf-1.1.10-5.fc25.noarch
> vim-minimal-8.0.206-1.fc25.s390x
> GeoIP-GeoLite-data-2017.01-1.fc25.noarch
> gpg-pubkey-95a43f54-5284415a
> dejavu-fonts-common-2.35-3.fc24.noarch
> libSM-1.2.2-4.fc24.s390x
> diffutils-3.3-13.fc24.s390x
> libogg-1.3.2-5.fc24.s390x
> hunspell-en-US-0.20140811.1-5.fc24.noarch
> libdaemon-0.14-10.fc24.s390x
> patch-2.7.5-3.fc24.s390x
> libsysfs-2.1.0-19.fc24.s390x
> procmail-3.22-39.fc24.s390x
> libXdamage-1.1.4-8.fc24.s390x
> libotf-0.9.13-7.fc24.s390x
> urw-fonts-2.4-22.fc24.noarch
> crontabs-1.11-12.20150630git.fc24.noarch
> ppp-2.4.7-9.fc24.s390x
> polkit-0.113-5.fc24.s390x
> cyrus-sasl-2.1.26-26.2.fc24.s390x
> zlib-devel-1.2.8-10.fc24.s390x
> time-1.7-49.fc24.s390x
> gpg-pubkey-fdb19c98-56fd6333
> fedora-release-25-1.noarch
> freetype-2.6.5-1.fc25.s390x
> libcap-ng-0.7.8-1.fc25.s390x
> gdbm-1.12-1.fc25.s390x
> binutils-2.26.1-1.fc25.s390x
> lcms2-2.8-2.fc25.s390x
> libcomps-0.1.7-5.fc25.s390x
> less-481-6.fc25.s390x
> apr-1.5.2-4.fc25.s390x
> perl-constant-1.33-367.fc25.noarch
> perl-Data-Dumper-2.161-1.fc25.s390x
> ipcalc-0.1.8-1.fc25.s390x
> perl-Pod-Perldoc-3.27-1.fc25.noarch
> libteam-1.26-1.fc25.s390x
> gmp-c++-6.1.1-1.fc25.s390x
> fontconfig-2.12.1-1.fc25.s390x
> enchant-1.6.0-14.fc25.s390x
> json-glib-1.2.2-1.fc25.s390x
> pyliblzma-0.5.3-16.fc25.s390x
> libsepol-devel-2.5-10.fc25.s390x
> python3-libs-3.5.2-4.fc25.s390x
> python3-ordered-set-2.0.0-4.fc25.noarch
> python3-rpmconf-1.0.18-2.fc25.noarch
> python-ipaddress-1.0.16-3.fc25.noarch
> python2-kerberos-1.2.5-1.fc25.s390x
> python2-pysocks-1.5.6-5.fc25.noarch
> fipscheck-lib-1.4.1-11.fc25.s390x
> libatomic_ops-7.4.4-1.fc25.s390x
> net-snmp-agent-libs-5.7.3-13.fc25.s390x
> util-linux-2.28.2-1.fc25.s390x
> dracut-044-78.fc25.s390x
> python2-pygpgme-0.3-18.fc25.s390x
> libsoup-2.56.0-2.fc25.s390x
> orc-0.4.26-1.fc25.s390x
> yum-utils-1.1.31-511.fc25.noarch
> libXrender-0.9.10-1.fc25.s390x
> libXrandr-1.5.1-1.fc25.s390x
> go-srpm-macros-2-7.fc25.noarch
> gnupg2-smime-2.1.13-2.fc25.s390x
> guile-devel-2.0.13-1.fc25.s390x
> uboot-tools-2016.09.01-2.fc25.s390x
> pykickstart-2.32-1.fc25.noarch
> python-bunch-1.0.1-9.fc25.noarch
> perl-generators-1.10-1.fc25.noarch
> perl-Mozilla-CA-20160104-3.fc25.noarch
> glibc-all-langpacks-2.24-4.fc25.s390x
> bzip2-libs-1.0.6-21.fc25.s390x
> libpng-1.6.27-1.fc25.s390x
> libtiff-4.0.7-1.fc25.s390x
> desktop-file-utils-0.23-2.fc25.s390x
> python2-cccolutils-1.4-1.fc25.s390x
> libcurl-7.51.0-4.fc25.s390x
> rpm-plugin-systemd-inhibit-4.13.0-6.fc25.s390x
> cups-libs-2.2.0-5.fc25.s390x
> python2-lxml-3.7.2-1.fc25.s390x
> redhat-rpm-config-45-1.fc25.noarch
> elfutils-libs-0.168-1.fc25.s390x
> device-mapper-event-libs-1.02.136-3.fc25.s390x
> lvm2-libs-2.02.167-3.fc25.s390x
> elfutils-0.168-1.fc25.s390x
> openssh-7.4p1-1.fc25.s390x
> python2-gitdb-2.0.0-1.fc25.noarch
> openssh-server-7.4p1-1.fc25.s390x
> gcc-gfortran-6.3.1-1.fc25.s390x
> rpm-devel-4.13.0-6.fc25.s390x
> libselinux-python-2.5-13.fc25.s390x
> openjpeg2-2.1.2-3.fc25.s390x
> js-jquery-2.2.4-1.fc25.noarch
> boost-thread-1.60.0-10.fc25.s390x
> json-c-0.12-7.fc24.s390x
> ghostscript-x11-9.20-5.fc25.s390x
> libdrm-devel-2.4.74-1.fc25.s390x
> libuuid-devel-2.28.2-1.fc25.s390x
> librbd-devel-10.2.4-2.fc25.s390x
> libXcursor-devel-1.1.14-6.fc24.s390x
> python3-beautifulsoup4-4.5.3-1.fc25.noarch
> texlive-kpathsea-svn41139-30.fc25.noarch
> texlive-amsmath-svn41561-30.fc25.noarch
> texlive-thumbpdf-svn34621.3.16-30.fc25.noarch
> texlive-multido-svn18302.1.42-30.fc25.noarch
> texlive-float-svn15878.1.3d-30.fc25.noarch
> texlive-psnfss-svn33946.9.2a-30.fc25.noarch
> texlive-wasy-svn35831.0-30.fc25.noarch
> texlive-makeindex-svn40768-30.fc25.noarch
> texlive-pdftex-svn41149-30.fc25.noarch
> texlive-enumitem-svn24146.3.5.2-30.fc25.noarch
> texlive-microtype-svn41127-30.fc25.noarch
> texlive-helvetic-svn31835.0-30.fc25.noarch
> texlive-times-svn35058.0-30.fc25.noarch
> texlive-mdwtools-svn15878.1.05.4-30.fc25.noarch
> texlive-babel-english-svn30264.3.3p-30.fc25.noarch
> texlive-cmextra-svn32831.0-30.fc25.noarch
> texlive-enctex-svn34957.0-30.fc25.noarch
> texlive-texlive-docindex-svn41430-30.fc25.noarch
> texlive-ifetex-svn24853.1.2-30.fc25.noarch
> texlive-mparhack-svn15878.1.4-30.fc25.noarch
> texlive-paralist-svn39247-30.fc25.noarch
> texlive-algorithms-svn38085.0.1-30.fc25.noarch
> texlive-geometry-svn19716.5.6-30.fc25.noarch
> texlive-fontspec-svn41262-30.fc25.noarch
> texlive-oberdiek-svn41346-30.fc25.noarch
> texlive-pst-eps-svn15878.1.0-30.fc25.noarch
> texlive-pstricks-svn41321-30.fc25.noarch
> texlive-pst-blur-svn15878.2.0-30.fc25.noarch
> texlive-jknapltx-svn19440.0-30.fc25.noarch
> texlive-breqn-svn38099.0.98d-30.fc25.noarch
> texlive-collection-basic-svn41149-30.20160520.fc25.noarch
> latex2html-2012-7.fc24.noarch
> lksctp-tools-1.0.16-5.fc24.s390x
> vte291-0.46.1-1.fc25.s390x
> openssl-devel-1.0.2j-3.fc25.s390x
> at-spi2-core-devel-2.22.0-1.fc25.s390x
> libfdt-1.4.2-1.fc25.s390x
> libXft-devel-2.3.2-4.fc24.s390x
> libattr-devel-2.4.47-16.fc24.s390x
> libiscsi-devel-1.15.0-2.fc24.s390x
> gettext-0.19.8.1-3.fc25.s390x
> libjpeg-turbo-devel-1.5.1-0.fc25.s390x
> glusterfs-libs-3.9.1-1.fc25.s390x
> glusterfs-api-3.9.1-1.fc25.s390x
> hawkey-0.6.3-6.1.fc25.s390x
> nss-softokn-devel-3.28.1-1.0.fc25.s390x
> glusterfs-cli-3.9.1-1.fc25.s390x
> vim-common-8.0.206-1.fc25.s390x
> libX11-1.6.4-4.fc25.s390x
> pulseaudio-libs-devel-10.0-2.fc25.s390x
> dnf-yum-1.1.10-5.fc25.noarch
> tzdata-java-2016j-2.fc25.noarch
> ccache-3.3.3-1.fc25.s390x
> gpg-pubkey-8e1431d5-53bcbac7
> zlib-1.2.8-10.fc24.s390x
> sed-4.2.2-15.fc24.s390x
> p11-kit-0.23.2-2.fc24.s390x
> psmisc-22.21-8.fc24.s390x
> gpm-libs-1.20.7-9.fc24.s390x
> zip-3.0-16.fc24.s390x
> hostname-3.15-7.fc24.s390x
> libyubikey-1.13-2.fc24.s390x
> sg3_utils-libs-1.41-3.fc24.s390x
> polkit-pkla-compat-0.1-7.fc24.s390x
> passwd-0.79-8.fc24.s390x
> trousers-0.3.13-6.fc24.s390x
> grubby-8.40-3.fc24.s390x
> rootfiles-8.1-19.fc24.noarch
> python-rpm-macros-3-10.fc25.noarch
> info-6.1-3.fc25.s390x
> libuuid-2.28.2-1.fc25.s390x
> iptables-libs-1.6.0-2.fc25.s390x
> nettle-3.3-1.fc25.s390x
> jansson-2.9-1.fc25.s390x
> libksba-1.3.5-1.fc25.s390x
> perl-Text-ParseWords-3.30-365.fc25.noarch
> perl-PathTools-3.63-366.fc25.s390x
> perl-File-Temp-0.23.04-365.fc25.noarch
> fuse-libs-2.9.7-1.fc25.s390x
> perl-Pod-Escapes-1.07-365.fc25.noarch
> perl-Term-ANSIColor-4.05-2.fc25.noarch
> perl-URI-1.71-5.fc25.noarch
> libXfont-1.5.2-1.fc25.s390x
> crypto-policies-20160921-2.git75b9b04.fc25.noarch
> python-six-1.10.0-3.fc25.noarch
> dbus-glib-0.108-1.fc25.s390x
> gobject-introspection-1.50.0-1.fc25.s390x
> libpwquality-1.3.0-6.fc25.s390x
> python-gobject-base-3.22.0-1.fc25.s390x
> python-html5lib-0.999-9.fc25.noarch
> python3-dbus-1.2.4-2.fc25.s390x
> python3-chardet-2.3.0-1.fc25.noarch
> python3-urllib3-1.15.1-3.fc25.noarch
> python-offtrac-0.1.0-7.fc25.noarch
> python2-cryptography-1.5.3-3.fc25.s390x
> python2-requests-kerberos-0.10.0-2.fc25.noarch
> libserf-1.3.9-1.fc25.s390x
> libdatrie-0.2.9-3.fc25.s390x
> s390utils-base-1.36.0-1.fc25.s390x
> kpartx-0.4.9-83.fc25.s390x
> s390utils-cpuplugd-1.36.0-1.fc25.s390x
> rpmconf-1.0.18-2.fc25.noarch
> s390utils-osasnmpd-1.36.0-1.fc25.s390x
> python-dnf-plugins-extras-common-0.0.12-4.fc25.noarch
> pango-1.40.3-1.fc25.s390x
> fpc-srpm-macros-1.0-1.fc25.noarch
> kernel-core-4.8.8-300.fc25.s390x
> fedora-upgrade-25.2-1.fc25.noarch
> net-tools-2.0-0.38.20160329git.fc25.s390x
> libuser-0.62-4.fc25.s390x
> screen-4.4.0-4.fc25.s390x
> man-db-2.7.5-3.fc25.s390x
> sqlite-3.14.2-1.fc25.s390x
> python-systemd-doc-232-1.fc25.s390x
> pcre-8.40-1.fc25.s390x
> libdb-5.3.28-16.fc25.s390x
> lz4-1.7.5-1.fc25.s390x
> tar-1.29-3.fc25.s390x
> emacs-common-25.1-3.fc25.s390x
> perl-threads-shared-1.54-1.fc25.s390x
> unzip-6.0-31.fc25.s390x
> mesa-libglapi-13.0.3-1.fc25.s390x
> rpm-libs-4.13.0-6.fc25.s390x
> selinux-policy-3.13.1-225.6.fc25.noarch
> pcre-utf16-8.40-1.fc25.s390x
> bodhi-client-0.9.12.2-6.fc25.noarch
> rpmlint-1.9-5.fc25.noarch
> glibc-headers-2.24-4.fc25.s390x
> dbus-1.11.8-1.fc25.s390x
> kernel-core-4.9.3-200.fc25.s390x
> cairo-1.14.8-1.fc25.s390x
> ca-certificates-2017.2.11-1.0.fc25.noarch
> openssh-clients-7.4p1-1.fc25.s390x
> python2-GitPython-2.1.1-2.fc25.noarch
> mariadb-libs-10.1.20-1.fc25.s390x
> NetworkManager-glib-1.4.4-3.fc25.s390x
> gcc-go-6.3.1-1.fc25.s390x
> cracklib-dicts-2.9.6-4.fc25.s390x
> iproute-tc-4.6.0-6.fc25.s390x
> libselinux-python3-2.5-13.fc25.s390x
> strace-4.15-1.fc25.s390x
> python2-enchant-1.6.8-1.fc25.noarch
> boost-iostreams-1.60.0-10.fc25.s390x
> bluez-libs-5.43-1.fc25.s390x
> ghostscript-9.20-5.fc25.s390x
> userspace-rcu-0.9.2-2.fc25.s390x
> mesa-libwayland-egl-devel-13.0.3-1.fc25.s390x
> libXext-devel-1.3.3-4.fc24.s390x
> libXrandr-devel-1.5.1-1.fc25.s390x
> perl-XML-XPath-1.39-1.fc25.noarch
> python3-lxml-3.7.2-1.fc25.s390x
> texlive-texlive.infra-bin-svn40312-30.20160520.fc25.s390x
> texlive-ifxetex-svn19685.0.5-30.fc25.noarch
> texlive-thumbpdf-bin-svn6898.0-30.20160520.fc25.noarch
> texlive-babelbib-svn25245.1.31-30.fc25.noarch
> texlive-index-svn24099.4.1beta-30.fc25.noarch
> texlive-caption-svn41409-30.fc25.noarch
> texlive-bibtex-bin-svn40473-30.20160520.fc25.s390x
> texlive-mfware-bin-svn40473-30.20160520.fc25.s390x
> texlive-texconfig-svn40768-30.fc25.noarch
> texlive-footmisc-svn23330.5.5b-30.fc25.noarch
> texlive-psfrag-svn15878.3.04-30.fc25.noarch
> texlive-eurosym-svn17265.1.4_subrfix-30.fc25.noarch
> texlive-symbol-svn31835.0-30.fc25.noarch
> texlive-euenc-svn19795.0.1h-30.fc25.noarch
> texlive-textcase-svn15878.0-30.fc25.noarch
> texlive-charter-svn15878.0-30.fc25.noarch
> texlive-wasysym-svn15878.2.0-30.fc25.noarch
> texlive-mflogo-svn38628-30.fc25.noarch
> texlive-soul-svn15878.2.4-30.fc25.noarch
> texlive-marginnote-svn41382-30.fc25.noarch
> texlive-filecontents-svn24250.1.3-30.fc25.noarch
> texlive-tipa-svn29349.1.3-30.fc25.noarch
> texlive-xcolor-svn41044-30.fc25.noarch
> texlive-breakurl-svn29901.1.40-30.fc25.noarch
> texlive-attachfile-svn38830-30.fc25.noarch
> texlive-pst-coil-svn37377.1.07-30.fc25.noarch
> texlive-auto-pst-pdf-svn23723.0.6-30.fc25.noarch
> texlive-ctable-svn38672-30.fc25.noarch
> texlive-extsizes-svn17263.1.4a-30.fc25.noarch
> texlive-beamer-svn36461.3.36-30.fc25.noarch
> texlive-dvipdfmx-bin-svn40273-30.20160520.fc25.s390x
> netpbm-progs-10.76.00-2.fc25.s390x
> vte-profile-0.46.1-1.fc25.s390x
> krb5-devel-1.14.4-4.fc25.s390x
> dbus-devel-1.11.8-1.fc25.s390x
> sqlite-devel-3.14.2-1.fc25.s390x
> libiscsi-1.15.0-2.fc24.s390x
> fontconfig-devel-2.12.1-1.fc25.s390x
> libfdt-devel-1.4.2-1.fc25.s390x
> ceph-devel-compat-10.2.4-2.fc25.s390x
> zlib-static-1.2.8-10.fc24.s390x
> chrpath-0.16-3.fc24.s390x
> python-2.7.13-1.fc25.s390x
> nss-3.28.1-1.3.fc25.s390x
> python2-hawkey-0.6.3-6.1.fc25.s390x
> gdk-pixbuf2-modules-2.36.4-1.fc25.s390x
> perl-Git-2.9.3-2.fc25.noarch
> kernel-core-4.9.5-200.fc25.s390x
> publicsuffix-list-dafsa-20170116-1.fc25.noarch
> perl-SelfLoader-1.23-382.fc25.noarch
> perl-open-1.10-382.fc25.noarch
> gpgme-1.8.0-8.fc25.s390x
> === TEST BEGIN ===
> Using CC: /home/fam/bin/cc
> rm: cannot remove '/var/tmp/patchew-qemu-build': Directory not empty
> === OUTPUT END ===
> 
> Test command exited with code: 1
> 
> 
> ---
> Email generated automatically by Patchew [http://patchew.org/].
> Please send your feedback to patchew-devel@freelists.org

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze
  2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
                   ` (32 preceding siblings ...)
  2017-02-28  0:00 ` no-reply
@ 2017-02-28  0:37 ` Greg Kurz
  2017-02-28  5:58   ` Michael Tokarev
  33 siblings, 1 reply; 40+ messages in thread
From: Greg Kurz @ 2017-02-28  0:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Aneesh Kumar K.V

[-- Attachment #1: Type: text/plain, Size: 3987 bytes --]

Peter,

I have some issues with this pull request. Please don't apply it, I'll respin a
new one.

Thanks.

On Mon, 27 Feb 2017 23:59:50 +0100
Greg Kurz <groug@kaod.org> wrote:

> The following changes since commit 8f2d7c341184a95d05476ea3c45dbae2b9ddbe51:
> 
>   Merge remote-tracking branch 'remotes/berrange/tags/pull-qcrypto-2017-02-27-1' into staging (2017-02-27 15:33:21 +0000)
> 
> are available in the git repository at:
> 
>   https://github.com/gkurz/qemu.git tags/for-upstream
> 
> for you to fetch changes up to a07ef65e3aeac852188331708716792930d819ef:
> 
>   9pfs: local: drop unused code (2017-02-27 22:45:17 +0100)
> 
> ----------------------------------------------------------------
> This pull request brings:
> - a fix to a minor bug reported by Coverity
> - throttling support in the local backend (command line only)
> - a huge fix for CVE-2016-9602 (symlink attack vulnerability)
> 
> ----------------------------------------------------------------
> Greg Kurz (29):
>       fsdev: add IO throttle support to fsdev devices
>       9pfs: local: move xattr security ops to 9p-xattr.c
>       9pfs: remove side-effects in local_init()
>       9pfs: remove side-effects in local_open() and local_opendir()
>       9pfs: introduce relative_openat_nofollow() helper
>       9pfs: local: keep a file descriptor on the shared folder
>       9pfs: local: open/opendir: don't follow symlinks
>       9pfs: local: lgetxattr: don't follow symlinks
>       9pfs: local: llistxattr: don't follow symlinks
>       9pfs: local: lsetxattr: don't follow symlinks
>       9pfs: local: lremovexattr: don't follow symlinks
>       9pfs: local: unlinkat: don't follow symlinks
>       9pfs: local: remove: don't follow symlinks
>       9pfs: local: utimensat: don't follow symlinks
>       9pfs: local: statfs: don't follow symlinks
>       9pfs: local: truncate: don't follow symlinks
>       9pfs: local: readlink: don't follow symlinks
>       9pfs: local: lstat: don't follow symlinks
>       9pfs: local: renameat: don't follow symlinks
>       9pfs: local: rename: use renameat
>       9pfs: local: improve error handling in link op
>       9pfs: local: link: don't follow symlinks
>       9pfs: local: chmod: don't follow symlinks
>       9pfs: local: chown: don't follow symlinks
>       9pfs: local: symlink: don't follow symlinks
>       9pfs: local: mknod: don't follow symlinks
>       9pfs: local: mkdir: don't follow symlinks
>       9pfs: local: open2: don't follow symlinks
>       9pfs: local: drop unused code
> 
> Paolo Bonzini (1):
>       9pfs: fix v9fs_lock error case
> 
> Pradeep (1):
>       throttle: factor out duplicate code
> 
>  blockdev.c                      |   83 +---
>  fsdev/Makefile.objs             |    2 +-
>  fsdev/file-op-9p.h              |    3 +
>  fsdev/qemu-fsdev-opts.c         |    3 +
>  fsdev/qemu-fsdev-throttle.c     |  118 +++++
>  fsdev/qemu-fsdev-throttle.h     |   39 ++
>  hw/9pfs/9p-local.c              | 1031 +++++++++++++++++++++------------------
>  hw/9pfs/9p-local.h              |   20 +
>  hw/9pfs/9p-posix-acl.c          |   44 +-
>  hw/9pfs/9p-util.c               |   68 +++
>  hw/9pfs/9p-util.h               |   53 ++
>  hw/9pfs/9p-xattr-user.c         |   24 +-
>  hw/9pfs/9p-xattr.c              |  166 ++++++-
>  hw/9pfs/9p-xattr.h              |   87 +---
>  hw/9pfs/9p.c                    |   19 +-
>  hw/9pfs/Makefile.objs           |    2 +-
>  hw/9pfs/cofile.c                |    2 +
>  include/qemu/throttle-options.h |   92 ++++
>  qemu-options.hx                 |    7 +-
>  19 files changed, 1180 insertions(+), 683 deletions(-)
>  create mode 100644 fsdev/qemu-fsdev-throttle.c
>  create mode 100644 fsdev/qemu-fsdev-throttle.h
>  create mode 100644 hw/9pfs/9p-local.h
>  create mode 100644 hw/9pfs/9p-util.c
>  create mode 100644 hw/9pfs/9p-util.h
>  create mode 100644 include/qemu/throttle-options.h


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze
  2017-02-28  0:37 ` Greg Kurz
@ 2017-02-28  5:58   ` Michael Tokarev
  2017-02-28  7:31     ` Greg Kurz
  0 siblings, 1 reply; 40+ messages in thread
From: Michael Tokarev @ 2017-02-28  5:58 UTC (permalink / raw)
  To: Greg Kurz, qemu-devel

Greg, can you please send a separate pull request
just for the symlink attack issue, so it can be
easily picked up by downstreams if needed?

Thanks,

/mjt

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze
  2017-02-28  5:58   ` Michael Tokarev
@ 2017-02-28  7:31     ` Greg Kurz
  0 siblings, 0 replies; 40+ messages in thread
From: Greg Kurz @ 2017-02-28  7:31 UTC (permalink / raw)
  To: Michael Tokarev; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 323 bytes --]

On Tue, 28 Feb 2017 08:58:55 +0300
Michael Tokarev <mjt@tls.msk.ru> wrote:

> Greg, can you please send a separate pull request
> just for the symlink attack issue, so it can be
> easily picked up by downstreams if needed?
> 

It makes sense indeed. I'll do that.

Cheers.

--
Greg

> Thanks,
> 
> /mjt


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 40+ messages in thread

end of thread, other threads:[~2017-02-28  7:31 UTC | newest]

Thread overview: 40+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-27 22:59 [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze Greg Kurz
2017-02-27 22:59 ` [Qemu-devel] [PULL 01/31] 9pfs: fix v9fs_lock error case Greg Kurz
2017-02-27 22:59 ` [Qemu-devel] [PULL 02/31] fsdev: add IO throttle support to fsdev devices Greg Kurz
2017-02-27 22:59 ` [Qemu-devel] [PULL 03/31] throttle: factor out duplicate code Greg Kurz
2017-02-27 22:59 ` [Qemu-devel] [PULL 04/31] 9pfs: local: move xattr security ops to 9p-xattr.c Greg Kurz
2017-02-27 22:59 ` [Qemu-devel] [PULL 05/31] 9pfs: remove side-effects in local_init() Greg Kurz
2017-02-27 22:59 ` [Qemu-devel] [PULL 06/31] 9pfs: remove side-effects in local_open() and local_opendir() Greg Kurz
2017-02-27 22:59 ` [Qemu-devel] [PULL 07/31] 9pfs: introduce relative_openat_nofollow() helper Greg Kurz
2017-02-27 23:37   ` Eric Blake
2017-02-28  0:33     ` Greg Kurz
2017-02-27 22:59 ` [Qemu-devel] [PULL 08/31] 9pfs: local: keep a file descriptor on the shared folder Greg Kurz
2017-02-27 22:59 ` [Qemu-devel] [PULL 09/31] 9pfs: local: open/opendir: don't follow symlinks Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 10/31] 9pfs: local: lgetxattr: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 11/31] 9pfs: local: llistxattr: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 12/31] 9pfs: local: lsetxattr: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 13/31] 9pfs: local: lremovexattr: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 14/31] 9pfs: local: unlinkat: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 15/31] 9pfs: local: remove: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 16/31] 9pfs: local: utimensat: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 17/31] 9pfs: local: statfs: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 18/31] 9pfs: local: truncate: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 19/31] 9pfs: local: readlink: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 20/31] 9pfs: local: lstat: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 21/31] 9pfs: local: renameat: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 22/31] 9pfs: local: rename: use renameat Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 23/31] 9pfs: local: improve error handling in link op Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 24/31] 9pfs: local: link: don't follow symlinks Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 25/31] 9pfs: local: chmod: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 26/31] 9pfs: local: chown: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 27/31] 9pfs: local: symlink: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 28/31] 9pfs: local: mknod: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 29/31] 9pfs: local: mkdir: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 30/31] 9pfs: local: open2: " Greg Kurz
2017-02-27 23:00 ` [Qemu-devel] [PULL 31/31] 9pfs: local: drop unused code Greg Kurz
2017-02-27 23:41 ` [Qemu-devel] [PULL 00/31] 9p patches 2017-02-27 for 2.9 soft freeze no-reply
2017-02-28  0:00 ` no-reply
2017-02-28  0:36   ` Greg Kurz
2017-02-28  0:37 ` Greg Kurz
2017-02-28  5:58   ` Michael Tokarev
2017-02-28  7:31     ` Greg Kurz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.