@@ -161,23 +161,23 @@ impl<W: Write> WriteMessage for W {
161161 try!( buf. write_cstr ( portal) ) ;
162162 try!( buf. write_cstr ( statement) ) ;
163163
164- try!( buf. write_u16 :: < BigEndian > ( formats. len ( ) as u16 ) ) ;
164+ try!( buf. write_u16 :: < BigEndian > ( try! ( u16 :: from_usize ( formats. len ( ) ) ) ) ) ;
165165 for & format in formats {
166166 try!( buf. write_i16 :: < BigEndian > ( format) ) ;
167167 }
168168
169- try!( buf. write_u16 :: < BigEndian > ( values. len ( ) as u16 ) ) ;
169+ try!( buf. write_u16 :: < BigEndian > ( try! ( u16 :: from_usize ( values. len ( ) ) ) ) ) ;
170170 for value in values {
171171 match * value {
172172 None => try!( buf. write_i32 :: < BigEndian > ( -1 ) ) ,
173173 Some ( ref value) => {
174- try!( buf. write_i32 :: < BigEndian > ( value. len ( ) as i32 ) ) ;
174+ try!( buf. write_i32 :: < BigEndian > ( try! ( i32 :: from_usize ( value. len ( ) ) ) ) ) ;
175175 try!( buf. write_all ( & * * value) ) ;
176176 }
177177 }
178178 }
179179
180- try!( buf. write_u16 :: < BigEndian > ( result_formats. len ( ) as u16 ) ) ;
180+ try!( buf. write_u16 :: < BigEndian > ( try! ( u16 :: from_usize ( result_formats. len ( ) ) ) ) ) ;
181181 for & format in result_formats {
182182 try!( buf. write_i16 :: < BigEndian > ( format) ) ;
183183 }
@@ -215,7 +215,7 @@ impl<W: Write> WriteMessage for W {
215215 ident = Some ( b'P' ) ;
216216 try!( buf. write_cstr ( name) ) ;
217217 try!( buf. write_cstr ( query) ) ;
218- try!( buf. write_u16 :: < BigEndian > ( param_types. len ( ) as u16 ) ) ;
218+ try!( buf. write_u16 :: < BigEndian > ( try! ( u16 :: from_usize ( param_types. len ( ) ) ) ) ) ;
219219 for & ty in param_types {
220220 try!( buf. write_u32 :: < BigEndian > ( ty) ) ;
221221 }
@@ -246,7 +246,7 @@ impl<W: Write> WriteMessage for W {
246246 }
247247
248248 // add size of length value
249- try!( self . write_u32 :: < BigEndian > ( ( buf. len ( ) + mem:: size_of :: < u32 > ( ) ) as u32 ) ) ;
249+ try!( self . write_u32 :: < BigEndian > ( try! ( u32 :: from_usize ( buf. len ( ) + mem:: size_of :: < u32 > ( ) ) ) ) ) ;
250250 try!( self . write_all ( & * buf) ) ;
251251
252252 Ok ( ( ) )
@@ -407,3 +407,25 @@ fn read_row_description<R: BufRead>(buf: &mut R) -> io::Result<BackendMessage> {
407407
408408 Ok ( RowDescription { descriptions : types } )
409409}
410+
411+ trait FromUsize {
412+ fn from_usize ( x : usize ) -> io:: Result < Self > ;
413+ }
414+
415+ macro_rules! from_usize {
416+ ( $t: ty) => {
417+ impl FromUsize for $t {
418+ fn from_usize( x: usize ) -> io:: Result <$t> {
419+ if x > <$t>:: max_value( ) as usize {
420+ Err ( io:: Error :: new( io:: ErrorKind :: InvalidInput , "value too large to transmit" ) )
421+ } else {
422+ Ok ( x as $t)
423+ }
424+ }
425+ }
426+ }
427+ }
428+
429+ from_usize ! ( u16 ) ;
430+ from_usize ! ( i32 ) ;
431+ from_usize ! ( u32 ) ;
0 commit comments