133 lines
3.4 KiB
Diff
133 lines
3.4 KiB
Diff
This is technically undefined behavior and may result in bad
|
|
codegen in other cases as well. @q66
|
|
|
|
https://github.com/cmus/cmus/pull/941
|
|
|
|
From 55cbb02c414fb5c41373e022974fc417e493a5ab Mon Sep 17 00:00:00 2001
|
|
From: Chris Grahn <grahn@posteo.net>
|
|
Date: Sun, 17 Nov 2019 23:42:16 -0600
|
|
Subject: [PATCH] Fix bug on ppc64 caused by narrowing cast
|
|
|
|
diff --git a/format_print.c b/format_print.c
|
|
index 0fee984..c7c0ef7 100644
|
|
--- format_print.c
|
|
+++ format_print.c
|
|
@@ -216,7 +216,8 @@ static void print_str(const char *src)
|
|
|
|
}
|
|
} else {
|
|
- int s = 0, d = 0;
|
|
+ int s = 0;
|
|
+ size_t d = 0;
|
|
uchar u;
|
|
|
|
while (1) {
|
|
@@ -471,7 +472,7 @@ static void format_parse(int str_width, const char *format, const struct format_
|
|
u = u_get_char(format, &s);
|
|
if (u != '%') {
|
|
gbuf_grow(str, 4);
|
|
- u_set_char(str->buffer, (int *)&str->len, u);
|
|
+ u_set_char(str->buffer, &str->len, u);
|
|
(*len) += u_char_width(u);
|
|
continue;
|
|
}
|
|
@@ -594,7 +595,7 @@ static void format_write(char *buf, int str_width)
|
|
strcpy(buf + pos + ws_len, r_str.buffer);
|
|
} else {
|
|
int l_space = str_width - str_len.rlen;
|
|
- int pos = 0;
|
|
+ size_t pos = 0;
|
|
int idx = 0;
|
|
|
|
if (l_space > 0)
|
|
diff --git a/id3.c b/id3.c
|
|
index d505ba9..d5947b9 100644
|
|
--- id3.c
|
|
+++ id3.c
|
|
@@ -287,10 +287,10 @@ static int utf16_is_special(uchar uch)
|
|
return utf16_is_hsurrogate(uch) || utf16_is_lsurrogate(uch) || utf16_is_bom(uch);
|
|
}
|
|
|
|
-static char *utf16_to_utf8(const unsigned char *buf, int buf_size)
|
|
+static char *utf16_to_utf8(const unsigned char *buf, size_t buf_size)
|
|
{
|
|
char *out;
|
|
- int i, idx;
|
|
+ size_t i, idx;
|
|
int little_endian = 0;
|
|
|
|
if (buf_size < 2)
|
|
diff --git a/uchar.c b/uchar.c
|
|
index 7b8691a..36509d7 100644
|
|
--- uchar.c
|
|
+++ uchar.c
|
|
@@ -428,7 +428,7 @@ void u_set_char_raw(char *str, int *idx, uchar uch)
|
|
* Printing functions, these lose information
|
|
*/
|
|
|
|
-void u_set_char(char *str, int *idx, uchar uch)
|
|
+void u_set_char(char *str, size_t *idx, uchar uch)
|
|
{
|
|
int i = *idx;
|
|
|
|
@@ -476,10 +476,11 @@ invalid:
|
|
}
|
|
}
|
|
|
|
-int u_copy_chars(char *dst, const char *src, int *width)
|
|
+size_t u_copy_chars(char *dst, const char *src, int *width)
|
|
{
|
|
int w = *width;
|
|
- int si = 0, di = 0;
|
|
+ int si = 0;
|
|
+ size_t di = 0;
|
|
int cw;
|
|
uchar u;
|
|
|
|
diff --git a/uchar.h b/uchar.h
|
|
index 237cd55..8e03162 100644
|
|
--- uchar.h
|
|
+++ uchar.h
|
|
@@ -137,7 +137,7 @@ uchar u_get_char(const char *str, int *idx);
|
|
* @uch unicode character
|
|
*/
|
|
void u_set_char_raw(char *str, int *idx, uchar uch);
|
|
-void u_set_char(char *str, int *idx, uchar uch);
|
|
+void u_set_char(char *str, size_t *idx, uchar uch);
|
|
|
|
/*
|
|
* @dst destination buffer
|
|
@@ -150,7 +150,7 @@ void u_set_char(char *str, int *idx, uchar uch);
|
|
*
|
|
* Returns number of _bytes_ copied.
|
|
*/
|
|
-int u_copy_chars(char *dst, const char *src, int *width);
|
|
+size_t u_copy_chars(char *dst, const char *src, int *width);
|
|
|
|
/*
|
|
* @dst destination buffer
|
|
diff --git a/ui_curses.c b/ui_curses.c
|
|
index 564b205..9621d94 100644
|
|
--- ui_curses.c
|
|
+++ ui_curses.c
|
|
@@ -467,7 +467,8 @@ static void dump_print_buffer(int row, int col)
|
|
*/
|
|
static int format_str(char *buf, const char *str, int width)
|
|
{
|
|
- int s = 0, d = 0, ellipsis_pos = 0, cut_double_width = 0;
|
|
+ int s = 0, ellipsis_pos = 0, cut_double_width = 0;
|
|
+ size_t d = 0;
|
|
|
|
while (1) {
|
|
uchar u;
|
|
@@ -1237,7 +1238,8 @@ static void dump_buffer(const char *buffer)
|
|
static void do_update_commandline(void)
|
|
{
|
|
char *str;
|
|
- int w, idx;
|
|
+ int w;
|
|
+ size_t idx;
|
|
char ch;
|
|
|
|
move(LINES - 1, 0);
|