summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaulhsia <paulhsia@chromium.org>2019-10-03 15:02:28 +0800
committerCommit Bot <commit-bot@chromium.org>2019-10-05 03:27:48 +0000
commit0eb070bd571f7230e3417a6119eeec7155b40f2a (patch)
treea092b138538b9909013e0e909a097b8ded95b92c
parent722c5f91943477cf0445e833601b5923228bb4d0 (diff)
downloadadhd-0eb070bd571f7230e3417a6119eeec7155b40f2a.tar.gz
CRAS: cras_rclient: Add cras_rclient_create
Add cras_rclient_create back with an extra argument related to client connection type. The function will choose the right create function for users by the given connection type. Simplify handle_new_connection by adding connection type attribute to server_socket. Let fuzzer use cras_rclient_create. BUG=chromium:937765 TEST=Build and run $ cras_test_client --connection_type 1 -P /dev/urandom $ cras_test_client --connection_type 1 -C /dev/urandom (This should fail.) Change-Id: I64d07bd87d01e34c95549c84acad11ad5cca0fd4 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/adhd/+/1836843 Reviewed-by: Dylan Reid <dgreid@chromium.org> Tested-by: Chih-Yang Hsia <paulhsia@chromium.org> Commit-Queue: Chih-Yang Hsia <paulhsia@chromium.org>
-rw-r--r--cras/src/fuzz/rclient_message.cc3
-rw-r--r--cras/src/server/cras_rclient.c22
-rw-r--r--cras/src/server/cras_rclient.h6
-rw-r--r--cras/src/server/cras_server.c26
4 files changed, 35 insertions, 22 deletions
diff --git a/cras/src/fuzz/rclient_message.cc b/cras/src/fuzz/rclient_message.cc
index a4fe48af..a2a5650a 100644
--- a/cras/src/fuzz/rclient_message.cc
+++ b/cras/src/fuzz/rclient_message.cc
@@ -8,7 +8,6 @@
#include <stdint.h>
extern "C" {
-#include "cras_control_rclient.h"
#include "cras_iodev_list.h"
#include "cras_mix.h"
#include "cras_observer.h"
@@ -18,7 +17,7 @@ extern "C" {
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
- cras_rclient* client = cras_control_rclient_create(0, 0);
+ cras_rclient* client = cras_rclient_create(0, 0, CRAS_CONTROL);
cras_rclient_buffer_from_client(client, data, size, NULL, 0);
cras_rclient_destroy(client);
diff --git a/cras/src/server/cras_rclient.c b/cras/src/server/cras_rclient.c
index 998f2f8e..0ee507e1 100644
--- a/cras/src/server/cras_rclient.c
+++ b/cras/src/server/cras_rclient.c
@@ -11,11 +11,13 @@
#include "cras_apm_list.h"
#include "cras_bt_log.h"
#include "cras_config.h"
+#include "cras_control_rclient.h"
#include "cras_dsp.h"
#include "cras_iodev.h"
#include "cras_iodev_list.h"
#include "cras_messages.h"
#include "cras_observer.h"
+#include "cras_playback_rclient.h"
#include "cras_rclient.h"
#include "cras_rstream.h"
#include "cras_server_metrics.h"
@@ -54,3 +56,23 @@ int cras_rclient_send_message(const struct cras_rclient *client,
{
return client->ops->send_message_to_client(client, msg, fds, num_fds);
}
+
+struct cras_rclient *cras_rclient_create(int fd, size_t id,
+ enum CRAS_CONNECTION_TYPE conn_type)
+{
+ if (!cras_validate_connection_type(conn_type))
+ goto error;
+
+ switch (conn_type) {
+ case CRAS_CONTROL:
+ return cras_control_rclient_create(fd, id);
+ case CRAS_PLAYBACK:
+ return cras_playback_rclient_create(fd, id);
+ default:
+ goto error;
+ }
+
+error:
+ syslog(LOG_ERR, "unsupported connection type");
+ return NULL;
+}
diff --git a/cras/src/server/cras_rclient.h b/cras/src/server/cras_rclient.h
index c1545a87..6cffb7d8 100644
--- a/cras/src/server/cras_rclient.h
+++ b/cras/src/server/cras_rclient.h
@@ -9,6 +9,8 @@
#ifndef CRAS_RCLIENT_H_
#define CRAS_RCLIENT_H_
+#include "cras_types.h"
+
struct cras_client_message;
struct cras_message;
struct cras_server_message;
@@ -48,10 +50,12 @@ struct cras_rclient_ops {
* Args:
* fd - The file descriptor used for communication with the client.
* id - Unique identifier for this client.
+ * conn_type - Client connection type.
* Returns:
* A pointer to the newly created rclient on success, NULL on failure.
*/
-struct cras_rclient *cras_rclient_create(int fd, size_t id);
+struct cras_rclient *cras_rclient_create(int fd, size_t id,
+ enum CRAS_CONNECTION_TYPE conn_type);
/* Destroys an rclient created with "cras_rclient_create".
* Args:
diff --git a/cras/src/server/cras_server.c b/cras/src/server/cras_server.c
index 6796475f..97c83dfd 100644
--- a/cras/src/server/cras_server.c
+++ b/cras/src/server/cras_server.c
@@ -45,8 +45,6 @@
#include "cras_non_empty_audio_handler.h"
#include "cras_observer.h"
#include "cras_rclient.h"
-#include "cras_control_rclient.h"
-#include "cras_playback_rclient.h"
#include "cras_server.h"
#include "cras_server_metrics.h"
#include "cras_system_state.h"
@@ -105,6 +103,7 @@ struct system_task {
struct server_socket {
struct sockaddr_un addr;
int fd;
+ enum CRAS_CONNECTION_TYPE type;
};
/* Local server data. */
@@ -215,8 +214,7 @@ static void send_client_list_to_clients(struct server_data *serv)
/* Handles requests from a client to attach to the server. Create a local
* structure to track the client, assign it a unique id and let it attach */
-static void handle_new_connection(struct server_socket *server_socket,
- enum CRAS_CONNECTION_TYPE type)
+static void handle_new_connection(struct server_socket *server_socket)
{
int connection_fd;
struct attached_client *poll_client;
@@ -256,19 +254,9 @@ static void handle_new_connection(struct server_socket *server_socket,
poll_client->next = NULL;
poll_client->pollfd = NULL;
fill_client_info(poll_client);
- switch (type) {
- case CRAS_CONTROL:
- poll_client->client = cras_control_rclient_create(
- connection_fd, poll_client->id);
- break;
- case CRAS_PLAYBACK:
- poll_client->client = cras_playback_rclient_create(
- connection_fd, poll_client->id);
- break;
- default:
- syslog(LOG_ERR, "unsupported connection type");
- goto error;
- }
+
+ poll_client->client = cras_rclient_create(
+ connection_fd, poll_client->id, server_socket->type);
if (poll_client->client == NULL) {
syslog(LOG_ERR, "failed to create client");
goto error;
@@ -536,6 +524,7 @@ static int create_and_listen_server_socket(enum CRAS_CONNECTION_TYPE conn_type,
}
server_socket->fd = socket_fd;
+ server_socket->type = conn_type;
return 0;
error:
if (socket_fd >= 0) {
@@ -688,8 +677,7 @@ int cras_server_run(unsigned int profile_disable_mask)
if (pollfds[conn_type].revents & POLLIN)
handle_new_connection(
&server_instance
- .server_sockets[conn_type],
- conn_type);
+ .server_sockets[conn_type]);
}
/* Check if there are messages pending for any clients. */