OSDN Git Service

android: Improve IPC helper to not send invalid status response
authorSzymon Janc <szymon.janc@tieto.com>
Mon, 18 Nov 2013 12:58:39 +0000 (13:58 +0100)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 18 Nov 2013 13:17:22 +0000 (15:17 +0200)
This fix issue with sending invalid success response from several
places where ipc_send_rsp was used for reporting success. Instead of
using using ipc_send for success response, make helper handle that.

android/a2dp.c
android/bluetooth.c
android/hidhost.c
android/ipc.c
android/ipc.h
android/main.c
android/pan.c
android/socket.c

index 4725e9e..b0cb9b5 100644 (file)
@@ -226,7 +226,7 @@ void bt_a2dp_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
                break;
        }
 
-       ipc_send_rsp(sk, HAL_SERVICE_ID_A2DP, status);
+       ipc_send_rsp(sk, HAL_SERVICE_ID_A2DP, opcode, status);
 }
 
 static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
index 5c5c61e..7dc2ec3 100644 (file)
@@ -2268,7 +2268,7 @@ void bt_bluetooth_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
 error:
        error("Error handling command 0x%02x status %u", opcode, status);
 
-       ipc_send_rsp(sk, HAL_SERVICE_ID_BLUETOOTH, status);
+       ipc_send_rsp(sk, HAL_SERVICE_ID_BLUETOOTH, opcode, status);
 }
 
 bool bt_bluetooth_register(int sk)
index f5a607c..842b8ad 100644 (file)
@@ -1109,7 +1109,7 @@ void bt_hid_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
                break;
        }
 
-       ipc_send_rsp(sk, HAL_SERVICE_ID_HIDHOST, status);
+       ipc_send_rsp(sk, HAL_SERVICE_ID_HIDHOST, opcode, status);
 }
 
 static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
index 729f157..8467b28 100644 (file)
@@ -80,10 +80,15 @@ void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
        }
 }
 
-void ipc_send_rsp(int sk, uint8_t service_id, uint8_t status)
+void ipc_send_rsp(int sk, uint8_t service_id, uint8_t opcode, uint8_t status)
 {
        struct hal_status s;
 
+       if (status == HAL_STATUS_SUCCESS) {
+               ipc_send(sk, service_id, opcode, 0, NULL, -1);
+               return;
+       }
+
        s.code = status;
 
        ipc_send(sk, service_id, HAL_OP_STATUS, sizeof(s), &s, -1);
index cf0f3d6..ad4a2d2 100644 (file)
@@ -23,4 +23,4 @@
 
 void ipc_send(int sk, uint8_t service_id, uint8_t opcode, uint16_t len,
                                                        void *param, int fd);
-void ipc_send_rsp(int sk, uint8_t service_id, uint8_t status);
+void ipc_send_rsp(int sk, uint8_t service_id, uint8_t opcode, uint8_t status);
index a4f5e84..c9733f3 100644 (file)
@@ -122,7 +122,8 @@ static void service_register(void *buf, uint16_t len)
        return;
 failed:
        ipc_send_rsp(g_io_channel_unix_get_fd(hal_cmd_io),
-                               HAL_SERVICE_ID_CORE, HAL_STATUS_FAILED);
+                               HAL_SERVICE_ID_CORE, HAL_OP_REGISTER_MODULE,
+                               HAL_STATUS_FAILED);
 }
 
 static void service_unregister(void *buf, uint16_t len)
@@ -164,7 +165,8 @@ static void service_unregister(void *buf, uint16_t len)
        return;
 failed:
        ipc_send_rsp(g_io_channel_unix_get_fd(hal_cmd_io),
-                               HAL_SERVICE_ID_CORE, HAL_STATUS_FAILED);
+                               HAL_SERVICE_ID_CORE, HAL_OP_UNREGISTER_MODULE,
+                               HAL_STATUS_FAILED);
 }
 
 static void handle_service_core(uint8_t opcode, void *buf, uint16_t len)
@@ -178,7 +180,8 @@ static void handle_service_core(uint8_t opcode, void *buf, uint16_t len)
                break;
        default:
                ipc_send_rsp(g_io_channel_unix_get_fd(hal_cmd_io),
-                               HAL_SERVICE_ID_CORE, HAL_STATUS_FAILED);
+                                               HAL_SERVICE_ID_CORE, opcode,
+                                               HAL_STATUS_FAILED);
                break;
        }
 }
@@ -274,7 +277,8 @@ static gboolean cmd_watch_cb(GIOChannel *io, GIOCondition cond,
                bt_pan_handle_cmd(fd, msg->opcode, msg->payload, msg->len);
                break;
        default:
-               ipc_send_rsp(fd, msg->service_id, HAL_STATUS_FAILED);
+               ipc_send_rsp(fd, msg->service_id, msg->opcode,
+                                                       HAL_STATUS_FAILED);
                break;
        }
 
index 46b3700..2a11f46 100644 (file)
@@ -87,7 +87,7 @@ void bt_pan_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
                break;
        }
 
-       ipc_send_rsp(sk, HAL_SERVICE_ID_PAN, status);
+       ipc_send_rsp(sk, HAL_SERVICE_ID_PAN, opcode, status);
 }
 
 bool bt_pan_register(int sk, const bdaddr_t *addr)
index e580036..04bb7d1 100644 (file)
@@ -75,7 +75,7 @@ void bt_sock_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
                break;
        }
 
-       ipc_send_rsp(sk, HAL_SERVICE_ID_SOCK, HAL_STATUS_FAILED);
+       ipc_send_rsp(sk, HAL_SERVICE_ID_SOCK, opcode, HAL_STATUS_FAILED);
 }
 
 bool bt_socket_register(int sk, const bdaddr_t *addr)