Re: [PATCH 3/3] floppy: suppress UBSAN warning in setup_rw_floppy()

From: Christoph Hellwig
Date: Wed Apr 22 2020 - 04:24:03 EST


On Wed, Apr 22, 2020 at 11:20:23AM +0300, Denis Efremov wrote:
> What do you think about changing it this way?
>
> struct floppy_raw_cmd {
>
> unsigned char rate;
>
> -#define FD_RAW_CMD_SIZE 16
> +#define FD_RAW_CMD_SIZE 33
> #define FD_RAW_REPLY_SIZE 16
>
> unsigned char cmd_count;
> - unsigned char cmd[FD_RAW_CMD_SIZE];
> - unsigned char reply_count;
> - unsigned char reply[FD_RAW_REPLY_SIZE];
> + union {
> + struct {
> + unsigned char reserved[16];
> + unsigned char reply_count;
> + unsigned char reply[FD_RAW_REPLY_SIZE];
> + };
> + unsigned char cmd[FD_RAW_CMD_SIZE];
> + };

I don't think we can just change FD_RAW_CMD_SIZE or cmd as that could
break userspace. But otherwise, yes something very much like that:

> #define FD_RAW_CMD_SIZE 16
> #define FD_RAW_REPLY_SIZE 16
> +#define FD_RAW_FULL_CMD_SIZE (FD_RAW_CMD_SIZE + 1 + FD_RAW_CMD_SIZE)
>
> unsigned char cmd_count;
> - unsigned char cmd[FD_RAW_CMD_SIZE];
> - unsigned char reply_count;
> - unsigned char reply[FD_RAW_REPLY_SIZE];
> + union {
> + struct {
> + unsigned char cmd[FD_RAW_CMD_SIZE];
> + unsigned char reply_count;
> + unsigned char reply[FD_RAW_REPLY_SIZE];
> + };
> + unsigned char full_cmd[FD_RAW_FULL_CMD_SIZE];
> + };

> int track;
>
> Denis
---end quoted text---