Staging: hv: don't use dynamic sized array
authorBill Pemberton <wfp5p@virginia.edu>
Tue, 27 Apr 2010 20:23:47 +0000 (16:23 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 11 May 2010 18:35:38 +0000 (11:35 -0700)
NetVscOnChannelCallback() used a dynamic sized array that also made
the frame size over 2048.  Replace it with a buffer allocated from
kzalloc.

Signed-off-by: Bill Pemberton <wfp5p@virginia.edu>
Cc: Hank Janssen <hjanssen@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/hv/NetVsc.c
drivers/staging/hv/NetVsc.h

index f84942df3bbf4b14bda506249d5b03e789fbad07..a48e6376ce2181e35c949c3038c4a24819aacf1d 100644 (file)
@@ -1288,28 +1288,33 @@ static void NetVscOnReceiveCompletion(void *Context)
 
 void NetVscOnChannelCallback(void *Context)
 {
-       const int netPacketSize = 2048;
        int ret;
        struct hv_device *device = Context;
        struct netvsc_device *netDevice;
        u32 bytesRecvd;
        u64 requestId;
-       unsigned char packet[netPacketSize];
+       unsigned char *packet;
        struct vmpacket_descriptor *desc;
-       unsigned char *buffer = packet;
-       int bufferlen = netPacketSize;
+       unsigned char *buffer;
+       int bufferlen = NETVSC_PACKET_SIZE;
 
 
        DPRINT_ENTER(NETVSC);
 
        ASSERT(device);
 
+       packet = kzalloc(NETVSC_PACKET_SIZE * sizeof(unsigned char),
+                        GFP_KERNEL);
+       if (!packet)
+               return;
+       buffer = packet;
+
        netDevice = GetInboundNetDevice(device);
        if (!netDevice) {
                DPRINT_ERR(NETVSC, "net device (%p) shutting down..."
                           "ignoring inbound packets", netDevice);
                DPRINT_EXIT(NETVSC);
-               return;
+               goto out;
        }
 
        do {
@@ -1341,17 +1346,17 @@ void NetVscOnChannelCallback(void *Context)
                                }
 
                                /* reset */
-                               if (bufferlen > netPacketSize) {
+                               if (bufferlen > NETVSC_PACKET_SIZE) {
                                        kfree(buffer);
                                        buffer = packet;
-                                       bufferlen = netPacketSize;
+                                       bufferlen = NETVSC_PACKET_SIZE;
                                }
                        } else {
                                /* reset */
-                               if (bufferlen > netPacketSize) {
+                               if (bufferlen > NETVSC_PACKET_SIZE) {
                                        kfree(buffer);
                                        buffer = packet;
-                                       bufferlen = netPacketSize;
+                                       bufferlen = NETVSC_PACKET_SIZE;
                                }
 
                                break;
@@ -1375,5 +1380,7 @@ void NetVscOnChannelCallback(void *Context)
 
        PutNetDevice(device);
        DPRINT_EXIT(NETVSC);
+out:
+       kfree(buffer);
        return;
 }
index 6e0e0349412675675f2ce0c65053ffb9bbde18d5..a6264db8388a790254d27e0d87e7a6652b6146bc 100644 (file)
@@ -289,6 +289,7 @@ struct nvsp_message {
 /* Preallocated receive packets */
 #define NETVSC_RECEIVE_PACKETLIST_COUNT                256
 
+#define NETVSC_PACKET_SIZE                      2048
 
 /* Per netvsc channel-specific */
 struct netvsc_device {