Mercurial > dropbear
diff common-algo.c @ 683:63f8d6c469cf
ENABLE_USER_ALGO_LIST should work for the client
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 17 May 2012 00:26:12 +0800 |
parents | 4edea9f363d0 |
children | c37857676924 |
line wrap: on
line diff
--- a/common-algo.c Thu May 17 00:12:42 2012 +0800 +++ b/common-algo.c Thu May 17 00:26:12 2012 +0800 @@ -297,7 +297,7 @@ return ret_list; } -static int +static algo_type* check_algo(const char* algo_name, algo_type *algos) { algo_type *a; @@ -305,32 +305,25 @@ { if (strcmp(a->name, algo_name) == 0) { - a->usable = 2; - return DROPBEAR_SUCCESS; + return a; } } - return DROPBEAR_FAILURE; + return NULL; } -/* helper for check_user_algos */ static void try_add_algo(const char *algo_name, algo_type *algos, - const char *algo_desc, char ** out_list, int *num_ret) + const char *algo_desc, algo_type * new_algos, int *num_ret) { - if (check_algo(algo_name, algos) == DROPBEAR_FAILURE) + algo_type *match_algo = check_algo(algo_name, algos); + if (!match_algo) { dropbear_log(LOG_WARNING, "This Dropbear program does not support '%s' %s algorithm", algo_name, algo_desc); return; } - if (*num_ret != 0) - { - **out_list = ','; - (*out_list)++; - } - - *out_list += sprintf(*out_list, "%s", algo_name); + new_algos[*num_ret] = *match_algo; (*num_ret)++; } @@ -338,41 +331,32 @@ * options. Any that are not acceptable are removed in-place. Returns the * number of valid algorithms. */ int -check_user_algos(char* user_algo_list, algo_type * algos, +check_user_algos(const char* user_algo_list, algo_type * algos, const char *algo_desc) { + algo_type new_algos[MAX_PROPOSED_ALGO]; /* this has two passes. first we sweep through the given list of * algorithms and mark them as usable=2 in the algo_type[] array... */ int num_ret = 0; char *work_list = m_strdup(user_algo_list); char *last_name = work_list; - char *out_list = user_algo_list; char *c; for (c = work_list; *c; c++) { if (*c == ',') { *c = '\0'; - try_add_algo(last_name, algos, algo_desc, &out_list, &num_ret); + try_add_algo(last_name, algos, algo_desc, new_algos, &num_ret); last_name = c++; } } - try_add_algo(last_name, algos, algo_desc, &out_list, &num_ret); + try_add_algo(last_name, algos, algo_desc, new_algos, &num_ret); m_free(work_list); - /* ...then we mark anything with usable==1 as usable=0, and - * usable==2 as usable=1. */ - algo_type *a; - for (a = algos; a->name != NULL; a++) - { - if (a->usable == 1) - { - a->usable = 0; - } else if (a->usable == 2) - { - a->usable = 1; - } - } + new_algos[num_ret].name = NULL; + + /* Copy one more as a blank delimiter */ + memcpy(algos, new_algos, sizeof(*new_algos) * (num_ret+1)); return num_ret; } #endif // ENABLE_USER_ALGO_LIST