Add alloc checks, fixes

This commit is contained in:
Christian W. Zuckschwerdt 2019-10-16 18:00:08 +02:00
parent c124af4534
commit 78a4fbed62
13 changed files with 106 additions and 46 deletions

View file

@ -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);

View file

@ -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)

View file

@ -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)

View file

@ -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,

View file

@ -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;
}

View file

@ -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) {

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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) {