From a3947acb38fbd92cc9ac5e478088934fec1c239e Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Fri, 18 May 2012 17:29:12 -0500 Subject: [PATCH] Fix segfault in MIT dump entry parsing code --- kdc/mit_dump.c | 13 ++++++++++--- lib/hdb/hdb-mitdb.c | 4 ++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/kdc/mit_dump.c b/kdc/mit_dump.c index 4397d1ad8..51e137843 100644 --- a/kdc/mit_dump.c +++ b/kdc/mit_dump.c @@ -153,7 +153,8 @@ mit_prop_dump(void *arg, const char *file) sp = krb5_storage_emem(); if (!sp) 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 *q; lineno++; @@ -185,12 +186,18 @@ mit_prop_dump(void *arg, const char *file) } krb5_storage_truncate(sp, 0); 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); if (ret) break; ret = _hdb_mdb_value2entry(pd->context, &kdb_ent, 0, &ent.entry); 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); hdb_free_entry(pd->context, &ent); if (ret) break; diff --git a/lib/hdb/hdb-mitdb.c b/lib/hdb/hdb-mitdb.c index dd1a0bcc5..6a6f06be8 100644 --- a/lib/hdb/hdb-mitdb.c +++ b/lib/hdb/hdb-mitdb.c @@ -1172,6 +1172,8 @@ getint(char **p) { int val; char *q = nexttoken(p); + if (!q) + return -1; sscanf(q, "%d", &val); return val; } @@ -1181,6 +1183,8 @@ getuint(char **p) { int val; char *q = nexttoken(p); + if (!q) + return 0; sscanf(q, "%u", &val); return val; }