Fix call to line discipline receive_buf by synclink drivers.
Dummy flag buffer argument is ignored by N_HDLC line discipline but might
be of insufficient size if accessed by a different line discipline
selected by mistake. flag buffer allocation now matches max size of data
buffer. Unused char_buf buffers are removed.
Signed-off-by: Paul Fulghum <paulkf@microgate.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
        char testing_irq;
        unsigned int init_error;        /* startup error (DIAGS)        */
 
-       char flag_buf[MAX_ASYNC_BUFFER_SIZE];
+       char *flag_buf;
        bool drop_rts_on_tx_done;
 
        struct  _input_signal_events    input_signal_events;
        if (info->rx_buf == NULL)
                return -ENOMEM;
 
+       /* unused flag buffer to satisfy receive_buf calling interface */
+       info->flag_buf = kzalloc(info->max_frame_size, GFP_KERNEL);
+       if (!info->flag_buf) {
+               kfree(info->rx_buf);
+               info->rx_buf = NULL;
+               return -ENOMEM;
+       }
+       
        rx_reset_buffers(info);
        return 0;
 }
 {
        kfree(info->rx_buf);
        info->rx_buf = NULL;
+       kfree(info->flag_buf);
+       info->flag_buf = NULL;
 }
 
 static int claim_resources(MGSLPC_INFO *info)
 
        bool lcr_mem_requested;
 
        u32 misc_ctrl_value;
-       char flag_buf[MAX_ASYNC_BUFFER_SIZE];
-       char char_buf[MAX_ASYNC_BUFFER_SIZE];   
+       char *flag_buf;
        bool drop_rts_on_tx_done;
 
        bool loopmode_insert_requested;
        info->intermediate_rxbuffer = kmalloc(info->max_frame_size, GFP_KERNEL | GFP_DMA);
        if ( info->intermediate_rxbuffer == NULL )
                return -ENOMEM;
-
+       /* unused flag buffer to satisfy receive_buf calling interface */
+       info->flag_buf = kzalloc(info->max_frame_size, GFP_KERNEL);
+       if (!info->flag_buf) {
+               kfree(info->intermediate_rxbuffer);
+               info->intermediate_rxbuffer = NULL;
+               return -ENOMEM;
+       }
        return 0;
 
 }      /* end of mgsl_alloc_intermediate_rxbuffer_memory() */
 {
        kfree(info->intermediate_rxbuffer);
        info->intermediate_rxbuffer = NULL;
+       kfree(info->flag_buf);
+       info->flag_buf = NULL;
 
 }      /* end of mgsl_free_intermediate_rxbuffer_memory() */
 
 
        unsigned char *tx_buf;
        int tx_count;
 
-       char flag_buf[MAX_ASYNC_BUFFER_SIZE];
-       char char_buf[MAX_ASYNC_BUFFER_SIZE];
+       char *flag_buf;
        bool drop_rts_on_tx_done;
        struct  _input_signal_events    input_signal_events;
 
        return retval;
 }
 
+/*
+ * allocate buffers used for calling line discipline receive_buf
+ * directly in synchronous mode
+ * note: add 5 bytes to max frame size to allow appending
+ * 32-bit CRC and status byte when configured to do so
+ */
 static int alloc_tmp_rbuf(struct slgt_info *info)
 {
        info->tmp_rbuf = kmalloc(info->max_frame_size + 5, GFP_KERNEL);
        if (info->tmp_rbuf == NULL)
                return -ENOMEM;
+       /* unused flag buffer to satisfy receive_buf calling interface */
+       info->flag_buf = kzalloc(info->max_frame_size + 5, GFP_KERNEL);
+       if (!info->flag_buf) {
+               kfree(info->tmp_rbuf);
+               info->tmp_rbuf = NULL;
+               return -ENOMEM;
+       }
        return 0;
 }
 
 {
        kfree(info->tmp_rbuf);
        info->tmp_rbuf = NULL;
+       kfree(info->flag_buf);
+       info->flag_buf = NULL;
 }
 
 /*
 
        bool sca_statctrl_requested;
 
        u32 misc_ctrl_value;
-       char flag_buf[MAX_ASYNC_BUFFER_SIZE];
-       char char_buf[MAX_ASYNC_BUFFER_SIZE];
+       char *flag_buf;
        bool drop_rts_on_tx_done;
 
        struct  _input_signal_events    input_signal_events;
        info->tmp_rx_buf = kmalloc(info->max_frame_size, GFP_KERNEL);
        if (info->tmp_rx_buf == NULL)
                return -ENOMEM;
+       /* unused flag buffer to satisfy receive_buf calling interface */
+       info->flag_buf = kzalloc(info->max_frame_size, GFP_KERNEL);
+       if (!info->flag_buf) {
+               kfree(info->tmp_rx_buf);
+               info->tmp_rx_buf = NULL;
+               return -ENOMEM;
+       }
        return 0;
 }
 
 {
        kfree(info->tmp_rx_buf);
        info->tmp_rx_buf = NULL;
+       kfree(info->flag_buf);
+       info->flag_buf = NULL;
 }
 
 static int claim_resources(SLMP_INFO *info)