tool_getparam: ensure string termination in parse_cert_parameter()

This commit is contained in:
Kamil Dudka 2013-05-03 22:57:18 +02:00
Родитель b47cf4f688
Коммит 2de20dd9a1
1 изменённых файлов: 11 добавлений и 8 удалений

Просмотреть файл

@ -298,13 +298,13 @@ static void parse_cert_parameter(const char *cert_parameter,
size_t span;
const char *param_place = NULL;
char *certname_place = NULL;
*certname = NULL;
*passphrase = NULL;
/* most trivial assumption: cert_parameter is empty */
if(param_length == 0) {
*certname = NULL;
if(param_length == 0)
return;
}
/* next less trivial: cert_parameter contains no colon nor backslash; this
* means no passphrase was given and no characters escaped */
if(!strpbrk(cert_parameter, ":\\")) {
@ -312,16 +312,17 @@ static void parse_cert_parameter(const char *cert_parameter,
return;
}
/* deal with escaped chars; find unescaped colon if it exists */
*certname = (char *) malloc(param_length + 1);
param_place = cert_parameter;
certname_place = *certname;
certname_place = malloc(param_length + 1);
if(!certname_place)
return;
*certname = certname_place;
param_place = cert_parameter;
while(*param_place) {
span = strcspn(param_place, ":\\");
strncpy(certname_place, param_place, span);
param_place += span;
certname_place += span;
*certname_place = '\0';
/* we just ate all the non-special chars. now we're on either a special
* char or the end of the string. */
switch(*param_place) {
@ -374,9 +375,11 @@ static void parse_cert_parameter(const char *cert_parameter,
if(strlen(param_place) > 0) {
*passphrase = strdup(param_place);
}
return;
goto done;
}
}
done:
*certname_place = '\0';
}
ParameterError getparameter(char *flag, /* f or -long-flag */