Here's the fixes for db.c to get_line(), this also includes Andrew's addition to get_line() so we crash immediately if we wrongly use the buffer. diff -upPr -x *.o ../stk/db.c ./db.c --- ../stk/db.c Tue Sep 9 23:09:57 1997 +++ ./db.c Thu Oct 2 10:58:56 1997 @@ -845,7 +845,10 @@ void parse_simple_mob(FILE *mob_f, int i mob_proto[i].real_abils.con = 11; mob_proto[i].real_abils.cha = 11; - get_line(mob_f, line); + if (!get_line(mob_f, line)) { + fprintf(stderr, "Format error in mob #%d, no first line.\n", nr); + exit(1); + } if (sscanf(line, " %d %d %d %dd%d+%d %dd%d+%d ", t, t + 1, t + 2, t + 3, t + 4, t + 5, t + 6, t + 7, t + 8) != 9) { fprintf(stderr, "Format error in mob #%d, first line after S flag\n" @@ -869,15 +872,24 @@ void parse_simple_mob(FILE *mob_f, int i mob_proto[i].mob_specials.damsizedice = t[7]; mob_proto[i].points.damroll = t[8]; - get_line(mob_f, line); + if (!get_line(mob_f, line)) { + fprintf(stderr, "Format error in mob #%d, gold and experience line\n" + "...expecting line of form '# #'\n", nr); + exit(1); + } sscanf(line, " %d %d ", t, t + 1); GET_GOLD(mob_proto + i) = t[0]; GET_EXP(mob_proto + i) = t[1]; - get_line(mob_f, line); + if (!get_line(mob_f, line)) { + fprintf(stderr, "Format error in mob #%d, second line after S flag\n" + "..unexpected end of file.\n", nr); + exit(1); + } if (sscanf(line, " %d %d %d %d ", t, t + 1, t + 2, t + 3) != 3) { fprintf(stderr, "Format error in mob #%d, second line after S flag\n" "...expecting line of form '# # #'\n", nr); + exit(1); } mob_proto[i].char_specials.position = t[0]; @@ -1029,7 +1041,11 @@ void parse_mobile(FILE * mob_f, int nr) mob_proto[i].player.title = NULL; /* *** Numeric data *** */ - get_line(mob_f, line); + if (!get_line(mob_f, line)) { + fprintf(stderr, "Format error in mob #%d, first line after descriptions\n" + "...expecting line of form 'abc abc # x'\n", nr); + exit(1); + } sscanf(line, "%s %s %d %c", f1, f2, t + 2, &letter); MOB_FLAGS(mob_proto + i) = asciiflag_conv(f1); SET_BIT(MOB_FLAGS(mob_proto + i), MOB_ISNPC); @@ -1164,7 +1180,11 @@ char *parse_object(FILE * obj_f, int nr) fprintf(stderr, "Too many A fields (%d max), %s\n", MAX_OBJ_AFFECT, buf2); exit(1); } - get_line(obj_f, line); + if (!get_line(obj_f, line)) { + fprintf(stderr, "Format error in mob #%d, line after affection #%d\n" + "...expecting line of form '# #'\n", nr, j); + exit(1); + } sscanf(line, " %d %d ", t, t + 1); obj_proto[i].affected[j].location = t[0]; obj_proto[i].affected[j].modifier = t[1]; @@ -1201,34 +1221,48 @@ void load_zones(FILE * fl, char *zonenam if (num_of_cmds == 0) { fprintf(stderr, "%s is empty!\n", zname); - exit(0); + exit(1); } else CREATE(Z.cmd, struct reset_com, num_of_cmds); - line_num += get_line(fl, buf); + if ((tmp = get_line(fl, buf)) == 0) { + fprintf(stderr, "Format error in %s - premature end of file\n", zname); + exit(1); + } + line_num += tmp; if (sscanf(buf, "#%d", &Z.number) != 1) { fprintf(stderr, "Format error in %s, line %d\n", zname, line_num); - exit(0); + exit(1); } sprintf(buf2, "beginning of zone #%d", Z.number); - line_num += get_line(fl, buf); + if ((tmp = get_line(fl, buf)) == 0) { + fprintf(stderr, "Format error in %s - premature end of file\n", zname); + exit(1); + } + line_num += tmp; + if ((ptr = strchr(buf, '~')) != NULL) /* take off the '~' if it's there */ *ptr = '\0'; Z.name = str_dup(buf); - line_num += get_line(fl, buf); + if ((tmp = get_line(fl, buf)) == 0) { + fprintf(stderr, "Format error in %s - premature end of file\n", zname); + exit(1); + } + line_num += tmp; + if (sscanf(buf, " %d %d %d ", &Z.top, &Z.lifespan, &Z.reset_mode) != 3) { fprintf(stderr, "Format error in 3-constant line of %s", zname); - exit(0); + exit(1); } cmd_no = 0; for (;;) { if ((tmp = get_line(fl, buf)) == 0) { fprintf(stderr, "Format error in %s - premature end of file\n", zname); - exit(0); + exit(1); } line_num += tmp; ptr = buf; @@ -1257,7 +1291,7 @@ void load_zones(FILE * fl, char *zonenam if (error) { fprintf(stderr, "Format error in %s, line %d: '%s'\n", zname, line_num, buf); - exit(0); + exit(1); } ZCMD.line = line_num; cmd_no++; diff -upPr -x *.o ../stk/utils.c ./utils.c --- ../stk/utils.c Thu Jun 19 00:58:39 1997 +++ ./utils.c Thu Oct 2 10:54:58 1997 @@ -401,9 +401,10 @@ int get_line(FILE * fl, char *buf) temp[strlen(temp) - 1] = '\0'; } while (!feof(fl) && (*temp == '*' || !*temp)); - if (feof(fl)) + if (feof(fl)) { + *buf = '\0'; /* Make it NULL so we crash if wrongly used. */ return 0; - else { + } else { strcpy(buf, temp); return lines; } +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/08/00 PST