diff mbox series

[v2,2/3] floppy: add defines for sizes of cmd & reply buffers of floppy_raw_cmd

Message ID 20200426130728.63399-3-efremov@linux.com (mailing list archive)
State New, archived
Headers show
Series floppy: suppress UBSAN warning in setup_rw_floppy() | expand

Commit Message

Denis Efremov (Oracle) April 26, 2020, 1:07 p.m. UTC
Use FD_RAW_CMD_SIZE, FD_RAW_REPLY_SIZE defines instead of magic numbers
for cmd & reply buffers of struct floppy_raw_cmd. Remove local to
floppy.c MAX_REPLIES define, as it is now FD_RAW_REPLY_SIZE.
FD_RAW_CMD_FULLSIZE added as we allow command to also fill reply_count
and reply fields.

Signed-off-by: Denis Efremov <efremov@linux.com>
---
 drivers/block/floppy.c  | 21 ++++++---------------
 include/uapi/linux/fd.h | 14 ++++++++++++--
 2 files changed, 18 insertions(+), 17 deletions(-)

Comments

Joe Perches April 26, 2020, 8:28 p.m. UTC | #1
On Sun, 2020-04-26 at 16:07 +0300, Denis Efremov wrote:
> Use FD_RAW_CMD_SIZE, FD_RAW_REPLY_SIZE defines instead of magic numbers
> for cmd & reply buffers of struct floppy_raw_cmd. Remove local to
> floppy.c MAX_REPLIES define, as it is now FD_RAW_REPLY_SIZE.
> FD_RAW_CMD_FULLSIZE added as we allow command to also fill reply_count
> and reply fields.
[]
> diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
[]
> @@ -1847,7 +1846,7 @@ static void show_floppy(int fdc)
>  			output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
>  	pr_info("last result at %lu\n", resultjiffies);
>  	pr_info("last redo_fd_request at %lu\n", lastredo);
> -	print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
> +	print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, FD_RAW_REPLY_SIZE, 1,
>  		       reply_buffer, resultsize, true);

FD_RAW_REPLY_SIZE happens to be 16, but it's misleading
to use it here.

This use of 16 is not for FD_RAW_REPLY_SIZE, but the
width of the line
being dumped, and this value must be
either 16 or 32.
Denis Efremov (Oracle) April 26, 2020, 8:44 p.m. UTC | #2
On 4/26/20 11:28 PM, Joe Perches wrote:
> On Sun, 2020-04-26 at 16:07 +0300, Denis Efremov wrote:
>> Use FD_RAW_CMD_SIZE, FD_RAW_REPLY_SIZE defines instead of magic numbers
>> for cmd & reply buffers of struct floppy_raw_cmd. Remove local to
>> floppy.c MAX_REPLIES define, as it is now FD_RAW_REPLY_SIZE.
>> FD_RAW_CMD_FULLSIZE added as we allow command to also fill reply_count
>> and reply fields.
> []
>> diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
> []
>> @@ -1847,7 +1846,7 @@ static void show_floppy(int fdc)
>>  			output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
>>  	pr_info("last result at %lu\n", resultjiffies);
>>  	pr_info("last redo_fd_request at %lu\n", lastredo);
>> -	print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
>> +	print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, FD_RAW_REPLY_SIZE, 1,
>>  		       reply_buffer, resultsize, true);
> 
> FD_RAW_REPLY_SIZE happens to be 16, but it's misleading
> to use it here.
> 
> This use of 16 is not for FD_RAW_REPLY_SIZE, but the
> width of the line
> being dumped, and this value must be
> either 16 or 32.
> 

Yes, you are right. Thanks for catching. I will resend the patches.

Denis
Christoph Hellwig April 27, 2020, 5:50 a.m. UTC | #3
Looks good modulo the hexdump nitpick:

Reviewed-by: Christoph Hellwig <hch@lst.de>
diff mbox series

Patch

diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index ac2023c757e3..052ba457956e 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -337,8 +337,7 @@  static bool initialized;
 /*
  * globals used by 'result()'
  */
-#define MAX_REPLIES 16
-static unsigned char reply_buffer[MAX_REPLIES];
+static unsigned char reply_buffer[FD_RAW_REPLY_SIZE];
 static int inr;		/* size of reply buffer, when called from interrupt */
 #define ST0		0
 #define ST1		1
@@ -1165,7 +1164,7 @@  static int result(int fdc)
 	int i;
 	int status = 0;
 
-	for (i = 0; i < MAX_REPLIES; i++) {
+	for (i = 0; i < FD_RAW_REPLY_SIZE; i++) {
 		status = wait_til_ready(fdc);
 		if (status < 0)
 			break;
@@ -1847,7 +1846,7 @@  static void show_floppy(int fdc)
 			output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
 	pr_info("last result at %lu\n", resultjiffies);
 	pr_info("last redo_fd_request at %lu\n", lastredo);
-	print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
+	print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, FD_RAW_REPLY_SIZE, 1,
 		       reply_buffer, resultsize, true);
 
 	pr_info("status=%x\n", fdc_inb(fdc, FD_STATUS));
@@ -3082,7 +3081,7 @@  static void raw_cmd_done(int flag)
 		raw_cmd->flags |= FD_RAW_HARDFAILURE;
 	} else {
 		raw_cmd->reply_count = inr;
-		if (raw_cmd->reply_count > MAX_REPLIES)
+		if (raw_cmd->reply_count > FD_RAW_REPLY_SIZE)
 			raw_cmd->reply_count = 0;
 		for (i = 0; i < raw_cmd->reply_count; i++)
 			raw_cmd->reply[i] = reply_buffer[i];
@@ -3193,18 +3192,10 @@  static int raw_cmd_copyin(int cmd, void __user *param,
 	if (ret)
 		return -EFAULT;
 	param += sizeof(struct floppy_raw_cmd);
-	if (ptr->cmd_count > 33)
-			/* the command may now also take up the space
-			 * initially intended for the reply & the
-			 * reply count. Needed for long 82078 commands
-			 * such as RESTORE, which takes ... 17 command
-			 * bytes. Murphy's law #137: When you reserve
-			 * 16 bytes for a structure, you'll one day
-			 * discover that you really need 17...
-			 */
+	if (ptr->cmd_count > FD_RAW_CMD_FULLSIZE)
 		return -EINVAL;
 
-	for (i = 0; i < 16; i++)
+	for (i = 0; i < FD_RAW_REPLY_SIZE; i++)
 		ptr->reply[i] = 0;
 	ptr->resultcode = 0;
 
diff --git a/include/uapi/linux/fd.h b/include/uapi/linux/fd.h
index 3f6b7be4c096..2e9c2c1c18e6 100644
--- a/include/uapi/linux/fd.h
+++ b/include/uapi/linux/fd.h
@@ -360,10 +360,20 @@  struct floppy_raw_cmd {
 	int buffer_length; /* length of allocated buffer */
 
 	unsigned char rate;
+
+#define FD_RAW_CMD_SIZE 16
+#define FD_RAW_REPLY_SIZE 16
+#define FD_RAW_CMD_FULLSIZE (FD_RAW_CMD_SIZE + 1 + FD_RAW_REPLY_SIZE)
+
+	/* The command may take up the space initially intended for the reply
+	 * and the reply count. Needed for long 82078 commands such as RESTORE,
+	 * which takes 17 command bytes.
+	 */
+
 	unsigned char cmd_count;
-	unsigned char cmd[16];
+	unsigned char cmd[FD_RAW_CMD_SIZE];
 	unsigned char reply_count;
-	unsigned char reply[16];
+	unsigned char reply[FD_RAW_REPLY_SIZE];
 	int track;
 	int resultcode;