| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.160 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.160 |
| Problem: Unsafe string copying. |
| Solution: Use vim_strncpy() instead of strcpy(). Use vim_strcat() instead |
| of strcat(). |
| Files: src/buffer.c, src/ex_docmd.c, src/hardcopy.c, src/menu.c, |
| src/misc1.c, src/misc2.c, src/proto/misc2.pro, src/netbeans.c, |
| src/os_unix.c, src/spell.c, src/syntax.c, src/tag.c |
| |
| |
| |
| |
| *** 3176,3182 **** |
| /* format: "fname + (path) (1 of 2) - VIM" */ |
| |
| if (curbuf->b_fname == NULL) |
| ! STRCPY(buf, _("[No Name]")); |
| else |
| { |
| p = transstr(gettail(curbuf->b_fname)); |
| --- 3176,3182 ---- |
| /* format: "fname + (path) (1 of 2) - VIM" */ |
| |
| if (curbuf->b_fname == NULL) |
| ! vim_strncpy(buf, (char_u *)_("[No Name]"), IOSIZE - 100); |
| else |
| { |
| p = transstr(gettail(curbuf->b_fname)); |
| |
| *** 3232,3238 **** |
| if (serverName != NULL) |
| { |
| STRCAT(buf, " - "); |
| ! STRCAT(buf, serverName); |
| } |
| else |
| #endif |
| --- 3232,3238 ---- |
| if (serverName != NULL) |
| { |
| STRCAT(buf, " - "); |
| ! vim_strcat(buf, serverName, IOSIZE); |
| } |
| else |
| #endif |
| |
| |
| |
| *** 5096,5102 **** |
| char_u buff[IOSIZE]; |
| |
| if (n == 1) |
| ! STRCPY(buff, _("1 more file to edit. Quit anyway?")); |
| else |
| vim_snprintf((char *)buff, IOSIZE, |
| _("%d more files to edit. Quit anyway?"), n); |
| --- 5096,5104 ---- |
| char_u buff[IOSIZE]; |
| |
| if (n == 1) |
| ! vim_strncpy(buff, |
| ! (char_u *)_("1 more file to edit. Quit anyway?"), |
| ! IOSIZE - 1); |
| else |
| vim_snprintf((char *)buff, IOSIZE, |
| _("%d more files to edit. Quit anyway?"), n); |
| |
| |
| |
| *** 1761,1772 **** |
| { |
| char_u buffer[MAXPATHL + 1]; |
| |
| ! STRCPY(resource->name, name); |
| /* Look for named resource file in runtimepath */ |
| STRCPY(buffer, "print"); |
| add_pathsep(buffer); |
| ! STRCAT(buffer, name); |
| ! STRCAT(buffer, ".ps"); |
| resource->filename[0] = NUL; |
| return (do_in_runtimepath(buffer, FALSE, prt_resource_name, |
| resource->filename) |
| --- 1761,1772 ---- |
| { |
| char_u buffer[MAXPATHL + 1]; |
| |
| ! vim_strncpy(resource->name, (char_u *)name, 63); |
| /* Look for named resource file in runtimepath */ |
| STRCPY(buffer, "print"); |
| add_pathsep(buffer); |
| ! vim_strcat(buffer, (char_u *)name, MAXPATHL); |
| ! vim_strcat(buffer, (char_u *)".ps", MAXPATHL); |
| resource->filename[0] = NUL; |
| return (do_in_runtimepath(buffer, FALSE, prt_resource_name, |
| resource->filename) |
| |
| |
| |
| *** 1394,1400 **** |
| int idx; |
| { |
| static vimmenu_T *menu = NULL; |
| ! static char_u tbuffer[256]; /*hack*/ |
| char_u *str; |
| #ifdef FEAT_MULTI_LANG |
| static int should_advance = FALSE; |
| --- 1394,1401 ---- |
| int idx; |
| { |
| static vimmenu_T *menu = NULL; |
| ! #define TBUFFER_LEN 256 |
| ! static char_u tbuffer[TBUFFER_LEN]; /*hack*/ |
| char_u *str; |
| #ifdef FEAT_MULTI_LANG |
| static int should_advance = FALSE; |
| |
| *** 1428,1438 **** |
| { |
| #ifdef FEAT_MULTI_LANG |
| if (should_advance) |
| ! STRCPY(tbuffer, menu->en_dname); |
| else |
| { |
| #endif |
| ! STRCPY(tbuffer, menu->dname); |
| #ifdef FEAT_MULTI_LANG |
| if (menu->en_dname == NULL) |
| should_advance = TRUE; |
| --- 1429,1439 ---- |
| { |
| #ifdef FEAT_MULTI_LANG |
| if (should_advance) |
| ! vim_strncpy(tbuffer, menu->en_dname, TBUFFER_LEN - 2); |
| else |
| { |
| #endif |
| ! vim_strncpy(tbuffer, menu->dname, TBUFFER_LEN - 2); |
| #ifdef FEAT_MULTI_LANG |
| if (menu->en_dname == NULL) |
| should_advance = TRUE; |
| |
| |
| |
| *** 3332,3350 **** |
| if (pn == 1) |
| { |
| if (n > 0) |
| ! STRCPY(msg_buf, _("1 more line")); |
| else |
| ! STRCPY(msg_buf, _("1 line less")); |
| } |
| else |
| { |
| if (n > 0) |
| ! sprintf((char *)msg_buf, _("%ld more lines"), pn); |
| else |
| ! sprintf((char *)msg_buf, _("%ld fewer lines"), pn); |
| } |
| if (got_int) |
| ! STRCAT(msg_buf, _(" (Interrupted)")); |
| if (msg(msg_buf)) |
| { |
| set_keep_msg(msg_buf, 0); |
| --- 3332,3354 ---- |
| if (pn == 1) |
| { |
| if (n > 0) |
| ! vim_strncpy(msg_buf, (char_u *)_("1 more line"), |
| ! MSG_BUF_LEN - 1); |
| else |
| ! vim_strncpy(msg_buf, (char_u *)_("1 line less"), |
| ! MSG_BUF_LEN - 1); |
| } |
| else |
| { |
| if (n > 0) |
| ! vim_snprintf((char *)msg_buf, MSG_BUF_LEN, |
| ! _("%ld more lines"), pn); |
| else |
| ! vim_snprintf((char *)msg_buf, MSG_BUF_LEN, |
| ! _("%ld fewer lines"), pn); |
| } |
| if (got_int) |
| ! vim_strcat(msg_buf, (char_u *)_(" (Interrupted)"), MSG_BUF_LEN); |
| if (msg(msg_buf)) |
| { |
| set_keep_msg(msg_buf, 0); |
| |
| |
| |
| *** 1647,1652 **** |
| --- 1647,1674 ---- |
| } |
| |
| /* |
| + * Like strcat(), but make sure the result fits in "tosize" bytes and is |
| + * always NUL terminated. |
| + */ |
| + void |
| + vim_strcat(to, from, tosize) |
| + char_u *to; |
| + char_u *from; |
| + size_t tosize; |
| + { |
| + size_t tolen = STRLEN(to); |
| + size_t fromlen = STRLEN(from); |
| + |
| + if (tolen + fromlen + 1 > tosize) |
| + { |
| + mch_memmove(to + tolen, from, tosize - tolen - 1); |
| + to[tosize - 1] = NUL; |
| + } |
| + else |
| + STRCPY(to + tolen, from); |
| + } |
| + |
| + /* |
| * Isolate one part of a string option where parts are separated with |
| * "sep_chars". |
| * The part is copied into "buf[maxlen]". |
| |
| |
| |
| *** 40,45 **** |
| --- 40,46 ---- |
| void copy_chars __ARGS((char_u *ptr, size_t count, int c)); |
| void del_trailing_spaces __ARGS((char_u *ptr)); |
| void vim_strncpy __ARGS((char_u *to, char_u *from, size_t len)); |
| + void vim_strcat __ARGS((char_u *to, char_u *from, size_t tosize)); |
| int copy_option_part __ARGS((char_u **option, char_u *buf, int maxlen, char *sep_chars)); |
| void vim_free __ARGS((void *x)); |
| int vim_stricmp __ARGS((char *s1, char *s2)); |
| |
| |
| |
| *** 3914,3927 **** |
| } |
| else |
| { |
| ! char_u ebuf[BUFSIZ]; |
| |
| ! STRCPY(ebuf, (char_u *)_("E505: ")); |
| ! STRCAT(ebuf, IObuff); |
| ! STRCAT(ebuf, (char_u *)_("is read-only (add ! to override)")); |
| ! STRCPY(IObuff, ebuf); |
| ! nbdebug((" %s\n", ebuf )); |
| ! emsg(IObuff); |
| } |
| } |
| |
| --- 3914,3925 ---- |
| } |
| else |
| { |
| ! char_u msgbuf[IOSIZE]; |
| |
| ! vim_snprintf((char *)msgbuf, IOSIZE, |
| ! _("E505: %s is read-only (add ! to override)"), IObuff); |
| ! nbdebug((" %s\n", msgbuf)); |
| ! emsg(msgbuf); |
| } |
| } |
| |
| |
| |
| |
| *** 5725,5730 **** |
| --- 5725,5731 ---- |
| if (shell_style == STYLE_PRINT && !did_find_nul) |
| { |
| /* If there is a NUL, set did_find_nul, else set check_spaces */ |
| + buffer[len] = NUL; |
| if (len && (int)STRLEN(buffer) < (int)len - 1) |
| did_find_nul = TRUE; |
| else |
| |
| *** 6594,6600 **** |
| xterm_hints.x = 2; |
| return TRUE; |
| } |
| ! if (mouse_code == NULL) |
| { |
| xterm_trace = 0; |
| return FALSE; |
| --- 6595,6601 ---- |
| xterm_hints.x = 2; |
| return TRUE; |
| } |
| ! if (mouse_code == NULL || STRLEN(mouse_code) > 45) |
| { |
| xterm_trace = 0; |
| return FALSE; |
| |
| |
| |
| *** 6957,6963 **** |
| if (ae->ae_add == NULL) |
| *newword = NUL; |
| else |
| ! STRCPY(newword, ae->ae_add); |
| p = word; |
| if (ae->ae_chop != NULL) |
| { |
| --- 6957,6963 ---- |
| if (ae->ae_add == NULL) |
| *newword = NUL; |
| else |
| ! vim_strncpy(newword, ae->ae_add, MAXWLEN - 1); |
| p = word; |
| if (ae->ae_chop != NULL) |
| { |
| |
| *** 6978,6984 **** |
| else |
| { |
| /* suffix: chop/add at the end of the word */ |
| ! STRCPY(newword, word); |
| if (ae->ae_chop != NULL) |
| { |
| /* Remove chop string. */ |
| --- 6978,6984 ---- |
| else |
| { |
| /* suffix: chop/add at the end of the word */ |
| ! vim_strncpy(newword, word, MAXWLEN - 1); |
| if (ae->ae_chop != NULL) |
| { |
| /* Remove chop string. */ |
| |
| *** 8654,8660 **** |
| * Write the .sug file. |
| * Make the file name by changing ".spl" to ".sug". |
| */ |
| ! STRCPY(fname, wfname); |
| len = (int)STRLEN(fname); |
| fname[len - 2] = 'u'; |
| fname[len - 1] = 'g'; |
| --- 8654,8660 ---- |
| * Write the .sug file. |
| * Make the file name by changing ".spl" to ".sug". |
| */ |
| ! vim_strncpy(fname, wfname, MAXPATHL - 1); |
| len = (int)STRLEN(fname); |
| fname[len - 2] = 'u'; |
| fname[len - 1] = 'g'; |
| |
| *** 10261,10267 **** |
| |
| /* The suggested word may replace only part of the bad word, add |
| * the not replaced part. */ |
| ! STRCPY(wcopy, stp->st_word); |
| if (sug.su_badlen > stp->st_orglen) |
| vim_strncpy(wcopy + stp->st_wordlen, |
| sug.su_badptr + stp->st_orglen, |
| --- 10261,10267 ---- |
| |
| /* The suggested word may replace only part of the bad word, add |
| * the not replaced part. */ |
| ! vim_strncpy(wcopy, stp->st_word, MAXWLEN); |
| if (sug.su_badlen > stp->st_orglen) |
| vim_strncpy(wcopy + stp->st_wordlen, |
| sug.su_badptr + stp->st_orglen, |
| |
| *** 13162,13168 **** |
| pbad = badsound2; |
| } |
| |
| ! if (lendiff > 0) |
| { |
| /* Add part of the bad word to the good word, so that we soundfold |
| * what replaces the bad word. */ |
| --- 13162,13168 ---- |
| pbad = badsound2; |
| } |
| |
| ! if (lendiff > 0 && stp->st_wordlen + lendiff < MAXWLEN) |
| { |
| /* Add part of the bad word to the good word, so that we soundfold |
| * what replaces the bad word. */ |
| |
| *** 13875,13881 **** |
| for (i = gap->ga_len - 1; i >= 0; --i) |
| { |
| /* Need to append what follows to check for "the the". */ |
| ! STRCPY(longword, stp[i].st_word); |
| len = stp[i].st_wordlen; |
| vim_strncpy(longword + len, su->su_badptr + stp[i].st_orglen, |
| MAXWLEN - len); |
| --- 13875,13881 ---- |
| for (i = gap->ga_len - 1; i >= 0; --i) |
| { |
| /* Need to append what follows to check for "the the". */ |
| ! vim_strncpy(longword, stp[i].st_word, MAXWLEN); |
| len = stp[i].st_wordlen; |
| vim_strncpy(longword + len, su->su_badptr + stp[i].st_orglen, |
| MAXWLEN - len); |
| |
| *** 14221,14227 **** |
| *t = NUL; |
| } |
| else |
| ! STRCPY(word, s); |
| |
| smp = (salitem_T *)slang->sl_sal.ga_data; |
| |
| --- 14221,14227 ---- |
| *t = NUL; |
| } |
| else |
| ! vim_strncpy(word, s, MAXWLEN - 1); |
| |
| smp = (salitem_T *)slang->sl_sal.ga_data; |
| |
| |
| |
| |
| *** 8576,8583 **** |
| if (iarg & hl_attr_table[i]) |
| { |
| if (buf[0] != NUL) |
| ! STRCAT(buf, ","); |
| ! STRCAT(buf, hl_name_table[i]); |
| iarg &= ~hl_attr_table[i]; /* don't want "inverse" */ |
| } |
| } |
| --- 8576,8583 ---- |
| if (iarg & hl_attr_table[i]) |
| { |
| if (buf[0] != NUL) |
| ! vim_strcat(buf, (char_u *)",", 100); |
| ! vim_strcat(buf, (char_u *)hl_name_table[i], 100); |
| iarg &= ~hl_attr_table[i]; /* don't want "inverse" */ |
| } |
| } |
| |
| |
| |
| *** 806,812 **** |
| p = tag_full_fname(&tagp); |
| if (p == NULL) |
| continue; |
| ! STRCPY(fname, p); |
| vim_free(p); |
| |
| /* |
| --- 806,812 ---- |
| p = tag_full_fname(&tagp); |
| if (p == NULL) |
| continue; |
| ! vim_strncpy(fname, p, MAXPATHL); |
| vim_free(p); |
| |
| /* |
| |
| |
| |
| *** 716,717 **** |
| --- 716,719 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 160, |
| /**/ |
| |
| -- |
| If someone questions your market projections, simply point out that your |
| target market is "People who are nuts" and "People who will buy any damn |
| thing". Nobody is going to tell you there aren't enough of those people |
| to go around. |
| (Scott Adams - The Dilbert principle) |
| |
| /// 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 /// |