Bluetooth: Fix OOB data present for BR/EDR Secure Connections Only mode
[deliverable/linux.git] / net / bluetooth / hci_event.c
index 2f2abd986997de7b4004c47b55c4e4520242b62b..a3fb094822b621e5ef3b3205d1d5fce7c9d3f6b8 100644 (file)
@@ -3890,24 +3890,28 @@ static u8 bredr_oob_data_present(struct hci_conn *conn)
        if (!data)
                return 0x00;
 
-       /* When Secure Connections Only mode is enabled, then the P-256
-        * values are required. If they are not available, then do not
-        * declare that OOB data is present.
-        */
-       if (bredr_sc_enabled(hdev) &&
-           test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
-           (!memcmp(data->rand256, ZERO_KEY, 16) ||
-            !memcmp(data->hash256, ZERO_KEY, 16)))
-               return 0x00;
-
        if (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)) {
-               /* When Secure Connections has been enabled, then just
-                * return the present value stored with the OOB data. It
-                * will contain the right information about which data
-                * is present.
-                */
-               if (bredr_sc_enabled(hdev))
-                       return data->present;
+               if (bredr_sc_enabled(hdev)) {
+                       /* When Secure Connections is enabled, then just
+                        * return the present value stored with the OOB
+                        * data. The stored value contains the right present
+                        * information. However it can only be trusted when
+                        * not in Secure Connection Only mode.
+                        */
+                       if (!test_bit(HCI_SC_ONLY, &hdev->dev_flags))
+                               return data->present;
+
+                       /* When Secure Connections Only mode is enabled, then
+                        * the P-256 values are required. If they are not
+                        * available, then do not declare that OOB data is
+                        * present.
+                        */
+                       if (!memcmp(data->rand256, ZERO_KEY, 16) ||
+                           !memcmp(data->hash256, ZERO_KEY, 16))
+                               return 0x00;
+
+                       return 0x02;
+               }
 
                /* When Secure Connections is not enabled or actually
                 * not supported by the hardware, then check that if
This page took 0.027447 seconds and 5 git commands to generate.