@@ -105,16 +105,17 @@ void rose_write_internal(struct sock *sk, int frametype)
105105 struct sk_buff * skb ;
106106 unsigned char * dptr ;
107107 unsigned char lci1 , lci2 ;
108- char buffer [100 ];
109- int len , faclen = 0 ;
108+ int maxfaclen = 0 ;
109+ int len , faclen ;
110+ int reserve ;
110111
111- len = AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + ROSE_MIN_LEN + 1 ;
112+ reserve = AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + 1 ;
113+ len = ROSE_MIN_LEN ;
112114
113115 switch (frametype ) {
114116 case ROSE_CALL_REQUEST :
115117 len += 1 + ROSE_ADDR_LEN + ROSE_ADDR_LEN ;
116- faclen = rose_create_facilities (buffer , rose );
117- len += faclen ;
118+ maxfaclen = 256 ;
118119 break ;
119120 case ROSE_CALL_ACCEPTED :
120121 case ROSE_CLEAR_REQUEST :
@@ -123,15 +124,16 @@ void rose_write_internal(struct sock *sk, int frametype)
123124 break ;
124125 }
125126
126- if ((skb = alloc_skb (len , GFP_ATOMIC )) == NULL )
127+ skb = alloc_skb (reserve + len + maxfaclen , GFP_ATOMIC );
128+ if (!skb )
127129 return ;
128130
129131 /*
130132 * Space for AX.25 header and PID.
131133 */
132- skb_reserve (skb , AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + 1 );
134+ skb_reserve (skb , reserve );
133135
134- dptr = skb_put (skb , skb_tailroom ( skb ) );
136+ dptr = skb_put (skb , len );
135137
136138 lci1 = (rose -> lci >> 8 ) & 0x0F ;
137139 lci2 = (rose -> lci >> 0 ) & 0xFF ;
@@ -146,7 +148,8 @@ void rose_write_internal(struct sock *sk, int frametype)
146148 dptr += ROSE_ADDR_LEN ;
147149 memcpy (dptr , & rose -> source_addr , ROSE_ADDR_LEN );
148150 dptr += ROSE_ADDR_LEN ;
149- memcpy (dptr , buffer , faclen );
151+ faclen = rose_create_facilities (dptr , rose );
152+ skb_put (skb , faclen );
150153 dptr += faclen ;
151154 break ;
152155
0 commit comments