From 95132da2c81a7d1a17c353d7226142ad6a2d5c8c Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 21 Jan 2026 11:31:55 +0100 Subject: [PATCH] compress_ops: add magic and look for compress_plugin_mops symbol We need more validation of passed ops structure to allow further API changes in future. This change looks for compress_plugin_mops symbol in the dynamic plugin library to make sure that the new magic and new get_tstamp64 members are handled correctly. Closes: https://github.com/alsa-project/tinycompress/pull/31 Link: https://github.com/alsa-project/tinycompress/pull/29 Link: https://github.com/alsa-project/tinycompress/pull/30 Fixes: 0bd5530 ("compress_ops: add get_tstamp64") Signed-off-by: Jaroslav Kysela --- include/tinycompress/compress_ops.h | 3 +++ src/lib/compress.c | 9 ++++++++- src/lib/compress_hw.c | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/tinycompress/compress_ops.h b/include/tinycompress/compress_ops.h index 290a831..e816632 100644 --- a/include/tinycompress/compress_ops.h +++ b/include/tinycompress/compress_ops.h @@ -8,6 +8,8 @@ #include "sound/compress_offload.h" #include "tinycompress.h" +#define COMPRESS_OPS_V2 0xadcc0002 /* version 2 magic */ + /* * struct compress_ops: * ops structure containing ops corresponding to exposed @@ -16,6 +18,7 @@ * done in compress_hw.c */ struct compress_ops { + unsigned int magic; /* version of this structure */ void *(*open_by_name)(const char *name, unsigned int flags, struct compr_config *config); void (*close)(void *compress_data); diff --git a/src/lib/compress.c b/src/lib/compress.c index cf0b295..1ff3dfe 100644 --- a/src/lib/compress.c +++ b/src/lib/compress.c @@ -58,6 +58,7 @@ #include #include #include +#include #include #include "tinycompress/tinycompress.h" #include "tinycompress/compress_ops.h" @@ -136,7 +137,7 @@ static int populate_compress_plugin_ops(struct compress *compress, const char *n return ret; } - compress->ops = dlsym(dl_hdl, "compress_plugin_ops"); + compress->ops = dlsym(dl_hdl, "compress_plugin_mops"); err = dlerror(); if (err) { fprintf(stderr, "%s: dlsym to ops failed, err = '%s'\n", @@ -144,6 +145,12 @@ static int populate_compress_plugin_ops(struct compress *compress, const char *n dlclose(dl_hdl); return ret; } + if (compress->ops->magic != COMPRESS_OPS_V2) { + fprintf(stderr, "%s: dlsym to ops failed, bad magic (%08x)\n", + __func__, compress->ops->magic); + dlclose(dl_hdl); + return -ENXIO; + } compress->dl_hdl = dl_hdl; return 0; } diff --git a/src/lib/compress_hw.c b/src/lib/compress_hw.c index 52550ef..f576d04 100644 --- a/src/lib/compress_hw.c +++ b/src/lib/compress_hw.c @@ -641,6 +641,7 @@ static int compress_hw_set_codec_params(void *data, struct snd_codec *codec) } struct compress_ops compress_hw_ops = { + .magic = COMPRESS_OPS_V2, .open_by_name = compress_hw_open_by_name, .close = compress_hw_close, .get_hpointer = compress_hw_get_hpointer, -- 2.52.0