Fix segfault in MIT dump entry parsing code
This commit is contained in:
@@ -153,7 +153,8 @@ mit_prop_dump(void *arg, const char *file)
|
|||||||
sp = krb5_storage_emem();
|
sp = krb5_storage_emem();
|
||||||
if (!sp)
|
if (!sp)
|
||||||
goto out;
|
goto out;
|
||||||
while ((ret = my_fgetln(f, &line, &line_bufsz, &line_len)) == 0) {
|
while ((ret = my_fgetln(f, &line, &line_bufsz, &line_len)) == 0 &&
|
||||||
|
!feof(f)) {
|
||||||
char *p = line;
|
char *p = line;
|
||||||
char *q;
|
char *q;
|
||||||
lineno++;
|
lineno++;
|
||||||
@@ -185,12 +186,18 @@ mit_prop_dump(void *arg, const char *file)
|
|||||||
}
|
}
|
||||||
krb5_storage_truncate(sp, 0);
|
krb5_storage_truncate(sp, 0);
|
||||||
ret = _hdb_mit_dump2mitdb_entry(pd->context, line, sp);
|
ret = _hdb_mit_dump2mitdb_entry(pd->context, line, sp);
|
||||||
if (ret) break;
|
if (ret) {
|
||||||
|
warnx("line: %d: failed to parse; ignoring", lineno);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
ret = krb5_storage_to_data(sp, &kdb_ent);
|
ret = krb5_storage_to_data(sp, &kdb_ent);
|
||||||
if (ret) break;
|
if (ret) break;
|
||||||
ret = _hdb_mdb_value2entry(pd->context, &kdb_ent, 0, &ent.entry);
|
ret = _hdb_mdb_value2entry(pd->context, &kdb_ent, 0, &ent.entry);
|
||||||
krb5_data_free(&kdb_ent);
|
krb5_data_free(&kdb_ent);
|
||||||
if (ret) break;
|
if (ret) {
|
||||||
|
warnx("line: %d: failed to store; ignoring", lineno);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
ret = v5_prop(pd->context, NULL, &ent, arg);
|
ret = v5_prop(pd->context, NULL, &ent, arg);
|
||||||
hdb_free_entry(pd->context, &ent);
|
hdb_free_entry(pd->context, &ent);
|
||||||
if (ret) break;
|
if (ret) break;
|
||||||
|
@@ -1172,6 +1172,8 @@ getint(char **p)
|
|||||||
{
|
{
|
||||||
int val;
|
int val;
|
||||||
char *q = nexttoken(p);
|
char *q = nexttoken(p);
|
||||||
|
if (!q)
|
||||||
|
return -1;
|
||||||
sscanf(q, "%d", &val);
|
sscanf(q, "%d", &val);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
@@ -1181,6 +1183,8 @@ getuint(char **p)
|
|||||||
{
|
{
|
||||||
int val;
|
int val;
|
||||||
char *q = nexttoken(p);
|
char *q = nexttoken(p);
|
||||||
|
if (!q)
|
||||||
|
return 0;
|
||||||
sscanf(q, "%u", &val);
|
sscanf(q, "%u", &val);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user