Add alloc checks, fixes #1156
This commit is contained in:
parent
c124af4534
commit
78a4fbed62
13 changed files with 106 additions and 46 deletions
|
@ -38,6 +38,7 @@ typedef struct am_analyze {
|
|||
unsigned signal_pulse_data[4000][3];
|
||||
} am_analyze_t;
|
||||
|
||||
/// Create an AM-Analyzer. Might fail and return NULL.
|
||||
am_analyze_t *am_analyze_create(void);
|
||||
|
||||
void am_analyze_free(am_analyze_t *a);
|
||||
|
|
|
@ -25,7 +25,7 @@ am_analyze_t *am_analyze_create(void)
|
|||
{
|
||||
am_analyze_t *a;
|
||||
a = calloc(1, sizeof(am_analyze_t));
|
||||
return a;
|
||||
return a; // NOTE: might silently return NULL on alloc failure.
|
||||
}
|
||||
|
||||
void am_analyze_free(am_analyze_t *a)
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include "limits.h"
|
||||
#include <limits.h>
|
||||
// gethostname() needs _XOPEN_SOURCE 500 on unistd.h
|
||||
#define _XOPEN_SOURCE 500
|
||||
|
||||
|
@ -174,7 +174,7 @@ data_array_t *data_array(int num_values, data_type_t type, void *values)
|
|||
array->num_values = num_values;
|
||||
array->type = type;
|
||||
}
|
||||
return array;
|
||||
return array; // NOTE: might silently return NULL on alloc failure.
|
||||
|
||||
alloc_error:
|
||||
if (array)
|
||||
|
|
|
@ -20,10 +20,10 @@
|
|||
r_device *create_device(r_device *dev_template)
|
||||
{
|
||||
r_device *r_dev = malloc(sizeof (*r_dev));
|
||||
if (dev_template)
|
||||
if (r_dev && dev_template)
|
||||
*r_dev = *dev_template; // copy
|
||||
|
||||
return r_dev;
|
||||
return r_dev; // NOTE: might silently return NULL on alloc failure.
|
||||
}
|
||||
|
||||
// variadic print functions
|
||||
|
@ -126,6 +126,8 @@ static char *bitrow_print_bits(bitrow_t const bitrow, unsigned bit_len)
|
|||
char *row_bits, *p;
|
||||
|
||||
p = row_bits = malloc(bit_len + bit_len / 4 + 1); // "1..\0" (1 space per nibble)
|
||||
if (!row_bits)
|
||||
return NULL; // NOTE: might silently return NULL on alloc failure.
|
||||
|
||||
// print bit-wide with a space every nibble
|
||||
for (unsigned i = 0; i < bit_len; ++i) {
|
||||
|
@ -163,7 +165,8 @@ void decoder_output_bitbuffer(r_device *decoder, bitbuffer_t const *bitbuffer, c
|
|||
|
||||
// a simpler representation for csv output
|
||||
row_codes[i] = malloc(8 + BITBUF_COLS * 2 + 1); // "{nnn}..\0"
|
||||
sprintf(row_codes[i], "{%d}%s", bitbuffer->bits_per_row[i], row_bytes);
|
||||
if (row_codes[i]) // NOTE: might silently skip on alloc failure.
|
||||
sprintf(row_codes[i], "{%d}%s", bitbuffer->bits_per_row[i], row_bytes);
|
||||
|
||||
if (decoder->verbose_bits) {
|
||||
row_bits[i] = bitrow_print_bits(bitbuffer->bb[i], bitbuffer->bits_per_row[i]);
|
||||
|
@ -214,7 +217,8 @@ void decoder_output_bitbuffer_array(r_device *decoder, bitbuffer_t const *bitbuf
|
|||
|
||||
// a simpler representation for csv output
|
||||
row_codes[i] = malloc(8 + BITBUF_COLS * 2 + 1); // "{nnn}..\0"
|
||||
sprintf(row_codes[i], "{%d}%s", bitbuffer->bits_per_row[i], row_bytes);
|
||||
if (row_codes[i]) // NOTE: might silently skip on alloc failure.
|
||||
sprintf(row_codes[i], "{%d}%s", bitbuffer->bits_per_row[i], row_bytes);
|
||||
}
|
||||
|
||||
data = data_make(
|
||||
|
@ -247,7 +251,8 @@ void decoder_output_bitrow(r_device *decoder, bitrow_t const bitrow, unsigned bi
|
|||
|
||||
// a simpler representation for csv output
|
||||
row_code = malloc(8 + BITBUF_COLS * 2 + 1); // "{nnn}..\0"
|
||||
sprintf(row_code, "{%d}%s", bit_len, row_bytes);
|
||||
if (row_code) // NOTE: might silently skip on alloc failure.
|
||||
sprintf(row_code, "{%d}%s", bit_len, row_bytes);
|
||||
|
||||
data = data_make(
|
||||
"msg", "", DATA_STRING, msg,
|
||||
|
|
|
@ -18,9 +18,18 @@ r_device fineoffset_WH2;
|
|||
static r_device *fineoffset_WH2_create(char *arg)
|
||||
{
|
||||
r_device *r_dev = create_device(&fineoffset_WH2);
|
||||
if (!r_dev) {
|
||||
fprintf(stderr, "create_device() failed");
|
||||
return NULL; // NOTE: returns NULL on alloc failure.
|
||||
}
|
||||
|
||||
if (arg && !strcmp(arg, "no-wh5")) {
|
||||
int *quirk = malloc(sizeof (*quirk));
|
||||
if (!quirk) {
|
||||
fprintf(stderr, "malloc() failed");
|
||||
free(r_dev);
|
||||
return NULL; // NOTE: returns NULL on alloc failure.
|
||||
}
|
||||
*quirk = 1;
|
||||
r_dev->decode_ctx = quirk;
|
||||
}
|
||||
|
|
|
@ -264,7 +264,8 @@ static int flex_callback(r_device *decoder, bitbuffer_t *bitbuffer)
|
|||
|
||||
// a simpler representation for csv output
|
||||
row_codes[i] = malloc(8 + BITBUF_COLS * 2 + 1); // "{nnn}..\0"
|
||||
sprintf(row_codes[i], "{%d}%s", bitbuffer->bits_per_row[i], row_bytes);
|
||||
if (row_codes[i]) // NOTE: might silently skip on alloc failure.
|
||||
sprintf(row_codes[i], "{%d}%s", bitbuffer->bits_per_row[i], row_bytes);
|
||||
}
|
||||
/* clang-format off */
|
||||
data = data_make(
|
||||
|
@ -426,8 +427,10 @@ const char *parse_map(const char *arg, struct flex_get *getter)
|
|||
const char *e = c;
|
||||
while (*e != ' ' && *e != ']') e++;
|
||||
val = malloc(e - c + 1);
|
||||
memcpy(val, c, e - c);
|
||||
val[e - c] = '\0';
|
||||
if (val) { // NOTE: might silently skip on alloc failure.
|
||||
memcpy(val, c, e - c);
|
||||
val[e - c] = '\0';
|
||||
}
|
||||
c = e;
|
||||
|
||||
// store result
|
||||
|
@ -477,7 +480,13 @@ r_device *flex_create_device(char *spec)
|
|||
}
|
||||
|
||||
struct flex_params *params = calloc(1, sizeof(*params));
|
||||
if (!params)
|
||||
return NULL; // NOTE: might silently return NULL on alloc failure.
|
||||
r_device *dev = calloc(1, sizeof(*dev));
|
||||
if (!dev) {
|
||||
free(params);
|
||||
return NULL; // NOTE: might silently return NULL on alloc failure.
|
||||
}
|
||||
dev->decode_ctx = params;
|
||||
char *c, *o;
|
||||
int get_count = 0;
|
||||
|
@ -501,7 +510,8 @@ r_device *flex_create_device(char *spec)
|
|||
params->name = strdup(c);
|
||||
int name_size = strlen(c) + 27;
|
||||
dev->name = malloc(name_size);
|
||||
snprintf(dev->name, name_size, "General purpose decoder '%s'", c);
|
||||
if (dev->name) // NOTE: might silently skip on alloc failure.
|
||||
snprintf(dev->name, name_size, "General purpose decoder '%s'", c);
|
||||
|
||||
c = strtok(NULL, ":");
|
||||
if (c != NULL) {
|
||||
|
|
|
@ -11,11 +11,16 @@
|
|||
|
||||
#include "list.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void list_ensure_size(list_t *list, size_t min_size)
|
||||
{
|
||||
if (!list->elems || list->size < min_size) {
|
||||
list->elems = realloc(list->elems, min_size * sizeof(*list->elems));
|
||||
if (!list->elems) {
|
||||
fprintf(stderr, "realloc() failed");
|
||||
exit(1); // NOTE: abort on alloc failure.
|
||||
}
|
||||
list->size = min_size;
|
||||
|
||||
list->elems[list->len] = NULL; // ensure a terminating NULL
|
||||
|
|
|
@ -330,6 +330,10 @@ static void print_mqtt_data(data_output_t *output, data_t *data, char *format)
|
|||
if (mqtt->states) {
|
||||
size_t message_size = 20000; // state message need a large buffer
|
||||
char *message = malloc(message_size);
|
||||
if (!message) {
|
||||
fprintf(stderr, "malloc() failed\n");
|
||||
return; // NOTE: skip on alloc failure.
|
||||
}
|
||||
data_print_jsons(data, message, message_size);
|
||||
expand_topic(mqtt->topic, mqtt->states, data, mqtt->hostname);
|
||||
mqtt_client_publish(mqtt->mgr, mqtt->topic, message);
|
||||
|
|
|
@ -56,6 +56,15 @@ void pulse_data_dump_raw(uint8_t *buf, unsigned len, uint64_t buf_offset, pulse_
|
|||
}
|
||||
}
|
||||
|
||||
__attribute__((always_inline))
|
||||
static inline void chk_ret(int ret)
|
||||
{
|
||||
if (ret < 0) {
|
||||
perror("File output error");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void pulse_data_print_vcd_header(FILE *file, uint32_t sample_rate)
|
||||
{
|
||||
char time_str[LOCAL_TIME_BUFLEN];
|
||||
|
@ -64,17 +73,17 @@ void pulse_data_print_vcd_header(FILE *file, uint32_t sample_rate)
|
|||
timescale = "1 us";
|
||||
else
|
||||
timescale = "100 ns";
|
||||
fprintf(file, "$date %s $end\n", format_time_str(time_str, NULL, 0));
|
||||
fprintf(file, "$version rtl_433 0.1.0 $end\n");
|
||||
fprintf(file, "$comment Acquisition at %s Hz $end\n", nice_freq(sample_rate));
|
||||
fprintf(file, "$timescale %s $end\n", timescale);
|
||||
fprintf(file, "$scope module rtl_433 $end\n");
|
||||
fprintf(file, "$var wire 1 / FRAME $end\n");
|
||||
fprintf(file, "$var wire 1 ' AM $end\n");
|
||||
fprintf(file, "$var wire 1 \" FM $end\n");
|
||||
fprintf(file, "$upscope $end\n");
|
||||
fprintf(file, "$enddefinitions $end\n");
|
||||
fprintf(file, "#0 0/ 0' 0\"\n");
|
||||
chk_ret(fprintf(file, "$date %s $end\n", format_time_str(time_str, NULL, 0)));
|
||||
chk_ret(fprintf(file, "$version rtl_433 0.1.0 $end\n"));
|
||||
chk_ret(fprintf(file, "$comment Acquisition at %s Hz $end\n", nice_freq(sample_rate)));
|
||||
chk_ret(fprintf(file, "$timescale %s $end\n", timescale));
|
||||
chk_ret(fprintf(file, "$scope module rtl_433 $end\n"));
|
||||
chk_ret(fprintf(file, "$var wire 1 / FRAME $end\n"));
|
||||
chk_ret(fprintf(file, "$var wire 1 ' AM $end\n"));
|
||||
chk_ret(fprintf(file, "$var wire 1 \" FM $end\n"));
|
||||
chk_ret(fprintf(file, "$upscope $end\n"));
|
||||
chk_ret(fprintf(file, "$enddefinitions $end\n"));
|
||||
chk_ret(fprintf(file, "#0 0/ 0' 0\"\n"));
|
||||
}
|
||||
|
||||
void pulse_data_print_vcd(FILE *file, pulse_data_t const *data, int ch_id)
|
||||
|
@ -87,15 +96,15 @@ void pulse_data_print_vcd(FILE *file, pulse_data_t const *data, int ch_id)
|
|||
uint64_t pos = data->offset;
|
||||
for (unsigned n = 0; n < data->num_pulses; ++n) {
|
||||
if (n == 0)
|
||||
fprintf(file, "#%.f 1/ 1%c\n", pos * scale, ch_id);
|
||||
chk_ret(fprintf(file, "#%.f 1/ 1%c\n", pos * scale, ch_id));
|
||||
else
|
||||
fprintf(file, "#%.f 1%c\n", pos * scale, ch_id);
|
||||
chk_ret(fprintf(file, "#%.f 1%c\n", pos * scale, ch_id));
|
||||
pos += data->pulse[n];
|
||||
fprintf(file, "#%.f 0%c\n", pos * scale, ch_id);
|
||||
chk_ret(fprintf(file, "#%.f 0%c\n", pos * scale, ch_id));
|
||||
pos += data->gap[n];
|
||||
}
|
||||
if (data->num_pulses > 0)
|
||||
fprintf(file, "#%.f 0/\n", pos * scale);
|
||||
chk_ret(fprintf(file, "#%.f 0/\n", pos * scale));
|
||||
}
|
||||
|
||||
void pulse_data_load(FILE *file, pulse_data_t *data, uint32_t sample_rate)
|
||||
|
@ -142,29 +151,29 @@ void pulse_data_print_pulse_header(FILE *file)
|
|||
{
|
||||
char time_str[LOCAL_TIME_BUFLEN];
|
||||
|
||||
fprintf(file, ";pulse data\n");
|
||||
fprintf(file, ";version 1\n");
|
||||
fprintf(file, ";timescale 1us\n");
|
||||
//fprintf(file, ";samplerate %u\n", data->sample_rate);
|
||||
fprintf(file, ";created %s\n", format_time_str(time_str, NULL, 0));
|
||||
chk_ret(fprintf(file, ";pulse data\n"));
|
||||
chk_ret(fprintf(file, ";version 1\n"));
|
||||
chk_ret(fprintf(file, ";timescale 1us\n"));
|
||||
//chk_ret(fprintf(file, ";samplerate %u\n", data->sample_rate));
|
||||
chk_ret(fprintf(file, ";created %s\n", format_time_str(time_str, NULL, 0)));
|
||||
}
|
||||
|
||||
void pulse_data_dump(FILE *file, pulse_data_t *data)
|
||||
{
|
||||
if (data->fsk_f2_est) {
|
||||
fprintf(file, ";fsk %d pulses\n", data->num_pulses);
|
||||
fprintf(file, ";freq1 %.0f\n", data->freq1_hz);
|
||||
fprintf(file, ";freq2 %.0f\n", data->freq2_hz);
|
||||
chk_ret(fprintf(file, ";fsk %d pulses\n", data->num_pulses));
|
||||
chk_ret(fprintf(file, ";freq1 %.0f\n", data->freq1_hz));
|
||||
chk_ret(fprintf(file, ";freq2 %.0f\n", data->freq2_hz));
|
||||
}
|
||||
else {
|
||||
fprintf(file, ";ook %d pulses\n", data->num_pulses);
|
||||
fprintf(file, ";freq1 %.0f\n", data->freq1_hz);
|
||||
chk_ret(fprintf(file, ";ook %d pulses\n", data->num_pulses));
|
||||
chk_ret(fprintf(file, ";freq1 %.0f\n", data->freq1_hz));
|
||||
}
|
||||
double to_us = 1e6 / data->sample_rate;
|
||||
for (unsigned i = 0; i < data->num_pulses; ++i) {
|
||||
fprintf(file, "%.0f %.0f\n", data->pulse[i] * to_us, data->gap[i] * to_us);
|
||||
chk_ret(fprintf(file, "%.0f %.0f\n", data->pulse[i] * to_us, data->gap[i] * to_us));
|
||||
}
|
||||
fprintf(file, ";end\n");
|
||||
chk_ret(fprintf(file, ";end\n"));
|
||||
}
|
||||
|
||||
// OOK adaptive level estimator constants
|
||||
|
|
11
src/r_api.c
11
src/r_api.c
|
@ -167,6 +167,10 @@ void register_protocol(r_cfg_t *cfg, r_device *r_dev, char *arg)
|
|||
fprintf(stderr, "Protocol [%d] \"%s\" does not take arguments \"%s\"!\n", r_dev->protocol_num, r_dev->name, arg);
|
||||
}
|
||||
p = malloc(sizeof(*p));
|
||||
if (!p) {
|
||||
fprintf(stderr, "Could not register protocol\n");
|
||||
exit(1);
|
||||
}
|
||||
*p = *r_dev; // copy
|
||||
}
|
||||
|
||||
|
@ -485,7 +489,8 @@ void data_acquired_handler(r_device *r_dev, data_t *data)
|
|||
free(d->value);
|
||||
d->type = DATA_INT;
|
||||
d->value = malloc(sizeof(int));
|
||||
*(int *)d->value = ok;
|
||||
if (d->value) // NOTE: might silently skip on alloc failure.
|
||||
*(int *)d->value = ok;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -863,6 +868,10 @@ void add_null_output(r_cfg_t *cfg, char *param)
|
|||
void add_dumper(r_cfg_t *cfg, char const *spec, int overwrite)
|
||||
{
|
||||
file_info_t *dumper = calloc(1, sizeof(*dumper));
|
||||
if (!dumper) {
|
||||
fprintf(stderr, "Could not add dumper\n");
|
||||
exit(1);
|
||||
}
|
||||
list_push(&cfg->demod->dumper, dumper);
|
||||
|
||||
parse_file_info(spec, dumper);
|
||||
|
|
|
@ -31,7 +31,7 @@ samp_grab_t *samp_grab_create(unsigned size)
|
|||
samp_grab_t *g;
|
||||
g = calloc(1, sizeof(*g));
|
||||
if (!g) {
|
||||
return NULL;
|
||||
return NULL; // NOTE: silently return NULL on alloc failure.
|
||||
}
|
||||
|
||||
g->sg_buf = malloc(size);
|
||||
|
@ -41,7 +41,7 @@ samp_grab_t *samp_grab_create(unsigned size)
|
|||
|
||||
if (!g->sg_buf) {
|
||||
free(g);
|
||||
return NULL;
|
||||
return NULL; // NOTE: silently return NULL on alloc failure.
|
||||
}
|
||||
|
||||
return g;
|
||||
|
|
12
src/sdr.c
12
src/sdr.c
|
@ -152,9 +152,8 @@ static int rtltcp_open(sdr_dev_t **out_dev, int *sample_size, char *dev_query, i
|
|||
fprintf(stderr, "rtl_tcp connected to %s:%s (Tuner: %s)\n", host, port, tuner_name);
|
||||
|
||||
sdr_dev_t *dev = calloc(1, sizeof(sdr_dev_t));
|
||||
|
||||
if (!dev)
|
||||
return -1;
|
||||
return -1; // NOTE: silently return on alloc failure.
|
||||
|
||||
dev->rtl_tcp = sock;
|
||||
dev->sample_size = sizeof(uint8_t); // CU8
|
||||
|
@ -187,7 +186,7 @@ static int rtltcp_read_loop(sdr_dev_t *dev, sdr_read_cb_t cb, void *ctx, uint32_
|
|||
free(dev->buffer);
|
||||
dev->buffer = malloc(buf_len);
|
||||
if (!dev->buffer)
|
||||
return -1;
|
||||
return -1; // NOTE: silently return on alloc failure.
|
||||
dev->buffer_size = buf_len;
|
||||
}
|
||||
uint8_t *buffer = dev->buffer;
|
||||
|
@ -295,6 +294,8 @@ static int sdr_open_rtl(sdr_dev_t **out_dev, int *sample_size, char *dev_query,
|
|||
char vendor[256] = "n/a", product[256] = "n/a", serial[256] = "n/a";
|
||||
int r = -1;
|
||||
sdr_dev_t *dev = calloc(1, sizeof(sdr_dev_t));
|
||||
if (!dev)
|
||||
return -1; // NOTE: silently return on alloc failure.
|
||||
|
||||
for (uint32_t i = dev_query ? dev_index : 0;
|
||||
//cast quiets -Wsign-compare; if dev_index were < 0, would have returned -1 above
|
||||
|
@ -604,6 +605,8 @@ static int sdr_open_soapy(sdr_dev_t **out_dev, int *sample_size, char *dev_query
|
|||
SoapySDR_setLogLevel(SOAPY_SDR_DEBUG);
|
||||
|
||||
sdr_dev_t *dev = calloc(1, sizeof(sdr_dev_t));
|
||||
if (!dev)
|
||||
return -1; // NOTE: silently return on alloc failure.
|
||||
|
||||
dev->soapy_dev = SoapySDRDevice_makeStrArgs(dev_query);
|
||||
if (!dev->soapy_dev) {
|
||||
|
@ -659,7 +662,8 @@ static int soapysdr_read_loop(sdr_dev_t *dev, sdr_read_cb_t cb, void *ctx, uint3
|
|||
free(dev->buffer);
|
||||
dev->buffer = malloc(buf_len);
|
||||
if (!dev->buffer)
|
||||
return -1;
|
||||
return -1; // NOTE: silently return on alloc failure.
|
||||
|
||||
dev->buffer_size = buf_len;
|
||||
}
|
||||
int16_t *buffer = dev->buffer;
|
||||
|
|
|
@ -138,6 +138,10 @@ static BOOL _term_has_color(console_t *console)
|
|||
static void *_term_init(FILE *fp)
|
||||
{
|
||||
console_t *console = calloc(1, sizeof(*console));
|
||||
if (!console) {
|
||||
fprintf(stderr, "term_init failed\n");
|
||||
return NULL; // NOTE: return NULL on alloc failure.
|
||||
}
|
||||
|
||||
int fd = fileno(fp);
|
||||
if (fd == STDOUT_FILENO) {
|
||||
|
|
Loading…
Add table
Reference in a new issue