I think this makes the code a bit nicer to read and write. This also reduces the chances of off-by-one errors when checking the bounds of the sample format value. --- src/map-file | 1 + src/modules/dbus/iface-core.c | 4 ++-- src/pulse/sample.c | 15 ++++++++------- src/pulse/sample.h | 3 +++ src/pulsecore/mix.c | 6 ++---- src/pulsecore/resampler.c | 8 ++++---- src/pulsecore/sconv.c | 32 ++++++++------------------------ src/pulsecore/svolume_c.c | 6 ++---- 8 files changed, 30 insertions(+), 45 deletions(-) diff --git a/src/map-file b/src/map-file index 39d5a01..45f5e41 100644 --- a/src/map-file +++ b/src/map-file @@ -251,6 +251,7 @@ pa_rtclock_now; pa_sample_format_is_be; pa_sample_format_is_le; pa_sample_format_to_string; +pa_sample_format_valid; pa_sample_size; pa_sample_size_of_format; pa_sample_spec_equal; diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c index 22dae32..9c293fd 100644 --- a/src/modules/dbus/iface-core.c +++ b/src/modules/dbus/iface-core.c @@ -510,7 +510,7 @@ static void handle_set_default_sample_format(DBusConnection *conn, DBusMessage * dbus_message_iter_get_basic(iter, &default_sample_format); - if (default_sample_format >= PA_SAMPLE_MAX) { + if (!pa_sample_format_valid(default_sample_format)) { pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample format."); return; } @@ -1317,7 +1317,7 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u dbus_message_iter_recurse(&msg_iter, &array_iter); dbus_message_iter_get_fixed_array(&array_iter, &data, &data_length); - if (sample_format >= PA_SAMPLE_MAX) { + if (!pa_sample_format_valid(sample_format)) { pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample format."); goto finish; } diff --git a/src/pulse/sample.c b/src/pulse/sample.c index b613612..f350380 100644 --- a/src/pulse/sample.c +++ b/src/pulse/sample.c @@ -52,8 +52,7 @@ static const size_t size_table[] = { }; size_t pa_sample_size_of_format(pa_sample_format_t f) { - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); return size_table[f]; } @@ -104,6 +103,10 @@ pa_sample_spec* pa_sample_spec_init(pa_sample_spec *spec) { return spec; } +int pa_sample_format_valid(unsigned format) { + return format < PA_SAMPLE_MAX; +} + int pa_sample_spec_valid(const pa_sample_spec *spec) { pa_assert(spec); @@ -111,8 +114,7 @@ int pa_sample_spec_valid(const pa_sample_spec *spec) { spec->rate > PA_RATE_MAX || spec->channels <= 0 || spec->channels > PA_CHANNELS_MAX || - spec->format >= PA_SAMPLE_MAX || - spec->format < 0)) + !pa_sample_format_valid(spec->format))) return 0; return 1; @@ -152,7 +154,7 @@ const char *pa_sample_format_to_string(pa_sample_format_t f) { [PA_SAMPLE_S24_32BE] = "s24-32be", }; - if (f < 0 || f >= PA_SAMPLE_MAX) + if (!pa_sample_format_valid(f)) return NULL; return table[f]; @@ -245,8 +247,7 @@ pa_sample_format_t pa_parse_sample_format(const char *format) { } int pa_sample_format_is_le(pa_sample_format_t f) { - pa_assert(f >= PA_SAMPLE_U8); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); switch (f) { case PA_SAMPLE_S16LE: diff --git a/src/pulse/sample.h b/src/pulse/sample.h index 34087e0..23c7d73 100644 --- a/src/pulse/sample.h +++ b/src/pulse/sample.h @@ -289,6 +289,9 @@ size_t pa_usec_to_bytes(pa_usec_t t, const pa_sample_spec *spec) PA_GCC_PURE; * pa_sample_spec_valid() will fail for it. \since 0.9.13 */ pa_sample_spec* pa_sample_spec_init(pa_sample_spec *spec); +/** Return non-zero if the given integer is a valid sample format. \since 5.0 */ +int pa_sample_format_valid(unsigned format) PA_GCC_PURE; + /** Return non-zero when the sample type specification is valid */ int pa_sample_spec_valid(const pa_sample_spec *spec) PA_GCC_PURE; diff --git a/src/pulsecore/mix.c b/src/pulsecore/mix.c index 4520d06..4b789a6 100644 --- a/src/pulsecore/mix.c +++ b/src/pulsecore/mix.c @@ -650,15 +650,13 @@ size_t pa_mix( } pa_do_mix_func_t pa_get_mix_func(pa_sample_format_t f) { - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); return do_mix_table[f]; } void pa_set_mix_func(pa_sample_format_t f, pa_do_mix_func_t func) { - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); do_mix_table[f] = func; } diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c index 3ac8f5e..d98f71d 100644 --- a/src/pulsecore/resampler.c +++ b/src/pulsecore/resampler.c @@ -254,8 +254,8 @@ static pa_resample_method_t pa_resampler_fix_method( /* Return true if a is a more precise sample format than b, else return false */ static bool sample_format_more_precise(pa_sample_format_t a, pa_sample_format_t b) { - pa_assert(a >= 0 && a < PA_SAMPLE_MAX); - pa_assert(b >= 0 && b < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(a)); + pa_assert(pa_sample_format_valid(b)); switch (a) { case PA_SAMPLE_U8: @@ -306,8 +306,8 @@ static pa_sample_format_t pa_resampler_choose_work_format( bool map_required) { pa_sample_format_t work_format; - pa_assert(a >= 0 && a < PA_SAMPLE_MAX); - pa_assert(b >= 0 && b < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(a)); + pa_assert(pa_sample_format_valid(b)); pa_assert(method >= 0); pa_assert(method < PA_RESAMPLER_MAX); diff --git a/src/pulsecore/sconv.c b/src/pulsecore/sconv.c index f0f154f..7e4f6bf 100644 --- a/src/pulsecore/sconv.c +++ b/src/pulsecore/sconv.c @@ -202,17 +202,13 @@ static pa_convert_func_t to_float32ne_table[] = { }; pa_convert_func_t pa_get_convert_to_float32ne_function(pa_sample_format_t f) { - - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); return to_float32ne_table[f]; } void pa_set_convert_to_float32ne_function(pa_sample_format_t f, pa_convert_func_t func) { - - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); to_float32ne_table[f] = func; } @@ -234,17 +230,13 @@ static pa_convert_func_t from_float32ne_table[] = { }; pa_convert_func_t pa_get_convert_from_float32ne_function(pa_sample_format_t f) { - - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); return from_float32ne_table[f]; } void pa_set_convert_from_float32ne_function(pa_sample_format_t f, pa_convert_func_t func) { - - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); from_float32ne_table[f] = func; } @@ -266,17 +258,13 @@ static pa_convert_func_t to_s16ne_table[] = { }; pa_convert_func_t pa_get_convert_to_s16ne_function(pa_sample_format_t f) { - - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); return to_s16ne_table[f]; } void pa_set_convert_to_s16ne_function(pa_sample_format_t f, pa_convert_func_t func) { - - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); to_s16ne_table[f] = func; } @@ -298,17 +286,13 @@ static pa_convert_func_t from_s16ne_table[] = { }; pa_convert_func_t pa_get_convert_from_s16ne_function(pa_sample_format_t f) { - - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); return from_s16ne_table[f]; } void pa_set_convert_from_s16ne_function(pa_sample_format_t f, pa_convert_func_t func) { - - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); from_s16ne_table[f] = func; } diff --git a/src/pulsecore/svolume_c.c b/src/pulsecore/svolume_c.c index 43b953c..eb04973 100644 --- a/src/pulsecore/svolume_c.c +++ b/src/pulsecore/svolume_c.c @@ -261,15 +261,13 @@ static pa_do_volume_func_t do_volume_table[] = { }; pa_do_volume_func_t pa_get_volume_func(pa_sample_format_t f) { - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); return do_volume_table[f]; } void pa_set_volume_func(pa_sample_format_t f, pa_do_volume_func_t func) { - pa_assert(f >= 0); - pa_assert(f < PA_SAMPLE_MAX); + pa_assert(pa_sample_format_valid(f)); do_volume_table[f] = func; } -- 1.8.3.1