error_out:
                /* Ugh */
                *tz = "(unknown)";
+               strcpy(person, *tz);
                strcpy(mail, *tz);
                *time = 0;
                return;
        tmp = person;
        tmp += len;
        *tmp = 0;
-       while (*tmp != ' ')
+       while (person < tmp && *tmp != ' ')
                tmp--;
+       if (tmp <= person)
+               goto error_out;
        *tz = tmp+1;
        tzlen = (person+len)-(tmp+1);
 
        *tmp = 0;
-       while (*tmp != ' ')
+       while (person < tmp && *tmp != ' ')
                tmp--;
+       if (tmp <= person)
+               goto error_out;
        *time = strtoul(tmp, NULL, 10);
        timepos = tmp;
 
        *tmp = 0;
-       while (*tmp != ' ')
+       while (person < tmp && *tmp != ' ')
                tmp--;
+       if (tmp <= person)
+               return;
        mailpos = tmp + 1;
        *tmp = 0;
        maillen = timepos - tmp;
 {
        int i, width;
 
-       for (width = 1, i = 10; i <= lines + 1; width++)
+       for (width = 1, i = 10; i <= lines; width++)
                i *= 10;
        return width;
 }
        if (top < 1)
                top = lno;
        bottom--;
-       if (lno < top)
+       if (lno < top || lno < bottom)
                die("file %s has only %lu lines", path, lno);
 
        ent = xcalloc(1, sizeof(*ent));