diff --git a/src/options.c b/src/options.c
index 50234f4..cf1db17 100644
--- a/src/options.c
+++ b/src/options.c
@@ -15,14 +15,14 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see .
*/
+#include
+#include
#include
#include
#include
#include
#include
-#include "aaruformat.h"
-#include "internal.h"
#include "structs/options.h"
#include "log.h"
@@ -37,7 +37,8 @@
*/
aaru_options parse_options(const char *options)
{
- TRACE("Entering parse_options(%s)", options);
+ const char *options_str = options != NULL ? options : "(null)";
+ TRACE("Entering parse_options(%s)", options_str);
aaru_options parsed = {.compress = true,
.deduplicate = true,
@@ -53,7 +54,7 @@ aaru_options parse_options(const char *options)
if(options == NULL)
{
- TRACE("Exiting aaruf_open() = {compress: %d, deduplicate: %d, dictionary: %u, table_shift: %u, "
+ TRACE("Exiting parse_options() = {compress: %d, deduplicate: %d, dictionary: %u, table_shift: %d, "
"data_shift: %u, block_alignment: %u, md5: %d, sha1: %d, sha256: %d, blake3: %d, spamsum: %d}",
parsed.compress, parsed.deduplicate, parsed.dictionary, parsed.table_shift, parsed.data_shift,
parsed.block_alignment, parsed.md5, parsed.sha1, parsed.sha256, parsed.blake3, parsed.spamsum);
@@ -64,7 +65,8 @@ aaru_options parse_options(const char *options)
strncpy(buffer, options, sizeof(buffer));
buffer[sizeof(buffer) - 1] = '\0';
- const char *token = strtok(buffer, ";");
+ char *saveptr = NULL;
+ char *token = strtok_r(buffer, ";", &saveptr);
while(token != NULL)
{
char *equal = strchr(token, '=');
@@ -87,18 +89,40 @@ aaru_options parse_options(const char *options)
}
else if(strncmp(key, "table_shift", 11) == 0)
{
- parsed.table_shift = (uint8_t)atoi(value);
- if(parsed.table_shift == 0) parsed.table_shift = 9;
+ errno = 0;
+ char *endptr = NULL;
+ long parsed_value = strtol(value, &endptr, 10);
+ if(errno == 0 && endptr != value)
+ {
+ if(parsed_value < INT8_MIN) parsed_value = INT8_MIN;
+ if(parsed_value > INT8_MAX) parsed_value = INT8_MAX;
+ parsed.table_shift = (int8_t)parsed_value;
+ if(parsed.table_shift == 0) parsed.table_shift = 9;
+ }
}
else if(strncmp(key, "data_shift", 10) == 0)
{
- parsed.data_shift = (uint8_t)atoi(value);
- if(parsed.data_shift == 0) parsed.data_shift = 12;
+ errno = 0;
+ char *endptr = NULL;
+ long parsed_value = strtol(value, &endptr, 10);
+ if(errno == 0 && endptr != value && parsed_value >= 0)
+ {
+ if(parsed_value > UINT8_MAX) parsed_value = UINT8_MAX;
+ parsed.data_shift = (uint8_t)parsed_value;
+ if(parsed.data_shift == 0) parsed.data_shift = 12;
+ }
}
else if(strncmp(key, "block_alignment", 15) == 0)
{
- parsed.block_alignment = (uint8_t)atoi(value);
- if(parsed.block_alignment == 0) parsed.block_alignment = 9;
+ errno = 0;
+ char *endptr = NULL;
+ long parsed_value = strtol(value, &endptr, 10);
+ if(errno == 0 && endptr != value && parsed_value >= 0)
+ {
+ if(parsed_value > UINT8_MAX) parsed_value = UINT8_MAX;
+ parsed.block_alignment = (uint8_t)parsed_value;
+ if(parsed.block_alignment == 0) parsed.block_alignment = 9;
+ }
}
else if(strncmp(key, "md5", 3) == 0)
parsed.md5 = bval;
@@ -111,10 +135,10 @@ aaru_options parse_options(const char *options)
else if(strncmp(key, "spamsum", 7) == 0)
parsed.spamsum = bval;
}
- token = strtok(NULL, ";");
+ token = strtok_r(NULL, ";", &saveptr);
}
- TRACE("Exiting aaruf_open() = {compress: %d, deduplicate: %d, dictionary: %u, table_shift: %u, "
+ TRACE("Exiting parse_options() = {compress: %d, deduplicate: %d, dictionary: %u, table_shift: %d, "
"data_shift: %u, block_alignment: %u, md5: %d, sha1: %d, sha256: %d, blake3: %d, spamsum: %d}",
parsed.compress, parsed.deduplicate, parsed.dictionary, parsed.table_shift, parsed.data_shift,
parsed.block_alignment, parsed.md5, parsed.sha1, parsed.sha256, parsed.blake3, parsed.spamsum);