comparison src/os_mswin.c @ 5320:07737d3aa817 v7.4.013

updated for version 7.4.013 Problem: File name buffer too small for utf-8. Solution: Use character count instead of byte count. (Ken Takata)
author Bram Moolenaar <bram@vim.org>
date Fri, 30 Aug 2013 16:51:18 +0200
parents 8e28c23e482c
children 4dfba3df303c
comparison
equal deleted inserted replaced
5319:5f5d9a89de82 5320:07737d3aa817
454 * Return TRUE if "fname" does not depend on the current directory. 454 * Return TRUE if "fname" does not depend on the current directory.
455 */ 455 */
456 int 456 int
457 mch_isFullName(char_u *fname) 457 mch_isFullName(char_u *fname)
458 { 458 {
459 #ifdef FEAT_MBYTE
460 /* WinNT and later can use _MAX_PATH wide characters for a pathname, which
461 * means that the maximum pathname is _MAX_PATH * 3 bytes when 'enc' is
462 * UTF-8. */
463 char szName[_MAX_PATH * 3 + 1];
464 #else
459 char szName[_MAX_PATH + 1]; 465 char szName[_MAX_PATH + 1];
466 #endif
460 467
461 /* A name like "d:/foo" and "//server/share" is absolute */ 468 /* A name like "d:/foo" and "//server/share" is absolute */
462 if ((fname[0] && fname[1] == ':' && (fname[2] == '/' || fname[2] == '\\')) 469 if ((fname[0] && fname[1] == ':' && (fname[2] == '/' || fname[2] == '\\'))
463 || (fname[0] == fname[1] && (fname[0] == '/' || fname[0] == '\\'))) 470 || (fname[0] == fname[1] && (fname[0] == '/' || fname[0] == '\\')))
464 return TRUE; 471 return TRUE;
465 472
466 /* A name that can't be made absolute probably isn't absolute. */ 473 /* A name that can't be made absolute probably isn't absolute. */
467 if (mch_FullName(fname, szName, _MAX_PATH, FALSE) == FAIL) 474 if (mch_FullName(fname, szName, sizeof(szName) - 1, FALSE) == FAIL)
468 return FALSE; 475 return FALSE;
469 476
470 return pathcmp(fname, szName, -1) == 0; 477 return pathcmp(fname, szName, -1) == 0;
471 } 478 }
472 479
496 * stat() can't handle a trailing '/' or '\', remove it first. 503 * stat() can't handle a trailing '/' or '\', remove it first.
497 */ 504 */
498 int 505 int
499 vim_stat(const char *name, struct stat *stp) 506 vim_stat(const char *name, struct stat *stp)
500 { 507 {
508 #ifdef FEAT_MBYTE
509 /* WinNT and later can use _MAX_PATH wide characters for a pathname, which
510 * means that the maximum pathname is _MAX_PATH * 3 bytes when 'enc' is
511 * UTF-8. */
512 char buf[_MAX_PATH * 3 + 1];
513 #else
501 char buf[_MAX_PATH + 1]; 514 char buf[_MAX_PATH + 1];
515 #endif
502 char *p; 516 char *p;
503 517
504 vim_strncpy((char_u *)buf, (char_u *)name, _MAX_PATH); 518 vim_strncpy((char_u *)buf, (char_u *)name, sizeof(buf) - 1);
505 p = buf + strlen(buf); 519 p = buf + strlen(buf);
506 if (p > buf) 520 if (p > buf)
507 mb_ptr_back(buf, p); 521 mb_ptr_back(buf, p);
508 if (p > buf && (*p == '\\' || *p == '/') && p[-1] != ':') 522 if (p > buf && (*p == '\\' || *p == '/') && p[-1] != ':')
509 *p = NUL; 523 *p = NUL;