diff --git a/7.3.152 b/7.3.152 new file mode 100644 index 0000000..fdc58a0 --- /dev/null +++ b/7.3.152 @@ -0,0 +1,643 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.152 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.152 +Problem: Xxd does not check for errors from library functions. +Solution: Add error checks. (Florian Zumbiehl) +Files: src/xxd/xxd.c + + +*** ../vim-7.3.151/src/xxd/xxd.c 2010-08-15 21:57:25.000000000 +0200 +--- src/xxd/xxd.c 2011-04-01 18:56:11.000000000 +0200 +*************** +*** 49,54 **** +--- 49,56 ---- + * option -b added: 01000101 binary output in normal format. + * 16.05.00 Added VAXC changes by Stephen P. Wall + * 16.05.00 Improved MMS file and merge for VMS by Zoltan Arpadffy ++ * 2011 March Better error handling by Florian Zumbiehl. ++ * 2011 April Formatting by Bram Moolenaar + * + * (c) 1990-1998 by Juergen Weigert (jnweiger@informatik.uni-erlangen.de) + * +*************** +*** 207,214 **** + + /* Let's collect some prototypes */ + /* CodeWarrior is really picky about missing prototypes */ +! static void exit_with_usage __P((char *)); +! static int huntype __P((FILE *, FILE *, FILE *, char *, int, int, long)); + static void xxdline __P((FILE *, char *, int)); + + #define TRY_SEEK /* attempt to use lseek, or skip forward by reading */ +--- 209,216 ---- + + /* Let's collect some prototypes */ + /* CodeWarrior is really picky about missing prototypes */ +! static void exit_with_usage __P((void)); +! static int huntype __P((FILE *, FILE *, FILE *, int, int, long)); + static void xxdline __P((FILE *, char *, int)); + + #define TRY_SEEK /* attempt to use lseek, or skip forward by reading */ +*************** +*** 223,231 **** + #define HEX_CINCLUDE 2 + #define HEX_BITS 3 /* not hex a dump, but bits: 01111001 */ + +! static void +! exit_with_usage(pname) +! char *pname; + { + fprintf(stderr, "Usage:\n %s [options] [infile [outfile]]\n", pname); + fprintf(stderr, " or\n %s -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]\n", pname); +--- 225,234 ---- + #define HEX_CINCLUDE 2 + #define HEX_BITS 3 /* not hex a dump, but bits: 01111001 */ + +! static char *pname; +! +! static void +! exit_with_usage() + { + fprintf(stderr, "Usage:\n %s [options] [infile [outfile]]\n", pname); + fprintf(stderr, " or\n %s -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]\n", pname); +*************** +*** 252,257 **** +--- 255,269 ---- + exit(1); + } + ++ static void ++ die(ret) ++ int ret; ++ { ++ fprintf(stderr, "%s: ", pname); ++ perror(NULL); ++ exit(ret); ++ } ++ + /* + * Max. cols binary characters are decoded from the input stream per line. + * Two adjacent garbage characters after evaluated data delimit valid data. +*************** +*** 259,270 **** + * + * The name is historic and came from 'undo type opt h'. + */ +! static int +! huntype(fpi, fpo, fperr, pname, cols, hextype, base_off) +! FILE *fpi, *fpo, *fperr; +! char *pname; +! int cols, hextype; +! long base_off; + { + int c, ign_garb = 1, n1 = -1, n2 = 0, n3, p = cols; + long have_off = 0, want_off = 0; +--- 271,281 ---- + * + * The name is historic and came from 'undo type opt h'. + */ +! static int +! huntype(fpi, fpo, fperr, cols, hextype, base_off) +! FILE *fpi, *fpo, *fperr; +! int cols, hextype; +! long base_off; + { + int c, ign_garb = 1, n1 = -1, n2 = 0, n3, p = cols; + long have_off = 0, want_off = 0; +*************** +*** 318,324 **** + + if (base_off + want_off != have_off) + { +! fflush(fpo); + #ifdef TRY_SEEK + c = fseek(fpo, base_off + want_off - have_off, 1); + if (c >= 0) +--- 329,336 ---- + + if (base_off + want_off != have_off) + { +! if (fflush(fpo) != 0) +! die(3); + #ifdef TRY_SEEK + c = fseek(fpo, base_off + want_off - have_off, 1); + if (c >= 0) +*************** +*** 330,341 **** + return 5; + } + for (; have_off < base_off + want_off; have_off++) +! putc(0, fpo); + } + + if (n2 >= 0 && n1 >= 0) + { +! putc((n2 << 4) | n1, fpo); + have_off++; + want_off++; + n1 = -1; +--- 342,355 ---- + return 5; + } + for (; have_off < base_off + want_off; have_off++) +! if (putc(0, fpo) == EOF) +! die(3); + } + + if (n2 >= 0 && n1 >= 0) + { +! if (putc((n2 << 4) | n1, fpo) == EOF) +! die(3); + have_off++; + want_off++; + n1 = -1; +*************** +*** 345,350 **** +--- 359,366 ---- + want_off = 0; + while ((c = getc(fpi)) != '\n' && c != EOF) + ; ++ if (c == EOF && ferror(fpi)) ++ die(2); + ign_garb = 1; + } + } +*************** +*** 355,369 **** + want_off = 0; + while ((c = getc(fpi)) != '\n' && c != EOF) + ; + ign_garb = 1; + } + } +! fflush(fpo); + #ifdef TRY_SEEK + fseek(fpo, 0L, 2); + #endif +! fclose(fpo); +! fclose(fpi); + return 0; + } + +--- 371,390 ---- + want_off = 0; + while ((c = getc(fpi)) != '\n' && c != EOF) + ; ++ if (c == EOF && ferror(fpi)) ++ die(2); + ign_garb = 1; + } + } +! if (fflush(fpo) != 0) +! die(3); + #ifdef TRY_SEEK + fseek(fpo, 0L, 2); + #endif +! if (fclose(fpo) != 0) +! die(3); +! if (fclose(fpi) != 0) +! die(2); + return 0; + } + +*************** +*** 379,389 **** + * + * If nz is always positive, lines are never suppressed. + */ +! static void + xxdline(fp, l, nz) +! FILE *fp; +! char *l; +! int nz; + { + static char z[LLEN+1]; + static int zero_seen = 0; +--- 400,410 ---- + * + * If nz is always positive, lines are never suppressed. + */ +! static void + xxdline(fp, l, nz) +! FILE *fp; +! char *l; +! int nz; + { + static char z[LLEN+1]; + static int zero_seen = 0; +*************** +*** 398,409 **** + if (nz < 0) + zero_seen--; + if (zero_seen == 2) +! fputs(z, fp); + if (zero_seen > 2) +! fputs("*\n", fp); + } + if (nz >= 0 || zero_seen > 0) +! fputs(l, fp); + if (nz) + zero_seen = 0; + } +--- 419,433 ---- + if (nz < 0) + zero_seen--; + if (zero_seen == 2) +! if (fputs(z, fp) == EOF) +! die(3); + if (zero_seen > 2) +! if (fputs("*\n", fp) == EOF) +! die(3); + } + if (nz >= 0 || zero_seen > 0) +! if (fputs(l, fp) == EOF) +! die(3); + if (nz) + zero_seen = 0; + } +*************** +*** 439,448 **** + 0070,0071,0372,0373,0374,0375,0376,0377 + }; + +! int + main(argc, argv) +! int argc; +! char *argv[]; + { + FILE *fp, *fpo; + int c, e, p = 0, relseek = 1, negseek = 0, revert = 0; +--- 463,472 ---- + 0070,0071,0372,0373,0374,0375,0376,0377 + }; + +! int + main(argc, argv) +! int argc; +! char *argv[]; + { + FILE *fp, *fpo; + int c, e, p = 0, relseek = 1, negseek = 0, revert = 0; +*************** +*** 452,458 **** + int grplen; /* total chars per octet group */ + long length = -1, n = 0, seekoff = 0; + char l[LLEN+1]; +! char *pname, *pp; + + #ifdef AMIGA + /* This program doesn't work when started from the Workbench */ +--- 476,482 ---- + int grplen; /* total chars per octet group */ + long length = -1, n = 0, seekoff = 0; + char l[LLEN+1]; +! char *pp; + + #ifdef AMIGA + /* This program doesn't work when started from the Workbench */ +*************** +*** 495,501 **** + else + { + if (!argv[2]) +! exit_with_usage(pname); + cols = (int)strtol(argv[2], NULL, 0); + argv++; + argc--; +--- 519,525 ---- + else + { + if (!argv[2]) +! exit_with_usage(); + cols = (int)strtol(argv[2], NULL, 0); + argv++; + argc--; +*************** +*** 508,514 **** + else + { + if (!argv[2]) +! exit_with_usage(pname); + octspergrp = (int)strtol(argv[2], NULL, 0); + argv++; + argc--; +--- 532,538 ---- + else + { + if (!argv[2]) +! exit_with_usage(); + octspergrp = (int)strtol(argv[2], NULL, 0); + argv++; + argc--; +*************** +*** 531,537 **** + else + { + if (!argv[2]) +! exit_with_usage(pname); + #ifdef TRY_SEEK + if (argv[2][0] == '+') + relseek++; +--- 555,561 ---- + else + { + if (!argv[2]) +! exit_with_usage(); + #ifdef TRY_SEEK + if (argv[2][0] == '+') + relseek++; +*************** +*** 550,556 **** + else + { + if (!argv[2]) +! exit_with_usage(pname); + length = strtol(argv[2], (char **)NULL, 0); + argv++; + argc--; +--- 574,580 ---- + else + { + if (!argv[2]) +! exit_with_usage(); + length = strtol(argv[2], (char **)NULL, 0); + argv++; + argc--; +*************** +*** 563,569 **** + break; + } + else if (pp[0] == '-' && pp[1]) /* unknown option */ +! exit_with_usage(pname); + else + break; /* not an option */ + +--- 587,593 ---- + break; + } + else if (pp[0] == '-' && pp[1]) /* unknown option */ +! exit_with_usage(); + else + break; /* not an option */ + +*************** +*** 602,608 **** + octspergrp = cols; + + if (argc > 3) +! exit_with_usage(pname); + + if (argc == 1 || (argv[1][0] == '-' && !argv[1][1])) + BIN_ASSIGN(fp = stdin, !revert); +--- 626,632 ---- + octspergrp = cols; + + if (argc > 3) +! exit_with_usage(); + + if (argc == 1 || (argv[1][0] == '-' && !argv[1][1])) + BIN_ASSIGN(fp = stdin, !revert); +*************** +*** 640,646 **** + fprintf(stderr, "%s: sorry, cannot revert this type of hexdump\n", pname); + return -1; + } +! return huntype(fp, fpo, stderr, pname, cols, hextype, + negseek ? -seekoff : seekoff); + } + +--- 664,670 ---- + fprintf(stderr, "%s: sorry, cannot revert this type of hexdump\n", pname); + return -1; + } +! return huntype(fp, fpo, stderr, cols, hextype, + negseek ? -seekoff : seekoff); + } + +*************** +*** 664,670 **** + long s = seekoff; + + while (s--) +! (void)getc(fp); + } + } + +--- 688,703 ---- + long s = seekoff; + + while (s--) +! if (getc(fp) == EOF) +! if (ferror(fp)) +! { +! die(2); +! } +! else +! { +! fprintf(stderr, "%s: sorry cannot seek.\n", pname); +! return 4; +! } + } + } + +*************** +*** 672,725 **** + { + if (fp != stdin) + { +! fprintf(fpo, "unsigned char %s", isdigit((int)argv[1][0]) ? "__" : ""); + for (e = 0; (c = argv[1][e]) != 0; e++) +! putc(isalnum(c) ? c : '_', fpo); +! fputs("[] = {\n", fpo); + } + + p = 0; + while ((length < 0 || p < length) && (c = getc(fp)) != EOF) + { +! fprintf(fpo, (hexx == hexxa) ? "%s0x%02x" : "%s0X%02X", +! (p % cols) ? ", " : ",\n "+2*!p, c); + p++; + } + + if (p) +! fputs("\n};\n"+3*(fp == stdin), fpo); + + if (fp != stdin) + { +! fprintf(fpo, "unsigned int %s", isdigit((int)argv[1][0]) ? "__" : ""); + for (e = 0; (c = argv[1][e]) != 0; e++) +! putc(isalnum(c) ? c : '_', fpo); +! fprintf(fpo, "_len = %d;\n", p); + } + +! fclose(fp); +! fclose(fpo); + return 0; + } + + if (hextype == HEX_POSTSCRIPT) + { + p = cols; + while ((length < 0 || n < length) && (e = getc(fp)) != EOF) + { +! putchar(hexx[(e >> 4) & 0xf]); +! putchar(hexx[(e ) & 0xf]); + n++; + if (!--p) + { +! putchar('\n'); + p = cols; + } + } + if (p < cols) +! putchar('\n'); +! fclose(fp); +! fclose(fpo); + return 0; + } + +--- 705,779 ---- + { + if (fp != stdin) + { +! if (fprintf(fpo, "unsigned char %s", isdigit((int)argv[1][0]) ? "__" : "") < 0) +! die(3); + for (e = 0; (c = argv[1][e]) != 0; e++) +! if (putc(isalnum(c) ? c : '_', fpo) == EOF) +! die(3); +! if (fputs("[] = {\n", fpo) == EOF) +! die(3); + } + + p = 0; ++ c = 0; + while ((length < 0 || p < length) && (c = getc(fp)) != EOF) + { +! if (fprintf(fpo, (hexx == hexxa) ? "%s0x%02x" : "%s0X%02X", +! (p % cols) ? ", " : ",\n "+2*!p, c) < 0) +! die(3); + p++; + } ++ if (c == EOF && ferror(fp)) ++ die(2); + + if (p) +! if (fputs("\n};\n" + 3 * (fp == stdin), fpo) == EOF) +! die(3); + + if (fp != stdin) + { +! if (fprintf(fpo, "unsigned int %s", isdigit((int)argv[1][0]) ? "__" : "") < 0) +! die(3); + for (e = 0; (c = argv[1][e]) != 0; e++) +! if (putc(isalnum(c) ? c : '_', fpo) == EOF) +! die(3); +! if (fprintf(fpo, "_len = %d;\n", p) < 0) +! die(3); + } + +! if (fclose(fp)) +! die(2); +! if (fclose(fpo)) +! die(3); + return 0; + } + + if (hextype == HEX_POSTSCRIPT) + { + p = cols; ++ e = 0; + while ((length < 0 || n < length) && (e = getc(fp)) != EOF) + { +! if (putc(hexx[(e >> 4) & 0xf], fpo) == EOF +! || putc(hexx[e & 0xf], fpo) == EOF) +! die(3); + n++; + if (!--p) + { +! if (putc('\n', fpo) == EOF) +! die(3); + p = cols; + } + } ++ if (e == EOF && ferror(fp)) ++ die(2); + if (p < cols) +! if (putc('\n', fpo) == EOF) +! die(3); +! if (fclose(fp)) +! die(2); +! if (fclose(fpo)) +! die(3); + return 0; + } + +*************** +*** 730,735 **** +--- 784,790 ---- + else /* hextype == HEX_BITS */ + grplen = 8 * octspergrp + 1; + ++ e = 0; + while ((length < 0 || n < length) && (e = getc(fp)) != EOF) + { + if (p == 0) +*************** +*** 771,776 **** +--- 826,833 ---- + p = 0; + } + } ++ if (e == EOF && ferror(fp)) ++ die(2); + if (p) + { + l[c = (11 + (grplen * cols - 1)/octspergrp + p)] = '\n'; l[++c] = '\0'; +*************** +*** 779,785 **** + else if (autoskip) + xxdline(fpo, l, -1); /* last chance to flush out suppressed lines */ + +! fclose(fp); +! fclose(fpo); + return 0; + } +--- 836,846 ---- + else if (autoskip) + xxdline(fpo, l, -1); /* last chance to flush out suppressed lines */ + +! if (fclose(fp)) +! die(2); +! if (fclose(fpo)) +! die(3); + return 0; + } ++ ++ /* vi:set ts=8 sw=4 sts=2 cino+={2 cino+=n-2 : */ +*** ../vim-7.3.151/src/version.c 2011-04-01 16:28:33.000000000 +0200 +--- src/version.c 2011-04-01 19:00:26.000000000 +0200 +*************** +*** 716,717 **** +--- 716,719 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 152, + /**/ + +-- +Eye have a spelling checker, it came with my PC; +It plainly marks four my revue mistakes I cannot sea. +I've run this poem threw it, I'm sure your please to no, +It's letter perfect in it's weigh, my checker tolled me sew! + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///