@@ -105,16 +105,17 @@ void rose_write_internal(struct sock *sk, int frametype)
105
105
struct sk_buff * skb ;
106
106
unsigned char * dptr ;
107
107
unsigned char lci1 , lci2 ;
108
- char buffer [100 ];
109
- int len , faclen = 0 ;
108
+ int maxfaclen = 0 ;
109
+ int len , faclen ;
110
+ int reserve ;
110
111
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 ;
112
114
113
115
switch (frametype ) {
114
116
case ROSE_CALL_REQUEST :
115
117
len += 1 + ROSE_ADDR_LEN + ROSE_ADDR_LEN ;
116
- faclen = rose_create_facilities (buffer , rose );
117
- len += faclen ;
118
+ maxfaclen = 256 ;
118
119
break ;
119
120
case ROSE_CALL_ACCEPTED :
120
121
case ROSE_CLEAR_REQUEST :
@@ -123,15 +124,16 @@ void rose_write_internal(struct sock *sk, int frametype)
123
124
break ;
124
125
}
125
126
126
- if ((skb = alloc_skb (len , GFP_ATOMIC )) == NULL )
127
+ skb = alloc_skb (reserve + len + maxfaclen , GFP_ATOMIC );
128
+ if (!skb )
127
129
return ;
128
130
129
131
/*
130
132
* Space for AX.25 header and PID.
131
133
*/
132
- skb_reserve (skb , AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + 1 );
134
+ skb_reserve (skb , reserve );
133
135
134
- dptr = skb_put (skb , skb_tailroom ( skb ) );
136
+ dptr = skb_put (skb , len );
135
137
136
138
lci1 = (rose -> lci >> 8 ) & 0x0F ;
137
139
lci2 = (rose -> lci >> 0 ) & 0xFF ;
@@ -146,7 +148,8 @@ void rose_write_internal(struct sock *sk, int frametype)
146
148
dptr += ROSE_ADDR_LEN ;
147
149
memcpy (dptr , & rose -> source_addr , ROSE_ADDR_LEN );
148
150
dptr += ROSE_ADDR_LEN ;
149
- memcpy (dptr , buffer , faclen );
151
+ faclen = rose_create_facilities (dptr , rose );
152
+ skb_put (skb , faclen );
150
153
dptr += faclen ;
151
154
break ;
152
155
0 commit comments