From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751421AbdJEGUO (ORCPT ); Thu, 5 Oct 2017 02:20:14 -0400 Received: from home.keithp.com ([63.227.221.253]:43284 "EHLO elaine.keithp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751254AbdJEGUI (ORCPT ); Thu, 5 Oct 2017 02:20:08 -0400 From: Keith Packard To: linux-kernel@vger.kernel.org, Dave Airlie , Daniel Vetter Cc: Keith Packard , dri-devel@lists.freedesktop.org Subject: [PATCH 5/6] drm: Check mode object lease status in all master ioctl paths [v2] Date: Wed, 4 Oct 2017 23:13:09 -0700 Message-Id: <20171005061310.29919-6-keithp@keithp.com> X-Mailer: git-send-email 2.13.3 In-Reply-To: <20171005061310.29919-1-keithp@keithp.com> References: <20171005061310.29919-1-keithp@keithp.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Attempts to modify un-leased objects are rejected with an error. Information returned about unleased objects is modified to make them appear unusable and/or disconnected. Changes for v2 as suggested by Daniel Vetter : With the change in the __drm_mode_object_find API to pass the file_priv along, we can now centralize most of the lease-based access checks in that function. A few places skip that API and require in-line checks. Signed-off-by: Keith Packard --- drivers/gpu/drm/drm_auth.c | 2 +- drivers/gpu/drm/drm_connector.c | 5 +++-- drivers/gpu/drm/drm_encoder.c | 8 +++++--- drivers/gpu/drm/drm_mode_config.c | 32 +++++++++++++++++++------------- drivers/gpu/drm/drm_mode_object.c | 22 ++++++++++++++++++++++ drivers/gpu/drm/drm_plane.c | 8 +++++--- drivers/gpu/drm/drm_vblank.c | 18 ++++++++++++++++-- 7 files changed, 71 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c index 541177c71d51..bab26b477738 100644 --- a/drivers/gpu/drm/drm_auth.c +++ b/drivers/gpu/drm/drm_auth.c @@ -310,7 +310,7 @@ void drm_master_release(struct drm_file *file_priv) */ bool drm_is_current_master(struct drm_file *fpriv) { - return fpriv->is_master && fpriv->master == fpriv->minor->dev->master; + return fpriv->is_master && drm_lease_owner(fpriv->master) == fpriv->minor->dev->master; } EXPORT_SYMBOL(drm_is_current_master); diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index f8feb2bf142a..65ecdd954a69 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -1294,7 +1294,8 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, return -ENOENT; for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) - if (connector->encoder_ids[i] != 0) + if (connector->encoder_ids[i] != 0 && + drm_lease_held(file_priv, connector->encoder_ids[i])) encoders_count++; if ((out_resp->count_encoders >= encoders_count) && encoders_count) { @@ -1361,7 +1362,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); encoder = drm_connector_get_encoder(connector); - if (encoder) + if (encoder && drm_lease_held(file_priv, encoder->base.id)) out_resp->encoder_id = encoder->base.id; else out_resp->encoder_id = 0; diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c index 43f644844b83..6ad6416f2ede 100644 --- a/drivers/gpu/drm/drm_encoder.c +++ b/drivers/gpu/drm/drm_encoder.c @@ -226,7 +226,7 @@ int drm_mode_getencoder(struct drm_device *dev, void *data, drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); crtc = drm_encoder_get_crtc(encoder); - if (crtc) + if (crtc && drm_lease_held(file_priv, crtc->base.id)) enc_resp->crtc_id = crtc->base.id; else enc_resp->crtc_id = 0; @@ -234,8 +234,10 @@ int drm_mode_getencoder(struct drm_device *dev, void *data, enc_resp->encoder_type = encoder->encoder_type; enc_resp->encoder_id = encoder->base.id; - enc_resp->possible_crtcs = encoder->possible_crtcs; - enc_resp->possible_clones = encoder->possible_clones; + enc_resp->possible_crtcs = drm_lease_filter_crtcs(file_priv, + encoder->possible_crtcs); + enc_resp->possible_clones = drm_lease_filter_encoders(file_priv, + encoder->possible_clones); return 0; } diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c index d9862259a2a7..f7ceee2ae340 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -122,20 +122,24 @@ int drm_mode_getresources(struct drm_device *dev, void *data, count = 0; crtc_id = u64_to_user_ptr(card_res->crtc_id_ptr); drm_for_each_crtc(crtc, dev) { - if (count < card_res->count_crtcs && - put_user(crtc->base.id, crtc_id + count)) - return -EFAULT; - count++; + if (drm_lease_held(file_priv, crtc->base.id)) { + if (count < card_res->count_crtcs && + put_user(crtc->base.id, crtc_id + count)) + return -EFAULT; + count++; + } } card_res->count_crtcs = count; count = 0; encoder_id = u64_to_user_ptr(card_res->encoder_id_ptr); drm_for_each_encoder(encoder, dev) { - if (count < card_res->count_encoders && - put_user(encoder->base.id, encoder_id + count)) - return -EFAULT; - count++; + if (drm_lease_held(file_priv, encoder->base.id)) { + if (count < card_res->count_encoders && + put_user(encoder->base.id, encoder_id + count)) + return -EFAULT; + count++; + } } card_res->count_encoders = count; @@ -143,12 +147,14 @@ int drm_mode_getresources(struct drm_device *dev, void *data, count = 0; connector_id = u64_to_user_ptr(card_res->connector_id_ptr); drm_for_each_connector_iter(connector, &conn_iter) { - if (count < card_res->count_connectors && - put_user(connector->base.id, connector_id + count)) { - drm_connector_list_iter_end(&conn_iter); - return -EFAULT; + if (drm_lease_held(file_priv, connector->base.id)) { + if (count < card_res->count_connectors && + put_user(connector->base.id, connector_id + count)) { + drm_connector_list_iter_end(&conn_iter); + return -EFAULT; + } + count++; } - count++; } card_res->count_connectors = count; drm_connector_list_iter_end(&conn_iter); diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c index ccc3a35d2de2..dbc280ddef9b 100644 --- a/drivers/gpu/drm/drm_mode_object.c +++ b/drivers/gpu/drm/drm_mode_object.c @@ -104,6 +104,25 @@ void drm_mode_object_unregister(struct drm_device *dev, mutex_unlock(&dev->mode_config.idr_mutex); } +/** + * drm_lease_required - check types which must be leased to be used + * @type: type of object + * + * Returns whether the provided type of drm_mode_object must + * be owned or leased to be used by a process. + */ +static bool drm_lease_required(uint32_t type) +{ + switch(type) { + case DRM_MODE_OBJECT_CRTC: + case DRM_MODE_OBJECT_CONNECTOR: + case DRM_MODE_OBJECT_ENCODER: + return true; + default: + return false; + } +} + struct drm_mode_object *__drm_mode_object_find(struct drm_device *dev, struct drm_file *file_priv, uint32_t id, uint32_t type) @@ -117,6 +136,9 @@ struct drm_mode_object *__drm_mode_object_find(struct drm_device *dev, if (obj && obj->id != id) obj = NULL; + if (obj && drm_lease_required(obj->type) && !_drm_lease_held(file_priv, obj->id)) + obj = NULL; + if (obj && obj->free_cb) { if (!kref_get_unless_zero(&obj->refcount)) obj = NULL; diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c index 462c244498e2..9a7306a912b6 100644 --- a/drivers/gpu/drm/drm_plane.c +++ b/drivers/gpu/drm/drm_plane.c @@ -400,9 +400,9 @@ int drm_mode_getplane(struct drm_device *dev, void *data, return -ENOENT; drm_modeset_lock(&plane->mutex, NULL); - if (plane->state && plane->state->crtc) + if (plane->state && plane->state->crtc && drm_lease_held(file_priv, plane->state->crtc->base.id)) plane_resp->crtc_id = plane->state->crtc->base.id; - else if (!plane->state && plane->crtc) + else if (!plane->state && plane->crtc && drm_lease_held(file_priv, plane->crtc->base.id)) plane_resp->crtc_id = plane->crtc->base.id; else plane_resp->crtc_id = 0; @@ -416,7 +416,9 @@ int drm_mode_getplane(struct drm_device *dev, void *data, drm_modeset_unlock(&plane->mutex); plane_resp->plane_id = plane->base.id; - plane_resp->possible_crtcs = plane->possible_crtcs; + plane_resp->possible_crtcs = drm_lease_filter_crtcs(file_priv, + plane->possible_crtcs); + plane_resp->gamma_size = 0; /* diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c index 70f2b9593edc..47d5cfa0c167 100644 --- a/drivers/gpu/drm/drm_vblank.c +++ b/drivers/gpu/drm/drm_vblank.c @@ -1401,9 +1401,11 @@ static bool drm_wait_vblank_is_query(union drm_wait_vblank *vblwait) int drm_wait_vblank_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { + struct drm_crtc *crtc; struct drm_vblank_crtc *vblank; union drm_wait_vblank *vblwait = data; int ret; + unsigned int pipe_index; unsigned int flags, seq, pipe, high_pipe; if (!dev->irq_enabled) @@ -1425,9 +1427,21 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data, flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK; high_pipe = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK); if (high_pipe) - pipe = high_pipe >> _DRM_VBLANK_HIGH_CRTC_SHIFT; + pipe_index = high_pipe >> _DRM_VBLANK_HIGH_CRTC_SHIFT; else - pipe = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; + pipe_index = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; + + /* Convert lease-relative crtc index into global crtc index */ + pipe = 0; + drm_for_each_crtc(crtc, dev) { + if (drm_lease_held(file_priv, crtc->base.id)) { + if (pipe_index == 0) + break; + pipe_index--; + } + pipe++; + } + if (pipe >= dev->num_crtcs) return -EINVAL; -- 2.13.3 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keith Packard Subject: [PATCH 5/6] drm: Check mode object lease status in all master ioctl paths [v2] Date: Wed, 4 Oct 2017 23:13:09 -0700 Message-ID: <20171005061310.29919-6-keithp@keithp.com> References: <20171005061310.29919-1-keithp@keithp.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from elaine.keithp.com (home.keithp.com [63.227.221.253]) by gabe.freedesktop.org (Postfix) with ESMTP id C9CA56E781 for ; Thu, 5 Oct 2017 06:13:17 +0000 (UTC) In-Reply-To: <20171005061310.29919-1-keithp@keithp.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: linux-kernel@vger.kernel.org, Dave Airlie , Daniel Vetter Cc: Keith Packard , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org QXR0ZW1wdHMgdG8gbW9kaWZ5IHVuLWxlYXNlZCBvYmplY3RzIGFyZSByZWplY3RlZCB3aXRoIGFu IGVycm9yLgpJbmZvcm1hdGlvbiByZXR1cm5lZCBhYm91dCB1bmxlYXNlZCBvYmplY3RzIGlzIG1v ZGlmaWVkIHRvIG1ha2UgdGhlbQphcHBlYXIgdW51c2FibGUgYW5kL29yIGRpc2Nvbm5lY3RlZC4K CkNoYW5nZXMgZm9yIHYyIGFzIHN1Z2dlc3RlZCBieSBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0 dGVyQGZmd2xsLmNoPjoKCldpdGggdGhlIGNoYW5nZSBpbiB0aGUgX19kcm1fbW9kZV9vYmplY3Rf ZmluZCBBUEkgdG8gcGFzcyB0aGUKZmlsZV9wcml2IGFsb25nLCB3ZSBjYW4gbm93IGNlbnRyYWxp emUgbW9zdCBvZiB0aGUgbGVhc2UtYmFzZWQgYWNjZXNzCmNoZWNrcyBpbiB0aGF0IGZ1bmN0aW9u LgoKQSBmZXcgcGxhY2VzIHNraXAgdGhhdCBBUEkgYW5kIHJlcXVpcmUgaW4tbGluZSBjaGVja3Mu CgpTaWduZWQtb2ZmLWJ5OiBLZWl0aCBQYWNrYXJkIDxrZWl0aHBAa2VpdGhwLmNvbT4KLS0tCiBk cml2ZXJzL2dwdS9kcm0vZHJtX2F1dGguYyAgICAgICAgfCAgMiArLQogZHJpdmVycy9ncHUvZHJt L2RybV9jb25uZWN0b3IuYyAgIHwgIDUgKysrLS0KIGRyaXZlcnMvZ3B1L2RybS9kcm1fZW5jb2Rl ci5jICAgICB8ICA4ICsrKysrLS0tCiBkcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVfY29uZmlnLmMg fCAzMiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLQogZHJpdmVycy9ncHUvZHJtL2Ry bV9tb2RlX29iamVjdC5jIHwgMjIgKysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUv ZHJtL2RybV9wbGFuZS5jICAgICAgIHwgIDggKysrKystLS0KIGRyaXZlcnMvZ3B1L2RybS9kcm1f dmJsYW5rLmMgICAgICB8IDE4ICsrKysrKysrKysrKysrKystLQogNyBmaWxlcyBjaGFuZ2VkLCA3 MSBpbnNlcnRpb25zKCspLCAyNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vZHJtX2F1dGguYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXV0aC5jCmluZGV4IDU0MTE3 N2M3MWQ1MS4uYmFiMjZiNDc3NzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F1 dGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F1dGguYwpAQCAtMzEwLDcgKzMxMCw3IEBA IHZvaWQgZHJtX21hc3Rlcl9yZWxlYXNlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogICov CiBib29sIGRybV9pc19jdXJyZW50X21hc3RlcihzdHJ1Y3QgZHJtX2ZpbGUgKmZwcml2KQogewot CXJldHVybiBmcHJpdi0+aXNfbWFzdGVyICYmIGZwcml2LT5tYXN0ZXIgPT0gZnByaXYtPm1pbm9y LT5kZXYtPm1hc3RlcjsKKwlyZXR1cm4gZnByaXYtPmlzX21hc3RlciAmJiBkcm1fbGVhc2Vfb3du ZXIoZnByaXYtPm1hc3RlcikgPT0gZnByaXYtPm1pbm9yLT5kZXYtPm1hc3RlcjsKIH0KIEVYUE9S VF9TWU1CT0woZHJtX2lzX2N1cnJlbnRfbWFzdGVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2RybV9jb25uZWN0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY29ubmVjdG9yLmMK aW5kZXggZjhmZWIyYmYxNDJhLi42NWVjZGQ5NTRhNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9kcm1fY29ubmVjdG9yLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jb25uZWN0b3Iu YwpAQCAtMTI5NCw3ICsxMjk0LDggQEAgaW50IGRybV9tb2RlX2dldGNvbm5lY3RvcihzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWZvciAo aSA9IDA7IGkgPCBEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSOyBpKyspCi0JCWlmIChjb25uZWN0 b3ItPmVuY29kZXJfaWRzW2ldICE9IDApCisJCWlmIChjb25uZWN0b3ItPmVuY29kZXJfaWRzW2ld ICE9IDAgJiYKKwkJICAgIGRybV9sZWFzZV9oZWxkKGZpbGVfcHJpdiwgY29ubmVjdG9yLT5lbmNv ZGVyX2lkc1tpXSkpCiAJCQllbmNvZGVyc19jb3VudCsrOwogCiAJaWYgKChvdXRfcmVzcC0+Y291 bnRfZW5jb2RlcnMgPj0gZW5jb2RlcnNfY291bnQpICYmIGVuY29kZXJzX2NvdW50KSB7CkBAIC0x MzYxLDcgKzEzNjIsNyBAQCBpbnQgZHJtX21vZGVfZ2V0Y29ubmVjdG9yKHN0cnVjdCBkcm1fZGV2 aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAKIAlkcm1fbW9kZXNldF9sb2NrKCZkZXYtPm1vZGVfY29u ZmlnLmNvbm5lY3Rpb25fbXV0ZXgsIE5VTEwpOwogCWVuY29kZXIgPSBkcm1fY29ubmVjdG9yX2dl dF9lbmNvZGVyKGNvbm5lY3Rvcik7Ci0JaWYgKGVuY29kZXIpCisJaWYgKGVuY29kZXIgJiYgZHJt X2xlYXNlX2hlbGQoZmlsZV9wcml2LCBlbmNvZGVyLT5iYXNlLmlkKSkKIAkJb3V0X3Jlc3AtPmVu Y29kZXJfaWQgPSBlbmNvZGVyLT5iYXNlLmlkOwogCWVsc2UKIAkJb3V0X3Jlc3AtPmVuY29kZXJf aWQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9lbmNvZGVyLmMgYi9kcml2 ZXJzL2dwdS9kcm0vZHJtX2VuY29kZXIuYwppbmRleCA0M2Y2NDQ4NDRiODMuLjZhZDY0MTZmMmVk ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9lbmNvZGVyLmMKKysrIGIvZHJpdmVy cy9ncHUvZHJtL2RybV9lbmNvZGVyLmMKQEAgLTIyNiw3ICsyMjYsNyBAQCBpbnQgZHJtX21vZGVf Z2V0ZW5jb2RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCiAJZHJtX21v ZGVzZXRfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4LCBOVUxMKTsKIAlj cnRjID0gZHJtX2VuY29kZXJfZ2V0X2NydGMoZW5jb2Rlcik7Ci0JaWYgKGNydGMpCisJaWYgKGNy dGMgJiYgZHJtX2xlYXNlX2hlbGQoZmlsZV9wcml2LCBjcnRjLT5iYXNlLmlkKSkKIAkJZW5jX3Jl c3AtPmNydGNfaWQgPSBjcnRjLT5iYXNlLmlkOwogCWVsc2UKIAkJZW5jX3Jlc3AtPmNydGNfaWQg PSAwOwpAQCAtMjM0LDggKzIzNCwxMCBAQCBpbnQgZHJtX21vZGVfZ2V0ZW5jb2RlcihzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCiAJZW5jX3Jlc3AtPmVuY29kZXJfdHlwZSA9 IGVuY29kZXItPmVuY29kZXJfdHlwZTsKIAllbmNfcmVzcC0+ZW5jb2Rlcl9pZCA9IGVuY29kZXIt PmJhc2UuaWQ7Ci0JZW5jX3Jlc3AtPnBvc3NpYmxlX2NydGNzID0gZW5jb2Rlci0+cG9zc2libGVf Y3J0Y3M7Ci0JZW5jX3Jlc3AtPnBvc3NpYmxlX2Nsb25lcyA9IGVuY29kZXItPnBvc3NpYmxlX2Ns b25lczsKKwllbmNfcmVzcC0+cG9zc2libGVfY3J0Y3MgPSBkcm1fbGVhc2VfZmlsdGVyX2NydGNz KGZpbGVfcHJpdiwKKwkJCQkJCQkgIGVuY29kZXItPnBvc3NpYmxlX2NydGNzKTsKKwllbmNfcmVz cC0+cG9zc2libGVfY2xvbmVzID0gZHJtX2xlYXNlX2ZpbHRlcl9lbmNvZGVycyhmaWxlX3ByaXYs CisJCQkJCQkJICAgICAgZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzKTsKIAogCXJldHVybiAwOwog fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9tb2RlX2NvbmZpZy5jIGIvZHJpdmVy cy9ncHUvZHJtL2RybV9tb2RlX2NvbmZpZy5jCmluZGV4IGQ5ODYyMjU5YTJhNy4uZjdjZWVlMmFl MzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVfY29uZmlnLmMKKysrIGIv ZHJpdmVycy9ncHUvZHJtL2RybV9tb2RlX2NvbmZpZy5jCkBAIC0xMjIsMjAgKzEyMiwyNCBAQCBp bnQgZHJtX21vZGVfZ2V0cmVzb3VyY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRh dGEsCiAJY291bnQgPSAwOwogCWNydGNfaWQgPSB1NjRfdG9fdXNlcl9wdHIoY2FyZF9yZXMtPmNy dGNfaWRfcHRyKTsKIAlkcm1fZm9yX2VhY2hfY3J0YyhjcnRjLCBkZXYpIHsKLQkJaWYgKGNvdW50 IDwgY2FyZF9yZXMtPmNvdW50X2NydGNzICYmCi0JCSAgICBwdXRfdXNlcihjcnRjLT5iYXNlLmlk LCBjcnRjX2lkICsgY291bnQpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWNvdW50Kys7CisJCWlm IChkcm1fbGVhc2VfaGVsZChmaWxlX3ByaXYsIGNydGMtPmJhc2UuaWQpKSB7CisJCQlpZiAoY291 bnQgPCBjYXJkX3Jlcy0+Y291bnRfY3J0Y3MgJiYKKwkJCSAgICBwdXRfdXNlcihjcnRjLT5iYXNl LmlkLCBjcnRjX2lkICsgY291bnQpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJY291bnQrKzsK KwkJfQogCX0KIAljYXJkX3Jlcy0+Y291bnRfY3J0Y3MgPSBjb3VudDsKIAogCWNvdW50ID0gMDsK IAllbmNvZGVyX2lkID0gdTY0X3RvX3VzZXJfcHRyKGNhcmRfcmVzLT5lbmNvZGVyX2lkX3B0cik7 CiAJZHJtX2Zvcl9lYWNoX2VuY29kZXIoZW5jb2RlciwgZGV2KSB7Ci0JCWlmIChjb3VudCA8IGNh cmRfcmVzLT5jb3VudF9lbmNvZGVycyAmJgotCQkgICAgcHV0X3VzZXIoZW5jb2Rlci0+YmFzZS5p ZCwgZW5jb2Rlcl9pZCArIGNvdW50KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQljb3VudCsrOwor CQlpZiAoZHJtX2xlYXNlX2hlbGQoZmlsZV9wcml2LCBlbmNvZGVyLT5iYXNlLmlkKSkgeworCQkJ aWYgKGNvdW50IDwgY2FyZF9yZXMtPmNvdW50X2VuY29kZXJzICYmCisJCQkgICAgcHV0X3VzZXIo ZW5jb2Rlci0+YmFzZS5pZCwgZW5jb2Rlcl9pZCArIGNvdW50KSkKKwkJCQlyZXR1cm4gLUVGQVVM VDsKKwkJCWNvdW50Kys7CisJCX0KIAl9CiAJY2FyZF9yZXMtPmNvdW50X2VuY29kZXJzID0gY291 bnQ7CiAKQEAgLTE0MywxMiArMTQ3LDE0IEBAIGludCBkcm1fbW9kZV9nZXRyZXNvdXJjZXMoc3Ry dWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAljb3VudCA9IDA7CiAJY29ubmVjdG9y X2lkID0gdTY0X3RvX3VzZXJfcHRyKGNhcmRfcmVzLT5jb25uZWN0b3JfaWRfcHRyKTsKIAlkcm1f Zm9yX2VhY2hfY29ubmVjdG9yX2l0ZXIoY29ubmVjdG9yLCAmY29ubl9pdGVyKSB7Ci0JCWlmIChj b3VudCA8IGNhcmRfcmVzLT5jb3VudF9jb25uZWN0b3JzICYmCi0JCSAgICBwdXRfdXNlcihjb25u ZWN0b3ItPmJhc2UuaWQsIGNvbm5lY3Rvcl9pZCArIGNvdW50KSkgewotCQkJZHJtX2Nvbm5lY3Rv cl9saXN0X2l0ZXJfZW5kKCZjb25uX2l0ZXIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChk cm1fbGVhc2VfaGVsZChmaWxlX3ByaXYsIGNvbm5lY3Rvci0+YmFzZS5pZCkpIHsKKwkJCWlmIChj b3VudCA8IGNhcmRfcmVzLT5jb3VudF9jb25uZWN0b3JzICYmCisJCQkgICAgcHV0X3VzZXIoY29u bmVjdG9yLT5iYXNlLmlkLCBjb25uZWN0b3JfaWQgKyBjb3VudCkpIHsKKwkJCQlkcm1fY29ubmVj dG9yX2xpc3RfaXRlcl9lbmQoJmNvbm5faXRlcik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9 CisJCQljb3VudCsrOwogCQl9Ci0JCWNvdW50Kys7CiAJfQogCWNhcmRfcmVzLT5jb3VudF9jb25u ZWN0b3JzID0gY291bnQ7CiAJZHJtX2Nvbm5lY3Rvcl9saXN0X2l0ZXJfZW5kKCZjb25uX2l0ZXIp OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9tb2RlX29iamVjdC5jIGIvZHJpdmVy cy9ncHUvZHJtL2RybV9tb2RlX29iamVjdC5jCmluZGV4IGNjYzNhMzVkMmRlMi4uZGJjMjgwZGRl ZjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVfb2JqZWN0LmMKKysrIGIv ZHJpdmVycy9ncHUvZHJtL2RybV9tb2RlX29iamVjdC5jCkBAIC0xMDQsNiArMTA0LDI1IEBAIHZv aWQgZHJtX21vZGVfb2JqZWN0X3VucmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAlt dXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcuaWRyX211dGV4KTsKIH0KIAorLyoqCisgKiBk cm1fbGVhc2VfcmVxdWlyZWQgLSBjaGVjayB0eXBlcyB3aGljaCBtdXN0IGJlIGxlYXNlZCB0byBi ZSB1c2VkCisgKiBAdHlwZTogdHlwZSBvZiBvYmplY3QKKyAqCisgKiBSZXR1cm5zIHdoZXRoZXIg dGhlIHByb3ZpZGVkIHR5cGUgb2YgZHJtX21vZGVfb2JqZWN0IG11c3QKKyAqIGJlIG93bmVkIG9y IGxlYXNlZCB0byBiZSB1c2VkIGJ5IGEgcHJvY2Vzcy4KKyAqLworc3RhdGljIGJvb2wgZHJtX2xl YXNlX3JlcXVpcmVkKHVpbnQzMl90IHR5cGUpCit7CisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIERS TV9NT0RFX09CSkVDVF9DUlRDOgorCWNhc2UgRFJNX01PREVfT0JKRUNUX0NPTk5FQ1RPUjoKKwlj YXNlIERSTV9NT0RFX09CSkVDVF9FTkNPREVSOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0Ogor CQlyZXR1cm4gZmFsc2U7CisJfQorfQorCiBzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpfX2RybV9t b2RlX29iamVjdF9maW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgICBzdHJ1 Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKIAkJCQkJICAgICAgIHVpbnQzMl90IGlkLCB1aW50MzJf dCB0eXBlKQpAQCAtMTE3LDYgKzEzNiw5IEBAIHN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKl9fZHJt X21vZGVfb2JqZWN0X2ZpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAlpZiAob2JqICYmIG9i ai0+aWQgIT0gaWQpCiAJCW9iaiA9IE5VTEw7CiAKKwlpZiAob2JqICYmIGRybV9sZWFzZV9yZXF1 aXJlZChvYmotPnR5cGUpICYmICFfZHJtX2xlYXNlX2hlbGQoZmlsZV9wcml2LCBvYmotPmlkKSkK KwkJb2JqID0gTlVMTDsKKwogCWlmIChvYmogJiYgb2JqLT5mcmVlX2NiKSB7CiAJCWlmICgha3Jl Zl9nZXRfdW5sZXNzX3plcm8oJm9iai0+cmVmY291bnQpKQogCQkJb2JqID0gTlVMTDsKZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGxhbmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1f cGxhbmUuYwppbmRleCA0NjJjMjQ0NDk4ZTIuLjlhNzMwNmE5MTJiNiAxMDA2NDQKLS0tIGEvZHJp dmVycy9ncHUvZHJtL2RybV9wbGFuZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGxhbmUu YwpAQCAtNDAwLDkgKzQwMCw5IEBAIGludCBkcm1fbW9kZV9nZXRwbGFuZShzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWRybV9tb2Rlc2V0 X2xvY2soJnBsYW5lLT5tdXRleCwgTlVMTCk7Ci0JaWYgKHBsYW5lLT5zdGF0ZSAmJiBwbGFuZS0+ c3RhdGUtPmNydGMpCisJaWYgKHBsYW5lLT5zdGF0ZSAmJiBwbGFuZS0+c3RhdGUtPmNydGMgJiYg ZHJtX2xlYXNlX2hlbGQoZmlsZV9wcml2LCBwbGFuZS0+c3RhdGUtPmNydGMtPmJhc2UuaWQpKQog CQlwbGFuZV9yZXNwLT5jcnRjX2lkID0gcGxhbmUtPnN0YXRlLT5jcnRjLT5iYXNlLmlkOwotCWVs c2UgaWYgKCFwbGFuZS0+c3RhdGUgJiYgcGxhbmUtPmNydGMpCisJZWxzZSBpZiAoIXBsYW5lLT5z dGF0ZSAmJiBwbGFuZS0+Y3J0YyAmJiBkcm1fbGVhc2VfaGVsZChmaWxlX3ByaXYsIHBsYW5lLT5j cnRjLT5iYXNlLmlkKSkKIAkJcGxhbmVfcmVzcC0+Y3J0Y19pZCA9IHBsYW5lLT5jcnRjLT5iYXNl LmlkOwogCWVsc2UKIAkJcGxhbmVfcmVzcC0+Y3J0Y19pZCA9IDA7CkBAIC00MTYsNyArNDE2LDkg QEAgaW50IGRybV9tb2RlX2dldHBsYW5lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRh dGEsCiAJZHJtX21vZGVzZXRfdW5sb2NrKCZwbGFuZS0+bXV0ZXgpOwogCiAJcGxhbmVfcmVzcC0+ cGxhbmVfaWQgPSBwbGFuZS0+YmFzZS5pZDsKLQlwbGFuZV9yZXNwLT5wb3NzaWJsZV9jcnRjcyA9 IHBsYW5lLT5wb3NzaWJsZV9jcnRjczsKKwlwbGFuZV9yZXNwLT5wb3NzaWJsZV9jcnRjcyA9IGRy bV9sZWFzZV9maWx0ZXJfY3J0Y3MoZmlsZV9wcml2LAorCQkJCQkJCSAgICBwbGFuZS0+cG9zc2li bGVfY3J0Y3MpOworCiAJcGxhbmVfcmVzcC0+Z2FtbWFfc2l6ZSA9IDA7CiAKIAkvKgpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV92YmxhbmsuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1f dmJsYW5rLmMKaW5kZXggNzBmMmI5NTkzZWRjLi40N2Q1Y2ZhMGMxNjcgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9kcm1fdmJsYW5rLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV92Ymxh bmsuYwpAQCAtMTQwMSw5ICsxNDAxLDExIEBAIHN0YXRpYyBib29sIGRybV93YWl0X3ZibGFua19p c19xdWVyeSh1bmlvbiBkcm1fd2FpdF92YmxhbmsgKnZibHdhaXQpCiBpbnQgZHJtX3dhaXRfdmJs YW5rX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgIHN0cnVj dCBkcm1fZmlsZSAqZmlsZV9wcml2KQogeworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAlzdHJ1 Y3QgZHJtX3ZibGFua19jcnRjICp2Ymxhbms7CiAJdW5pb24gZHJtX3dhaXRfdmJsYW5rICp2Ymx3 YWl0ID0gZGF0YTsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGludCBwaXBlX2luZGV4OwogCXVuc2ln bmVkIGludCBmbGFncywgc2VxLCBwaXBlLCBoaWdoX3BpcGU7CiAKIAlpZiAoIWRldi0+aXJxX2Vu YWJsZWQpCkBAIC0xNDI1LDkgKzE0MjcsMjEgQEAgaW50IGRybV93YWl0X3ZibGFua19pb2N0bChz dHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCWZsYWdzID0gdmJsd2FpdC0+cmVx dWVzdC50eXBlICYgX0RSTV9WQkxBTktfRkxBR1NfTUFTSzsKIAloaWdoX3BpcGUgPSAodmJsd2Fp dC0+cmVxdWVzdC50eXBlICYgX0RSTV9WQkxBTktfSElHSF9DUlRDX01BU0spOwogCWlmIChoaWdo X3BpcGUpCi0JCXBpcGUgPSBoaWdoX3BpcGUgPj4gX0RSTV9WQkxBTktfSElHSF9DUlRDX1NISUZU OworCQlwaXBlX2luZGV4ID0gaGlnaF9waXBlID4+IF9EUk1fVkJMQU5LX0hJR0hfQ1JUQ19TSElG VDsKIAllbHNlCi0JCXBpcGUgPSBmbGFncyAmIF9EUk1fVkJMQU5LX1NFQ09OREFSWSA/IDEgOiAw OworCQlwaXBlX2luZGV4ID0gZmxhZ3MgJiBfRFJNX1ZCTEFOS19TRUNPTkRBUlkgPyAxIDogMDsK KworCS8qIENvbnZlcnQgbGVhc2UtcmVsYXRpdmUgY3J0YyBpbmRleCBpbnRvIGdsb2JhbCBjcnRj IGluZGV4ICovCisJcGlwZSA9IDA7CisJZHJtX2Zvcl9lYWNoX2NydGMoY3J0YywgZGV2KSB7CisJ CWlmIChkcm1fbGVhc2VfaGVsZChmaWxlX3ByaXYsIGNydGMtPmJhc2UuaWQpKSB7CisJCQlpZiAo cGlwZV9pbmRleCA9PSAwKQorCQkJCWJyZWFrOworCQkJcGlwZV9pbmRleC0tOworCQl9CisJCXBp cGUrKzsKKwl9CisKIAlpZiAocGlwZSA+PSBkZXYtPm51bV9jcnRjcykKIAkJcmV0dXJuIC1FSU5W QUw7CiAKLS0gCjIuMTMuMwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJp LWRldmVsCg==