@@ -96,32 +96,42 @@ module Foreign
96
96
97
97
def self . bind ( descriptor , sockaddr )
98
98
sockaddr_p = Truffle ::FFI ::Pool . stack_alloc ( :char , sockaddr . bytesize )
99
-
100
- sockaddr_p . write_string ( sockaddr , sockaddr . bytesize )
101
-
102
- _bind ( descriptor , sockaddr_p , sockaddr . bytesize )
99
+ begin
100
+ sockaddr_p . write_string ( sockaddr , sockaddr . bytesize )
101
+ _bind ( descriptor , sockaddr_p , sockaddr . bytesize )
102
+ ensure
103
+ Truffle ::FFI ::Pool . stack_free ( sockaddr_p )
104
+ end
103
105
end
104
106
105
107
def self . connect ( descriptor , sockaddr )
106
108
sockaddr = Socket . coerce_to_string ( sockaddr )
107
109
108
110
sockaddr_p = Truffle ::FFI ::Pool . stack_alloc ( :char , sockaddr . bytesize )
109
111
110
- sockaddr_p . write_string ( sockaddr , sockaddr . bytesize )
112
+ begin
113
+ sockaddr_p . write_string ( sockaddr , sockaddr . bytesize )
111
114
112
- _connect ( descriptor , sockaddr_p , sockaddr . bytesize )
115
+ _connect ( descriptor , sockaddr_p , sockaddr . bytesize )
116
+ ensure
117
+ Truffle ::FFI ::Pool . stack_free ( sockaddr_p )
118
+ end
113
119
end
114
120
115
121
def self . getsockopt ( descriptor , level , optname )
116
122
val , length = Truffle ::FFI ::Pool . stack_alloc ( :char , 256 , :socklen_t , 1 )
117
123
118
- length . write_int ( 256 )
124
+ begin
125
+ length . write_int ( 256 )
119
126
120
- err = _getsockopt ( descriptor , level , optname , val , length )
127
+ err = _getsockopt ( descriptor , level , optname , val , length )
121
128
122
- Errno . handle ( 'Unable to get socket option' ) unless err == 0
129
+ Errno . handle ( 'Unable to get socket option' ) unless err == 0
123
130
124
- val . read_string ( length . read_int )
131
+ val . read_string ( length . read_int )
132
+ ensure
133
+ Truffle ::FFI ::Pool . stack_free ( val )
134
+ end
125
135
end
126
136
127
137
def self . getaddrinfo ( host , service = nil , family = nil , socktype = nil ,
@@ -134,6 +144,7 @@ def self.getaddrinfo(host, service = nil, family = nil, socktype = nil,
134
144
hints [ :ai_flags ] = flags || 0
135
145
136
146
res_p = Truffle ::FFI ::Pool . stack_alloc ( :pointer , 1 )
147
+
137
148
res_p . clear
138
149
err = _getaddrinfo ( host , service , hints . pointer , res_p )
139
150
@@ -172,6 +183,7 @@ def self.getaddrinfo(host, service = nil, family = nil, socktype = nil,
172
183
173
184
# Be sure to feed a legit pointer to freeaddrinfo
174
185
freeaddrinfo ( ptr ) unless ptr . null?
186
+ Truffle ::FFI ::Pool . stack_free ( res_p )
175
187
end
176
188
end
177
189
@@ -188,52 +200,64 @@ def self.getnameinfo(sockaddr, flags = ::Socket::NI_NUMERICHOST | ::Socket::NI_N
188
200
sockaddr_p , node , service = Truffle ::FFI ::Pool . stack_alloc (
189
201
:char , sockaddr . bytesize , :char , ::Socket ::NI_MAXHOST , :char , ::Socket ::NI_MAXSERV )
190
202
191
- sockaddr_p . write_string ( sockaddr , sockaddr . bytesize )
203
+ begin
204
+ sockaddr_p . write_string ( sockaddr , sockaddr . bytesize )
192
205
193
- if reverse_lookup
194
- err = _getnameinfo ( sockaddr_p , sockaddr . bytesize , node ,
195
- ::Socket ::NI_MAXHOST , nil , 0 , 0 )
206
+ if reverse_lookup
207
+ err = _getnameinfo ( sockaddr_p , sockaddr . bytesize , node ,
208
+ ::Socket ::NI_MAXHOST , nil , 0 , 0 )
196
209
197
- name_info [ 2 ] = node . read_string if err == 0
198
- end
210
+ name_info [ 2 ] = node . read_string if err == 0
211
+ end
199
212
200
- err = _getnameinfo ( sockaddr_p , sockaddr . bytesize , node ,
201
- ::Socket ::NI_MAXHOST , service ,
202
- ::Socket ::NI_MAXSERV , flags )
213
+ err = _getnameinfo ( sockaddr_p , sockaddr . bytesize , node ,
214
+ ::Socket ::NI_MAXHOST , service ,
215
+ ::Socket ::NI_MAXSERV , flags )
203
216
204
- raise SocketError , gai_strerror ( err ) unless err == 0
217
+ raise SocketError , gai_strerror ( err ) unless err == 0
205
218
206
- sa_family = SockaddrIn . new ( sockaddr_p ) [ :sin_family ]
219
+ sa_family = SockaddrIn . new ( sockaddr_p ) [ :sin_family ]
207
220
208
- name_info [ 0 ] = ::Socket ::Constants ::AF_TO_FAMILY [ sa_family ]
209
- name_info [ 1 ] = service . read_string
210
- name_info [ 3 ] = node . read_string
221
+ name_info [ 0 ] = ::Socket ::Constants ::AF_TO_FAMILY [ sa_family ]
222
+ name_info [ 1 ] = service . read_string
223
+ name_info [ 3 ] = node . read_string
211
224
212
- name_info [ 2 ] = name_info [ 3 ] unless name_info [ 2 ]
225
+ name_info [ 2 ] = name_info [ 3 ] unless name_info [ 2 ]
213
226
214
- name_info
227
+ name_info
228
+ ensure
229
+ Truffle ::FFI ::Pool . stack_free ( sockaddr_p )
230
+ end
215
231
end
216
232
217
233
def self . getpeername ( descriptor )
218
234
sockaddr_storage_p , len_p = Truffle ::FFI ::Pool . stack_alloc ( :char , 128 , :socklen_t , 1 )
219
- len_p . write_int ( 128 )
235
+ begin
236
+ len_p . write_int ( 128 )
220
237
221
- err = _getpeername ( descriptor , sockaddr_storage_p , len_p )
238
+ err = _getpeername ( descriptor , sockaddr_storage_p , len_p )
222
239
223
- Errno . handle ( 'getpeername(2)' ) unless err == 0
240
+ Errno . handle ( 'getpeername(2)' ) unless err == 0
224
241
225
- sockaddr_storage_p . read_string ( len_p . read_int )
242
+ sockaddr_storage_p . read_string ( len_p . read_int )
243
+ ensure
244
+ Truffle ::FFI ::Pool . stack_free ( sockaddr_storage_p )
245
+ end
226
246
end
227
247
228
248
def self . getsockname ( descriptor )
229
249
sockaddr_storage_p , len_p = Truffle ::FFI ::Pool . stack_alloc ( :char , 128 , :socklen_t , 1 )
230
250
231
- len_p . write_int ( 128 )
232
- err = _getsockname ( descriptor , sockaddr_storage_p , len_p )
251
+ begin
252
+ len_p . write_int ( 128 )
253
+ err = _getsockname ( descriptor , sockaddr_storage_p , len_p )
233
254
234
- Errno . handle ( 'getsockname(2)' ) unless err == 0
255
+ Errno . handle ( 'getsockname(2)' ) unless err == 0
235
256
236
- sockaddr_storage_p . read_string ( len_p . read_int )
257
+ sockaddr_storage_p . read_string ( len_p . read_int )
258
+ ensure
259
+ Truffle ::FFI ::Pool . stack_free ( sockaddr_storage_p )
260
+ end
237
261
end
238
262
239
263
def self . pack_sockaddr_in ( host , port , family = ::Socket ::AF_UNSPEC ,
@@ -278,6 +302,7 @@ def self.pack_sockaddr_in(host, port, family = ::Socket::AF_UNSPEC,
278
302
ptr = res_p . read_pointer
279
303
280
304
freeaddrinfo ( ptr ) unless ptr . null?
305
+ Truffle ::FFI ::Pool . stack_free ( res_p )
281
306
end
282
307
end
283
308
@@ -304,12 +329,16 @@ def self.getpeereid(*)
304
329
305
330
def self . socketpair ( family , type , protocol )
306
331
pointer = Truffle ::FFI ::Pool . stack_alloc ( :int , 2 )
307
- pointer . clear
308
- status = _socketpair ( family , type , protocol , pointer )
332
+ begin
333
+ pointer . clear
334
+ status = _socketpair ( family , type , protocol , pointer )
309
335
310
- Errno . handle ( 'socketpair(2)' ) unless status == 0
336
+ Errno . handle ( 'socketpair(2)' ) unless status == 0
311
337
312
- pointer . read_array_of_int ( 2 )
338
+ pointer . read_array_of_int ( 2 )
339
+ ensure
340
+ Truffle ::FFI ::Pool . stack_free ( pointer )
341
+ end
313
342
end
314
343
315
344
def self . char_pointer ( length , &block )
@@ -346,11 +375,15 @@ def self.ip_to_bytes(family, address)
346
375
347
376
pointer = Truffle ::FFI ::Pool . stack_alloc ( :pointer , size )
348
377
349
- status = inet_pton ( family , address , pointer )
378
+ begin
379
+ status = inet_pton ( family , address , pointer )
350
380
351
- Errno . handle ( 'inet_pton()' ) if status < 1
381
+ Errno . handle ( 'inet_pton()' ) if status < 1
352
382
353
- pointer . get_array_of_uchar ( 0 , size )
383
+ pointer . get_array_of_uchar ( 0 , size )
384
+ ensure
385
+ Truffle ::FFI ::Pool . stack_free ( pointer )
386
+ end
354
387
end
355
388
end
356
389
end
0 commit comments