From b58fed17ca3fd3839b3443552db4ceb5be31d6e2 Mon Sep 17 00:00:00 2001 From: Dave Heller Date: Thu, 24 Aug 2017 14:33:37 -0400 Subject: Add support for Component ID (container label) Signed-off-by: Dave Heller --- container.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) (limited to 'container.c') diff --git a/container.c b/container.c index 1f180a5..ceaa979 100644 --- a/container.c +++ b/container.c @@ -76,6 +76,11 @@ void debug_print(char *lead, unsigned char *buffer, size_t buflen) hex_print(lead, buffer, buflen); } +/** + * Validate hexadecimal ASCII input of a given length. + * - len is the byte len of the resulting value, not the len of the hexascii. + * - len = 0 means validate input of arbitrary length. +*/ int isValidHex(char *input, int len) { int r; size_t maxlen = 512; // sane limit @@ -88,9 +93,9 @@ int isValidHex(char *input, int len) { die(EX_DATAERR, "input exceeded max length: %lu", maxlen); if (len > 0) - sprintf(multiplier, "{%d}", len * 2); + sprintf(multiplier, "{%d}", len * 2); // allow this (byte) len only else - sprintf(multiplier, "+"); + sprintf(multiplier, "+"); // unlimited sprintf(pattern, "^(0x|0X)?[a-fA-F0-9]%s$", multiplier); @@ -103,3 +108,37 @@ int isValidHex(char *input, int len) { regfree(®expr); return result; } + +/** + * Validate ASCII input up to a given length. + * - len is the expected len of the ascii input. + * - len = 0 means validate input of arbitrary length. + * - NOTE: not all ascii chars are allowed here. + */ +int isValidAscii(char *input, int len) { + int r; + size_t maxlen = 256; // sane limit + regex_t regexpr; + char pattern[48]; + char multiplier[8]; + bool result = false; + + if (strnlen(input, maxlen) >= maxlen) + die(EX_DATAERR, "input exceeded max length: %lu", maxlen); + + if (len > 0) + sprintf(multiplier, "{,%d}", len); // allow *up to* this len + else + sprintf(multiplier, "+"); // unlimited + + sprintf(pattern, "^[a-zA-Z0-9_+-]%s$", multiplier); + + if ((r = regcomp(®expr, pattern, REG_EXTENDED | REG_NOSUB))) + die(EX_SOFTWARE, "%s", "failure to compile regex"); + + if (!(r = regexec(®expr, input, 0, NULL, 0))) + result = true; + + regfree(®expr); + return result; +} -- cgit v1.2.1