From bf65974835a99b0f8b913a131790600154b54a11 Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Tue, 25 Feb 2025 09:20:40 -0800 Subject: [PATCH] Move client request validation to L2capNetworkSpecifier Test: TH Change-Id: Ied1af7edc60a0df01d820c2e81e16de980eb526f --- .../android/net/L2capNetworkSpecifier.java | 23 +++++++++++++++++++ .../android/server/L2capNetworkProvider.java | 20 +--------------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/framework/src/android/net/L2capNetworkSpecifier.java b/framework/src/android/net/L2capNetworkSpecifier.java index cfc9ed9d14..d4a69f23c4 100644 --- a/framework/src/android/net/L2capNetworkSpecifier.java +++ b/framework/src/android/net/L2capNetworkSpecifier.java @@ -170,6 +170,29 @@ public final class L2capNetworkSpecifier extends NetworkSpecifier implements Par return mPsm; } + /** + * Checks whether the given L2capNetworkSpecifier is valid as part of a client network request. + * + * @hide + */ + public boolean isValidClientRequestSpecifier() { + // The ROLE_CLIENT offer can be satisfied by a ROLE_ANY request. + if (mRole != ROLE_CLIENT) return false; + + // HEADER_COMPRESSION_ANY is never valid in a request. + if (mHeaderCompression == HEADER_COMPRESSION_ANY) return false; + + // Remote address must not be null for ROLE_CLIENT requests. + if (mRemoteAddress == null) return false; + + // Client network requests require a PSM to be specified. + // Ensure the PSM is within the valid range of dynamic BLE L2CAP values. + if (mPsm < 0x80) return false; + if (mPsm > 0xFF) return false; + + return true; + } + /** A builder class for L2capNetworkSpecifier. */ public static final class Builder { @Role diff --git a/service/src/com/android/server/L2capNetworkProvider.java b/service/src/com/android/server/L2capNetworkProvider.java index 9d070cd598..fdc66dd139 100644 --- a/service/src/com/android/server/L2capNetworkProvider.java +++ b/service/src/com/android/server/L2capNetworkProvider.java @@ -509,24 +509,6 @@ public class L2capNetworkProvider { return true; } - private boolean isValidL2capClientSpecifier(L2capNetworkSpecifier l2capSpec) { - // The ROLE_CLIENT offer can be satisfied by a ROLE_ANY request. - if (l2capSpec.getRole() != ROLE_CLIENT) return false; - - // HEADER_COMPRESSION_ANY is never valid in a request. - if (l2capSpec.getHeaderCompression() == HEADER_COMPRESSION_ANY) return false; - - // remoteAddr must not be null for ROLE_CLIENT requests. - if (l2capSpec.getRemoteAddress() == null) return false; - - // Client network requests require a PSM to be specified. - // Ensure the PSM is within the valid range of dynamic BLE L2CAP values. - if (l2capSpec.getPsm() < 0x80) return false; - if (l2capSpec.getPsm() > 0xFF) return false; - - return true; - } - @Override public void onNetworkNeeded(NetworkRequest request) { // The NetworkSpecifier is guaranteed to be either null or an L2capNetworkSpecifier, so @@ -534,7 +516,7 @@ public class L2capNetworkProvider { final L2capNetworkSpecifier requestSpecifier = (L2capNetworkSpecifier) request.getNetworkSpecifier(); if (requestSpecifier == null) return; - if (!isValidL2capClientSpecifier(requestSpecifier)) { + if (!requestSpecifier.isValidClientRequestSpecifier()) { Log.i(TAG, "Ignoring invalid client request: " + request); return; }