commit 7b77965d98a2889fbe55bb2702c352812c833c6d from: ikji date: Tue Sep 18 05:49:21 2018 UTC Correctly handle CJK/double width characters. Some CJK characters take more than more column on the terminal, so should use wcswidth to calculate the screen width. Also fixed potential buffer overflow in calls to swprintf. commit - 8cd1f8b4ba7e65fdcbf0c6baa7dccb0eba557c12 commit + 7b77965d98a2889fbe55bb2702c352812c833c6d blob - 6db7dd9cea2303d6f15979e5a544439d48884a08 blob + a0f0cbf35b8ca24f4e8547d2b7d8d1af7309532e --- rover.c +++ rover.c @@ -497,16 +497,17 @@ update_view() } else { char *suffix, *suffixes = "BKMGTPEZY"; off_t human_size = ESIZE(j) * 10; - int length = mbstowcs(NULL, ENAME(j), 0); + int length = mbstowcs(WBUF, ENAME(j), PATH_MAX); + int namecols = wcswidth(WBUF, length); for (suffix = suffixes; human_size >= 10240; suffix++) human_size = (human_size + 512) / 1024; if (*suffix == 'B') - swprintf(WBUF, PATH_MAX, L"%s%*d %c", ENAME(j), - (int) (COLS - length - 6), + swprintf(WBUF + length, PATH_MAX - length, L"%*d %c", + (int) (COLS - namecols - 6), (int) human_size / 10, *suffix); else - swprintf(WBUF, PATH_MAX, L"%s%*d.%d %c", ENAME(j), - (int) (COLS - length - 8), + swprintf(WBUF + length, PATH_MAX - length, L"%*d.%d %c", + (int) (COLS - namecols - 8), (int) human_size / 10, (int) human_size % 10, *suffix); } mvwhline(rover.window, i + 1, 1, ' ', COLS - 2);