Skip to content

Commit f0f9875

Browse files
author
Reini Urban
committed
fix compiler warnings, check returns
fix all but one -Wmaybe-uninitialized
1 parent 8241f21 commit f0f9875

File tree

12 files changed

+164
-52
lines changed

12 files changed

+164
-52
lines changed

src/gpio/gpio.c

+15-3
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,11 @@ mraa_gpio_wait_interrupt(int fds[],
596596

597597
// do an initial read to clear interrupt
598598
lseek(fds[i], 0, SEEK_SET);
599-
read(fds[i], &c, 1);
599+
ssize_t nbytes = read(fds[i], &c, 1);
600+
if (nbytes < 0) {
601+
syslog(LOG_ERR, "mraa_gpio_wait_interrupt: Failed to read from poll fd");
602+
return MRAA_ERROR_NO_DATA_AVAILABLE;
603+
}
600604
}
601605

602606
#ifdef HAVE_PTHREAD_CANCEL
@@ -614,7 +618,11 @@ mraa_gpio_wait_interrupt(int fds[],
614618

615619
for (int i = 0; i < num_fds; ++i) {
616620
if (pfd[i].revents & POLLPRI) {
617-
read(fds[i], &c, 1);
621+
ssize_t nbytes = read(fds[i], &c, 1);
622+
if (nbytes < 0) {
623+
syslog(LOG_ERR, "mraa_gpio_wait_interrupt: Failed to read from poll fd");
624+
return MRAA_ERROR_NO_DATA_AVAILABLE;
625+
}
618626
events[i].id = i;
619627
events[i].timestamp = _mraa_gpio_get_timestamp_sysfs();
620628
} else
@@ -645,7 +653,11 @@ mraa_gpio_chardev_wait_interrupt(int fds[], int num_fds, mraa_gpio_events_t even
645653

646654
for (int i = 0; i < num_fds; ++i) {
647655
if (pfd[i].revents & POLLIN) {
648-
read(fds[i], &event_data, sizeof(event_data));
656+
ssize_t nbytes = read(fds[i], &event_data, sizeof(event_data));
657+
if (nbytes < 0) {
658+
syslog(LOG_ERR, "mraa_gpio_chardev_wait_interrupt: Failed to read from poll fd");
659+
return MRAA_ERROR_NO_DATA_AVAILABLE;
660+
}
649661
events[i].id = i;
650662
events[i].timestamp = event_data.timestamp;
651663
} else

src/iio/iio.c

+23-5
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,13 @@ mraa_iio_get_channel_data(mraa_iio_context dev)
111111
snprintf(buf, MAX_SIZE, "%stype", str);
112112
fd = open(buf, O_RDONLY);
113113
if (fd != -1) {
114-
read(fd, readbuf, 31 * sizeof(char));
114+
ssize_t nbytes = read(fd, readbuf, 31 * sizeof(char));
115+
if (nbytes < 0) {
116+
// cleanup
117+
free(str);
118+
close(fd);
119+
return MRAA_IO_SETUP_FAILURE;
120+
}
115121
ret = sscanf(readbuf, "%ce:%c%u/%u>>%u", &shortbuf, &signchar, &chan->bits_used,
116122
&padint, &chan->shift);
117123
// probably should be 5?
@@ -303,8 +309,12 @@ mraa_iio_wait_event(int fd, char* data, int* read_size)
303309

304310
memset(data, 0, 100);
305311
*read_size = read(fd, data, 100);
306-
307-
return MRAA_SUCCESS;
312+
if (*read_size >= 0)
313+
return MRAA_SUCCESS;
314+
else {
315+
syslog(LOG_ERR, "mraa_iio_wait_event: Failed to read from poll fd");
316+
return MRAA_ERROR_NO_DATA_AVAILABLE;
317+
}
308318
}
309319

310320
static void*
@@ -431,7 +441,11 @@ mraa_iio_event_poll_nonblock(int fd, struct iio_event_data* data)
431441
// poll is a cancelable point like sleep()
432442
poll(&pfd, 1, -1);
433443

434-
read(fd, data, sizeof(struct iio_event_data));
444+
ssize_t nbytes = read(fd, data, sizeof(struct iio_event_data));
445+
if (nbytes < 0) {
446+
syslog(LOG_ERR, "mraa_iio_event_poll_nonblock: Failed to read iio_event_data");
447+
return MRAA_ERROR_NO_DATA_AVAILABLE;
448+
}
435449

436450
return MRAA_SUCCESS;
437451
}
@@ -456,7 +470,11 @@ mraa_iio_event_poll(mraa_iio_context dev, struct iio_event_data* data)
456470
if (ret == -1 || event_fd == -1)
457471
return MRAA_ERROR_UNSPECIFIED;
458472

459-
read(event_fd, data, sizeof(struct iio_event_data));
473+
ssize_t nbytes = read(event_fd, data, sizeof(struct iio_event_data));
474+
if (nbytes < 0) {
475+
syslog(LOG_ERR, "mraa_iio_event_poll: Failed to read iio_event_data");
476+
return MRAA_ERROR_NO_DATA_AVAILABLE;
477+
}
460478

461479
close(event_fd);
462480
return MRAA_SUCCESS;

src/initio/initio.c

+8-6
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ mraa_tokenize_string(const char* str, const char* delims, int* num_tokens)
5757
if (tok == NULL) {
5858
break;
5959
}
60+
size_t tok_len = strlen(tok);
6061
output = realloc(output, (++output_size) * sizeof(char*));
61-
output[output_size - 1] = calloc(strlen(tok) + 1, sizeof(char));
62-
strncpy(output[output_size - 1], tok, strlen(tok));
62+
output[output_size - 1] = calloc(tok_len + 1, sizeof(char));
63+
strncpy(output[output_size - 1], tok, tok_len + 1);
6364
}
6465
*num_tokens = output_size;
6566

@@ -762,20 +763,21 @@ mraa_io_init(const char* strdesc, mraa_io_descriptor** desc)
762763
}
763764
} else {
764765
/* Here we build the leftover string. */
766+
size_t descs_len = strlen(str_descs[i]);
765767
new_desc->leftover_str =
766-
realloc(new_desc->leftover_str, sizeof(char) * (leftover_str_len + strlen(str_descs[i]) + 2));
768+
realloc(new_desc->leftover_str, sizeof(char) * (leftover_str_len + descs_len) + 2);
767769
if (!new_desc->leftover_str) {
768770
syslog(LOG_ERR, "mraa_io_init: error allocating memory for leftover string");
769771
status = MRAA_ERROR_NO_RESOURCES;
770772
free(new_desc);
771773
} else {
772774
if (leftover_str_len == 0) {
773-
strncpy(new_desc->leftover_str, str_descs[i], strlen(str_descs[i]));
775+
strncpy(new_desc->leftover_str, str_descs[i], descs_len);
774776
} else {
775-
strncat(new_desc->leftover_str, str_descs[i], strlen(str_descs[i]));
777+
strncat(new_desc->leftover_str, str_descs[i], leftover_str_len + descs_len);
776778
}
777779

778-
leftover_str_len += strlen(str_descs[i]) + 1;
780+
leftover_str_len += descs_len + 1;
779781
new_desc->leftover_str[leftover_str_len - 1] = ',';
780782
new_desc->leftover_str[leftover_str_len] = '\0';
781783
}

src/json/jsonplatform.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,7 @@ mraa_init_json_platform(const char* platform_json)
601601
int file_lock = 0, i = 0;
602602
json_object* jobj_platform = NULL;
603603
mraa_board_t* board = NULL;
604+
size_t len;
604605

605606
// Try to lock the file for use
606607
if ((file_lock = open(platform_json, O_RDONLY)) == -1) {
@@ -703,14 +704,15 @@ mraa_init_json_platform(const char* platform_json)
703704
if (!plat->platform_name) {
704705
goto unsuccessful;
705706
} else {
706-
platform_name = calloc(strlen(plat->platform_name) + 1, sizeof(char));
707+
len = strlen(plat->platform_name);
708+
platform_name = calloc(len + 1, sizeof(char));
707709
}
708710

709711
if (platform_name == NULL) {
710712
syslog(LOG_ERR, "init_json_platform: Could not allocate memory for platform_name");
711713
goto unsuccessful;
712714
}
713-
strncpy(platform_name, plat->platform_name, strlen(plat->platform_name) + 1);
715+
strncpy(platform_name, plat->platform_name, len + 1);
714716

715717
// We made it to the end without anything going wrong, just cleanup
716718
ret = MRAA_SUCCESS;

src/mraa.c

+12-7
Original file line numberDiff line numberDiff line change
@@ -378,9 +378,8 @@ mraa_iio_detect()
378378
// remove any trailing CR/LF symbols
379379
name[strcspn(name, "\r\n")] = '\0';
380380
len = strlen(name);
381-
// use strndup
382381
device->name = malloc((sizeof(char) * len) + sizeof(char));
383-
strncpy(device->name, name, len + 1);
382+
memcpy(device->name, name, len + 1);
384383
}
385384
close(fd);
386385
}
@@ -910,7 +909,7 @@ mraa_gpio_lookup(const char* pin_name)
910909
if (!(plat->pins[i].capabilities.gpio))
911910
continue;
912911

913-
if (plat->pins[i].name != NULL &&
912+
if (*plat->pins[i].name &&
914913
strncmp(pin_name, plat->pins[i].name, strlen(plat->pins[i].name) + 1) == 0) {
915914
return i;
916915
}
@@ -1158,9 +1157,15 @@ mraa_find_uart_bus_pci(const char* pci_dev_path, char** dev_name)
11581157
return MRAA_ERROR_INVALID_RESOURCE;
11591158
}
11601159

1161-
*dev_name = (char*) malloc(sizeof(char) * max_allowable_len);
1160+
size_t len = strlen(namelist[n - 1]->d_name);
1161+
if (len > max_allowable_len)
1162+
if (n <= 0) {
1163+
syslog(LOG_ERR, "device name too long: %s", namelist[n - 1]->d_name);
1164+
return MRAA_ERROR_INVALID_RESOURCE;
1165+
}
1166+
*dev_name = (char*) malloc(sizeof(char) * len + 6);
11621167

1163-
snprintf(*dev_name, max_allowable_len, "/dev/%s", namelist[n - 1]->d_name);
1168+
snprintf(*dev_name, len + 5, "/dev/%s", namelist[n - 1]->d_name);
11641169
while (n--) {
11651170
free(namelist[n]);
11661171
}
@@ -1523,7 +1528,7 @@ mraa_init_io(const char* desc)
15231528
if (length > 255 || length == 0) {
15241529
return NULL;
15251530
}
1526-
strncpy(buffer, desc, length);
1531+
strncpy(buffer, desc, sizeof(buffer) - 1);
15271532

15281533
str = buffer;
15291534
token = strsep(&str, delim);
@@ -1534,7 +1539,7 @@ mraa_init_io(const char* desc)
15341539
syslog(LOG_ERR, "mraa_init_io: An invalid IO type was provided");
15351540
return NULL;
15361541
}
1537-
strncpy(type, token, length);
1542+
strncpy(type, token, sizeof(type) - 1);
15381543
mraa_to_upper(type);
15391544
token = strsep(&str, delim);
15401545
// Check that they've given us more information than just the type

src/uart/uart.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,14 @@ mraa_uart_init_raw(const char* path)
262262
status = MRAA_ERROR_NO_RESOURCES;
263263
goto init_raw_cleanup;
264264
}
265-
dev->path = (char*) calloc(strlen(path)+1, sizeof(char));
265+
size_t path_len = strlen(path);
266+
dev->path = (char*) calloc(path_len+1, sizeof(char));
266267
if (dev->path == NULL) {
267268
syslog(LOG_ERR, "uart: Failed to allocate memory for path");
268269
status = MRAA_ERROR_NO_RESOURCES;
269270
goto init_raw_cleanup;
270271
}
271-
strncpy((char *) dev->path, path, strlen(path));
272+
memcpy((char*) dev->path, path, path_len + 1);
272273

273274
if (IS_FUNC_DEFINED(dev, uart_init_raw_replace)) {
274275
status = dev->advance_func->uart_init_raw_replace(dev, path);

0 commit comments

Comments
 (0)