staging/fbtft: Remove all strcpy() uses

Started by Len Baker on Jul 18, 2021 · 5 messages from 3 authors · Last reply Jul 24, 2021

Subsystems (3)

Maintainers (3)

STALE1935d

open the first message on its own page

Message details and related content
strcpy() performs no bounds checking on the destination buffer. This
could result in linear overflows beyond the end of the buffer, leading
to all kinds of misbehaviors. The safe replacement is strscpy() but in
this case it is simpler to add NULL to the first position since we want
to empty the string.

This is a previous step in the path to remove the strcpy() function.

Signed-off-by: Len Baker <redacted>
---
 drivers/staging/fbtft/fbtft-core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c
index 3723269890d5..b8791806cb20 100644
--- a/drivers/staging/fbtft/fbtft-core.c
+++ b/drivers/staging/fbtft/fbtft-core.c
@@ -1037,7 +1037,7 @@ int fbtft_init_display(struct fbtft_par *par)
 		case -1:
 			i++;
 			/* make debug message */
-			strcpy(msg, "");
+			msg[0] = 0;
 			j = i + 1;
 			while (par->init_sequence[j] >= 0) {
 				sprintf(str, "0x%02X ", par->init_sequence[j]);
--
2.25.1
Message details and related content
On Sun, Jul 18, 2021 at 4:43 PM Len Baker [off-list ref] wrote:
strcpy() performs no bounds checking on the destination buffer. This
could result in linear overflows beyond the end of the buffer, leading
to all kinds of misbehaviors. The safe replacement is strscpy() but in
this case it is simpler to add NULL to the first position since we want
to empty the string.
This is a previous step in the path to remove the strcpy() function.
Any document behind this (something to read on the site(s) more or
less affiliated with what is going to happen in the kernel) to read
background?

...
quoted hunk
                case -1:
                        i++;
                        /* make debug message */
-                       strcpy(msg, "");
+                       msg[0] = 0;
Strictly speaking it should be '\0'.
                        j = i + 1;
                        while (par->init_sequence[j] >= 0) {
                                sprintf(str, "0x%02X ", par->init_sequence[j]);

-- 
With Best Regards,
Andy Shevchenko
Message details and related content
On Sun, Jul 18, 2021 at 9:43 PM Andy Shevchenko
[off-list ref] wrote:
On Sun, Jul 18, 2021 at 4:43 PM Len Baker [off-list ref] wrote:
quoted
strcpy() performs no bounds checking on the destination buffer. This
could result in linear overflows beyond the end of the buffer, leading
to all kinds of misbehaviors. The safe replacement is strscpy() but in
this case it is simpler to add NULL to the first position since we want
"NULL" is a pointer value, "NUL" is the character with value zero.
quoted
to empty the string.
quoted
This is a previous step in the path to remove the strcpy() function.
Any document behind this (something to read on the site(s) more or
less affiliated with what is going to happen in the kernel) to read
background?

...
quoted
                case -1:
                        i++;
                        /* make debug message */
-                       strcpy(msg, "");
While this strcpy() is provably safe at compile-time, and will probably
be replaced by an assignment to zero by the compiler...
quoted
+                       msg[0] = 0;
Strictly speaking it should be '\0'.
quoted
                        j = i + 1;
                        while (par->init_sequence[j] >= 0) {
                                sprintf(str, "0x%02X ", par->init_sequence[j]);
... the real danger is the

        strcat(msg, str);

on the next line.
Fortunately this whole debug printing block (including the strcpy)
can (and should) be rewritten to just use "%*ph".

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Message details and related content
Hi,

On Sun, Jul 18, 2021 at 10:42:42PM +0300, Andy Shevchenko wrote:
On Sun, Jul 18, 2021 at 4:43 PM Len Baker [off-list ref] wrote:
quoted
strcpy() performs no bounds checking on the destination buffer. This
could result in linear overflows beyond the end of the buffer, leading
to all kinds of misbehaviors. The safe replacement is strscpy() but in
this case it is simpler to add NULL to the first position since we want
to empty the string.
quoted
This is a previous step in the path to remove the strcpy() function.
Any document behind this (something to read on the site(s) more or
less affiliated with what is going to happen in the kernel) to read
background?
This is a task of the KSPP (kernel self protection project) [1]

[1] https://github.com/KSPP/linux/issues/88
...
quoted
                case -1:
                        i++;
                        /* make debug message */
-                       strcpy(msg, "");
+                       msg[0] = 0;
Strictly speaking it should be '\0'.
Ok, understood.
quoted
                        j = i + 1;
                        while (par->init_sequence[j] >= 0) {
                                sprintf(str, "0x%02X ", par->init_sequence[j]);

--
With Best Regards,
Andy Shevchenko
Thanks for the feedback,
Len
Message details and related content
On Mon, Jul 19, 2021 at 09:53:29AM +0200, Geert Uytterhoeven wrote:
On Sun, Jul 18, 2021 at 9:43 PM Andy Shevchenko
[off-list ref] wrote:
quoted
On Sun, Jul 18, 2021 at 4:43 PM Len Baker [off-list ref] wrote:
quoted
strcpy() performs no bounds checking on the destination buffer. This
could result in linear overflows beyond the end of the buffer, leading
to all kinds of misbehaviors. The safe replacement is strscpy() but in
this case it is simpler to add NULL to the first position since we want
"NULL" is a pointer value, "NUL" is the character with value zero.
Ok, understood. Thanks.
quoted
quoted
to empty the string.
quoted
This is a previous step in the path to remove the strcpy() function.
Any document behind this (something to read on the site(s) more or
less affiliated with what is going to happen in the kernel) to read
background?

...
quoted
                case -1:
                        i++;
                        /* make debug message */
-                       strcpy(msg, "");
While this strcpy() is provably safe at compile-time, and will probably
be replaced by an assignment to zero by the compiler...
quoted
quoted
+                       msg[0] = 0;
Strictly speaking it should be '\0'.
quoted
                        j = i + 1;
                        while (par->init_sequence[j] >= 0) {
                                sprintf(str, "0x%02X ", par->init_sequence[j]);
... the real danger is the

        strcat(msg, str);

on the next line.
Fortunately this whole debug printing block (including the strcpy)
can (and should) be rewritten to just use "%*ph".
Ok, I will work on it and I will send a v2 for review. Thanks for the
feedback.
Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Regards,
Len
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help