@@ -146,23 +146,9 @@ def read_ber_length
146
146
raise Net ::BER ::BerError , "Invalid BER length 0xFF detected."
147
147
else
148
148
v = 0
149
- len = n & 0x7f
150
-
151
- buffer =
152
- begin
153
- read_nonblock ( len )
154
- rescue IO ::WaitReadable
155
- if IO . select ( [ self ] , nil , nil , read_ber_timeout )
156
- read_nonblock ( len )
157
- else
158
- raise Net ::LDAP ::LdapError , "Timed out reading from the socket"
159
- end
160
- end
161
-
162
- buffer . each_byte do |b |
149
+ read_ber_nonblock ( n & 0x7f ) . each_byte do |b |
163
150
v = ( v << 8 ) + b
164
151
end
165
-
166
152
v
167
153
end
168
154
end
@@ -191,7 +177,7 @@ def read_ber(syntax = nil)
191
177
raise Net ::BER ::BerError ,
192
178
"Indeterminite BER content length not implemented."
193
179
end
194
- data = read ( content_length )
180
+ data = read_ber_nonblock ( content_length )
195
181
196
182
parse_ber_object ( syntax , id , data )
197
183
end
@@ -218,4 +204,18 @@ def getbyte_nonblock
218
204
nil
219
205
end
220
206
private :getbyte_nonblock
207
+
208
+ # Internal: Read `len` bytes, respecting timeout.
209
+ def read_ber_nonblock ( len )
210
+ begin
211
+ read_nonblock ( len )
212
+ rescue IO ::WaitReadable
213
+ if IO . select ( [ self ] , nil , nil , read_ber_timeout )
214
+ read_nonblock ( len )
215
+ else
216
+ raise Net ::LDAP ::LdapError , "Timed out reading from the socket"
217
+ end
218
+ end
219
+ end
220
+ private :read_ber_nonblock
221
221
end
0 commit comments