cifs: protect against server returning invalid file system block size
authorSteve French <stfrench@microsoft.com>
Sat, 15 Sep 2018 19:07:09 +0000 (14:07 -0500)
committerSteve French <stfrench@microsoft.com>
Wed, 24 Oct 2018 02:16:04 +0000 (21:16 -0500)
For a network file system we generally prefer large i/o, but
if the server returns invalid file system block/sector sizes
in cifs (vers=1.0) QFSInfo then set block size to a default
of a reasonable minimum (4K).

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Reviewed-by: Aurelien Aptel <aaptel@suse.com>
fs/cifs/cifssmb.c

index 5657b79..41329f4 100644 (file)
@@ -5027,6 +5027,13 @@ oldQFSInfoRetry:
                                le16_to_cpu(response_data->BytesPerSector) *
                                le32_to_cpu(response_data->
                                        SectorsPerAllocationUnit);
+                       /*
+                        * much prefer larger but if server doesn't report
+                        * a valid size than 4K is a reasonable minimum
+                        */
+                       if (FSData->f_bsize < 512)
+                               FSData->f_bsize = 4096;
+
                        FSData->f_blocks =
                               le32_to_cpu(response_data->TotalAllocationUnits);
                        FSData->f_bfree = FSData->f_bavail =
@@ -5107,6 +5114,13 @@ QFSInfoRetry:
                            le32_to_cpu(response_data->BytesPerSector) *
                            le32_to_cpu(response_data->
                                        SectorsPerAllocationUnit);
+                       /*
+                        * much prefer larger but if server doesn't report
+                        * a valid size than 4K is a reasonable minimum
+                        */
+                       if (FSData->f_bsize < 512)
+                               FSData->f_bsize = 4096;
+
                        FSData->f_blocks =
                            le64_to_cpu(response_data->TotalAllocationUnits);
                        FSData->f_bfree = FSData->f_bavail =
@@ -5470,6 +5484,13 @@ QFSPosixRetry:
                                 data_offset);
                        FSData->f_bsize =
                                        le32_to_cpu(response_data->BlockSize);
+                       /*
+                        * much prefer larger but if server doesn't report
+                        * a valid size than 4K is a reasonable minimum
+                        */
+                       if (FSData->f_bsize < 512)
+                               FSData->f_bsize = 4096;
+
                        FSData->f_blocks =
                                        le64_to_cpu(response_data->TotalBlocks);
                        FSData->f_bfree =