[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH] nixer: RPCs zum Teil abgesichert (Bug 77)
! Die Größe des SHMs muss immer ein Vielfaches der Framegröße sein.
* Beim Konfigurieren des Nixers sollte der der aktuelle SHM ungültig
werden.
! get_position sollte, wie alle anderen Funktionen auch, überprüfen, ob
der Aufrufer tatsächlich die aktuell angemeldete Anwendung ist.
Signed-off-by: Max Reitz <max@xxxxxxxxxx>
---
src/modules/c/mixer/input.c | 33 ++++++++++++++++++++++++++++-----
1 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/src/modules/c/mixer/input.c b/src/modules/c/mixer/input.c
index 2a0d800..b612e88 100644
--- a/src/modules/c/mixer/input.c
+++ b/src/modules/c/mixer/input.c
@@ -47,7 +47,7 @@ static pid_t current_source;
// Daten zum SHM in Richtung Anwendung
static uint32_t current_input_shm_id;
static size_t current_input_shm_size;
-static void* current_input_shm;
+static void* current_input_shm = NULL;
// Anzahl der Eingabechannels
static int input_channel_count;
@@ -80,8 +80,10 @@ RPC(mixer_config)
if (current_source && !mc->channel_count) {
current_source = 0;
current_input_shm_size = 0;
- current_input_shm = NULL;
- close_shared_memory(current_input_shm_id);
+ if (current_input_shm != NULL) {
+ current_input_shm = NULL;
+ close_shared_memory(current_input_shm_id);
+ }
trash_sound(false);
@@ -96,6 +98,13 @@ RPC(mixer_config)
input_format = mc->sample_format;
input_channel_count = mc->channel_count;
+ // Wenn bereits ein SHM existiert, wird die Anwendung den wohl eher nicht
+ // mehr nutzen wollen.
+ if (current_input_shm != NULL) {
+ current_input_shm = NULL;
+ close_shared_memory(current_input_shm_id);
+ }
+
// TODO: Rückgabewert nutzen und bei Bedarf resamplen
adriver->set_sample_rate(adriver, pbi, 0, mc->sample_rate);
@@ -119,11 +128,18 @@ RPC(get_shm)
}
// Wenn es bereits einen SHM gibt, muss dieser zuerst geschlossen werden.
- if (current_input_shm_id) {
+ if (current_input_shm != NULL) {
current_input_shm = NULL;
close_shared_memory(current_input_shm_id);
}
+ // Die Größe des SHMs muss immer ein Vielfaches der Größe eines Frames sein
+ // (halbe Frames lassen sich schlecht abspielen).
+ if (*((size_t*) data) % (sample_size[input_format] * input_channel_count)) {
+ rpc_dword_resp(0);
+ return;
+ }
+
current_input_shm_size = *((size_t*) data);
current_input_shm_id = create_shared_memory(current_input_shm_size);
@@ -147,7 +163,9 @@ RPC(play_input)
}
// Kleine Kontrolle
- if (*((uint32_t*) data) != current_input_shm_id) {
+ if ((current_input_shm == NULL) ||
+ (*((uint32_t*) data) != current_input_shm_id))
+ {
rpc_int_resp(0);
return;
}
@@ -249,6 +267,11 @@ RPC(play_input)
*/
RPC(get_position)
{
+ if (src != current_source) {
+ rpc_int_resp(0);
+ return;
+ }
+
if (!playing && (iq_start == NULL)) {
rpc_int_resp(0);
return;
--
1.7.4.4