3131#define get_random_u32 prandom_u32
3232#endif
3333
34+ #if LINUX_VERSION_CODE < KERNEL_VERSION (5 , 11 , 0 )
35+ // Old
36+ #define dnbd3_kmap kmap
37+ #define dnbd3_kunmap (page , addr ) kunmap(page)
38+ #else
39+ // New
40+ #define dnbd3_kmap kmap_local_page
41+ #define dnbd3_kunmap (page , addr ) kunmap_local(addr)
42+ #endif
43+
3444#include <linux/time.h>
3545#include <linux/ktime.h>
3646#include <linux/tcp.h>
@@ -224,9 +234,8 @@ static void dnbd3_internal_discover(dnbd3_device_t *dev)
224234 best_server .ss_family = 0 ;
225235 best_rtt = RTT_UNREACHABLE ;
226236
227- if (dev -> panic ) {
237+ if (dev -> panic )
228238 dnbd3_dev_dbg_host (dev , & host_compare , "Discover in panic mode\n" );
229- }
230239
231240 if (!ready || dev -> panic )
232241 isize = NUMBER_SERVERS ;
@@ -540,11 +549,11 @@ static void dnbd3_recv_workfn(struct work_struct *work)
540549 bvec -> bv_len , remaining );
541550 ret = -1 ;
542551 } else {
543- kaddr = kmap (bvec -> bv_page ) + bvec -> bv_offset ;
552+ kaddr = dnbd3_kmap (bvec -> bv_page ) + bvec -> bv_offset ;
544553 iov .iov_base = kaddr ;
545554 iov .iov_len = bvec -> bv_len ;
546555 ret = kernel_recvmsg (dev -> sock , & msg , & iov , 1 , bvec -> bv_len , msg .msg_flags );
547- kunmap (bvec -> bv_page );
556+ dnbd3_kunmap (bvec -> bv_page , kaddr );
548557 }
549558 if (ret != bvec -> bv_len ) {
550559 if (ret == 0 ) {
@@ -837,7 +846,7 @@ static bool dnbd3_execute_handshake(dnbd3_device_t *dev, struct socket *sock,
837846 (int )MIN_SUPPORTED_SERVER );
838847 goto error ;
839848 }
840- if (name == NULL ) {
849+ if (name == NULL || * name == '\0' ) {
841850 dnbd3_err_dbg_host (dev , addr , "server did not supply an image name\n" );
842851 goto error ;
843852 }
@@ -847,20 +856,22 @@ static bool dnbd3_execute_handshake(dnbd3_device_t *dev, struct socket *sock,
847856 }
848857
849858 if (copy_data ) {
859+ const size_t namelen = strlen (name );
860+
850861 if (filesize < DNBD3_BLOCK_SIZE ) {
851862 dnbd3_err_dbg_host (dev , addr , "reported size by server is < 4096\n" );
852863 goto error ;
853864 }
854865 spin_lock_irqsave (& dev -> blk_lock , irqflags );
855- if (strlen (dev -> imgname ) < strlen ( name ) ) {
856- dev -> imgname = krealloc (dev -> imgname , strlen ( name ) + 1 , GFP_KERNEL );
866+ if (strlen (dev -> imgname ) < namelen ) {
867+ dev -> imgname = krealloc (dev -> imgname , namelen + 1 , GFP_KERNEL );
857868 if (dev -> imgname == NULL ) {
858869 spin_unlock_irqrestore (& dev -> blk_lock , irqflags );
859870 dnbd3_err_dbg_host (dev , addr , "reallocating buffer for new image name failed\n" );
860871 goto error ;
861872 }
862873 }
863- strcpy (dev -> imgname , name );
874+ strscpy (dev -> imgname , name , namelen + 1 );
864875 dev -> rid = rid ;
865876 // store image information
866877 dev -> reported_size = filesize ;
0 commit comments