diff -urp john-1.7.6.orig/src/loader.h john-1.7.6/src/loader.h --- john-1.7.6.orig/src/loader.h 2010-01-18 05:19:40 +0000 +++ john-1.7.6/src/loader.h 2010-07-12 01:45:56 +0000 @@ -74,6 +74,11 @@ struct db_keys { /* Number of keys currently in the buffer */ int count; +/* Whether we have words to base candidate passwords on or not. + * Even if not, we need this keys buffer anyway to hold other salts' successful + * guesses for testing against this salt's hashes. */ + int have_words; + /* Number of last processed rule */ int rule; diff -urp john-1.7.6.orig/src/single.c john-1.7.6/src/single.c --- john-1.7.6.orig/src/single.c 2010-01-18 06:17:13 +0000 +++ john-1.7.6/src/single.c 2010-07-12 02:05:28 +0000 @@ -70,6 +70,7 @@ static void single_alloc_keys(struct db_ (*keys)->count = 0; (*keys)->ptr = (*keys)->buffer; + (*keys)->have_words = 1; /* assume yes; we'll see for real later */ (*keys)->rule = rule_number; (*keys)->lock = 0; memset((*keys)->hash, -1, hash_size); @@ -332,8 +333,9 @@ static int single_process_salt(struct db int status, have_words = 0; keys = salt->keys; - if (!keys) - return 0; + + if (!keys->have_words) + goto no_own_words; last = &salt->list; pw = *last; @@ -365,8 +367,9 @@ next: if (!keys->count) keys->rule = rule_number; if (!have_words) { + keys->have_words = 0; +no_own_words: if (keys->count && single_process_buffer(salt)) return 1; - salt->keys = NULL; } return 0; @@ -408,7 +411,7 @@ static void single_run(void) do { if (!salt->list) continue; if (single_process_salt(salt, rule)) return; - if (!salt->keys) continue; + if (!salt->keys->have_words) continue; have_words = 1; if (salt->keys->rule < min) min = salt->keys->rule; @@ -435,7 +438,7 @@ static void single_done(void) "candidate passwords, if any"); do { - if (!salt->list || !salt->keys) continue; + if (!salt->list) continue; if (salt->keys->count) if (single_process_buffer(salt)) break; } while ((salt = salt->next));