From 18eaeec1defa956e56732f84db6e028880cdcffe Mon Sep 17 00:00:00 2001 From: Maarten Billemont Date: Wed, 23 Aug 2017 00:53:14 -0400 Subject: [PATCH] Fix some rewrite bugs. --- core/c/mpw-marshall.c | 2 +- core/c/mpw-util.c | 1 + core/c/mpw-util.h | 6 +- platform-independent/cli-c/cli/mpw-cli.c | 70 +++++++++++------------- 4 files changed, 36 insertions(+), 43 deletions(-) diff --git a/core/c/mpw-marshall.c b/core/c/mpw-marshall.c index bc25afa9..c83f941e 100644 --- a/core/c/mpw-marshall.c +++ b/core/c/mpw-marshall.c @@ -332,7 +332,7 @@ static bool mpw_marshall_write_json( if (site->url) json_object_object_add( json_site_mpw, "url", json_object_new_string( site->url ) ); - mpw_free_strings( &content, &loginContent ); + mpw_free_strings( &content, &loginContent, NULL ); } mpw_string_pushf( out, "%s\n", json_object_to_json_string_ext( json_file, JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_SPACED ) ); diff --git a/core/c/mpw-util.c b/core/c/mpw-util.c index f67f746c..592d511b 100644 --- a/core/c/mpw-util.c +++ b/core/c/mpw-util.c @@ -129,6 +129,7 @@ bool __mpw_free_strings(const char **strings, ...) { va_list args; va_start( args, strings ); + success &= mpw_free_string( strings ); for (const char **string; (string = va_arg( args, const char ** ));) success &= mpw_free_string( string ); va_end( args ); diff --git a/core/c/mpw-util.h b/core/c/mpw-util.h index 9f7d1cd6..c40d59a9 100644 --- a/core/c/mpw-util.h +++ b/core/c/mpw-util.h @@ -132,17 +132,17 @@ bool mpw_push_int( bool __mpw_realloc(const void **buffer, size_t *bufferSize, const size_t deltaSize); /** Free a buffer after zero'ing its contents, then set the reference to NULL. */ #define mpw_free(buffer, bufferSize) \ - ({ typeof(buffer) _b = buffer; const void *__b = *_b; __mpw_free((const void **)_b, bufferSize); }) + ({ typeof(buffer) _b = buffer; const void *__b = *_b; __mpw_free( (const void **)_b, bufferSize ); }) bool __mpw_free( const void **buffer, const size_t bufferSize); /** Free a string after zero'ing its contents, then set the reference to NULL. */ #define mpw_free_string(string) \ - ({ typeof(string) _s = string; const char *__s = *_s; __mpw_free_string((const char **)_s); }) + ({ typeof(string) _s = string; const char *__s = *_s; __mpw_free_string( (const char **)_s ); }) bool __mpw_free_string( const char **string); /** Free strings after zero'ing their contents, then set the references to NULL. Terminate the va_list with NULL. */ #define mpw_free_strings(strings, ...) \ - ({ typeof(strings) _s = strings; const char *__s = *_s; __mpw_free_strings((const char **)strings, __VA_ARGS__); }) + ({ typeof(strings) _s = strings; const char *__s = *_s; __mpw_free_strings( (const char **)_s, __VA_ARGS__ ); }) bool __mpw_free_strings( const char **strings, ...); diff --git a/platform-independent/cli-c/cli/mpw-cli.c b/platform-independent/cli-c/cli/mpw-cli.c index eb046d95..9b90ccf5 100644 --- a/platform-independent/cli-c/cli/mpw-cli.c +++ b/platform-independent/cli-c/cli/mpw-cli.c @@ -271,6 +271,17 @@ int main(int argc, char *const argv[]) { return EX_USAGE; } } + MPKeyPurpose keyPurpose = MPKeyPurposeAuthentication; + if (keyPurposeArg) { + keyPurpose = mpw_purposeWithName( keyPurposeArg ); + if (ERR == (int)keyPurpose) { + ftl( "Invalid purpose: %s\n", keyPurposeArg ); + return EX_USAGE; + } + } + const char *keyContext = NULL; + if (keyContextArg) + keyContext = strdup( keyContextArg ); // Find the user's sites file. FILE *sitesFile = NULL; @@ -355,52 +366,33 @@ int main(int argc, char *const argv[]) { // Load the site object. for (size_t s = 0; s < user->sites_count; ++s) { site = &user->sites[s]; - if (strcmp( siteName, site->name ) != 0) { - site = NULL; - continue; - } - break; + if (strcmp( siteName, site->name ) == 0) + // Found. + break; + site = NULL; } if (!site) site = mpw_marshall_site( user, siteName, MPResultTypeDefault, MPCounterValueDefault, user->algorithm ); mpw_free_string( &siteName ); - // Load the purpose and context / question object. - MPKeyPurpose keyPurpose = MPKeyPurposeAuthentication; - if (keyPurposeArg) { - keyPurpose = mpw_purposeWithName( keyPurposeArg ); - if (ERR == (int)keyPurpose) { - ftl( "Invalid purpose: %s\n", keyPurposeArg ); - mpw_marshal_free( &user ); - mpw_free_string( &sitesPath ); - return EX_USAGE; - } - } - const char *keyContext = NULL; - if (keyContextArg) { - keyContext = strdup( keyContextArg ); - - switch (keyPurpose) { - case MPKeyPurposeAuthentication: - // NOTE: keyContext is not persisted. - break; - case MPKeyPurposeIdentification: - // NOTE: keyContext is not persisted. - break; - case MPKeyPurposeRecovery: - for (size_t q = 0; q < site->questions_count; ++q) { - question = &site->questions[q]; - if (strcmp( keyContext, question->keyword ) != 0) { - question = NULL; - continue; - } + // Load the question object. + switch (keyPurpose) { + case MPKeyPurposeAuthentication: + case MPKeyPurposeIdentification: + break; + case MPKeyPurposeRecovery: + for (size_t q = 0; q < site->questions_count; ++q) { + question = &site->questions[q]; + if ((!keyContext && !strlen( question->keyword )) || + (keyContext && strcmp( keyContext, question->keyword ) != 0)) + // Found. break; - } - break; - } + question = NULL; + } + if (!question) + question = mpw_marshal_question( site, keyContext ); + break; } - if (!question) - question = mpw_marshal_question( site, keyContext ); // Initialize purpose-specific operation parameters. MPResultType resultType = MPResultTypeDefault;