|
@@ -1611,11 +1611,27 @@ vhost_user_backend_handle_shared_object_add(struct vhost_dev *dev,
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
static int
|
|
-vhost_user_backend_handle_shared_object_remove(VhostUserShared *object)
|
|
|
|
|
|
+vhost_user_backend_handle_shared_object_remove(struct vhost_dev *dev,
|
|
|
|
+ VhostUserShared *object)
|
|
{
|
|
{
|
|
QemuUUID uuid;
|
|
QemuUUID uuid;
|
|
|
|
|
|
memcpy(uuid.data, object->uuid, sizeof(object->uuid));
|
|
memcpy(uuid.data, object->uuid, sizeof(object->uuid));
|
|
|
|
+ switch (virtio_object_type(&uuid)) {
|
|
|
|
+ case TYPE_VHOST_DEV:
|
|
|
|
+ {
|
|
|
|
+ struct vhost_dev *owner = virtio_lookup_vhost_device(&uuid);
|
|
|
|
+ if (dev != owner) {
|
|
|
|
+ /* Not allowed to remove non-owned entries */
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ default:
|
|
|
|
+ /* Not allowed to remove non-owned entries */
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
return virtio_remove_resource(&uuid);
|
|
return virtio_remove_resource(&uuid);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1794,7 +1810,8 @@ static gboolean backend_read(QIOChannel *ioc, GIOCondition condition,
|
|
ret = vhost_user_backend_handle_shared_object_add(dev, &payload.object);
|
|
ret = vhost_user_backend_handle_shared_object_add(dev, &payload.object);
|
|
break;
|
|
break;
|
|
case VHOST_USER_BACKEND_SHARED_OBJECT_REMOVE:
|
|
case VHOST_USER_BACKEND_SHARED_OBJECT_REMOVE:
|
|
- ret = vhost_user_backend_handle_shared_object_remove(&payload.object);
|
|
|
|
|
|
+ ret = vhost_user_backend_handle_shared_object_remove(dev,
|
|
|
|
+ &payload.object);
|
|
break;
|
|
break;
|
|
case VHOST_USER_BACKEND_SHARED_OBJECT_LOOKUP:
|
|
case VHOST_USER_BACKEND_SHARED_OBJECT_LOOKUP:
|
|
ret = vhost_user_backend_handle_shared_object_lookup(dev->opaque, ioc,
|
|
ret = vhost_user_backend_handle_shared_object_lookup(dev->opaque, ioc,
|