@@ -53,128 +53,136 @@ impl<'a> Ord for Dirent64<'a> {
5353}
5454
5555pub unsafe fn deserialize_dirents64 ( bytes : & [ u8 ] ) -> Vec < Dirent64 > {
56- let mut res = Vec :: new ( ) ;
56+ unsafe {
57+ let mut res = Vec :: new ( ) ;
5758
58- let dirp: * const u8 = bytes. as_ptr ( ) ;
59- let nb = bytes. len ( ) ;
60- let mut k = 0 ;
59+ let dirp: * const u8 = bytes. as_ptr ( ) ;
60+ let nb = bytes. len ( ) ;
61+ let mut k = 0 ;
6162
62- while k < nb as isize {
63- let dirp = dirp. offset ( k) ;
64- let mut j: isize = 0 ;
65- let ino = ptr:: read ( dirp. offset ( j) . cast :: < u64 > ( ) ) ;
66- j += std:: mem:: size_of :: < u64 > ( ) as isize ;
67- let off = ptr:: read ( dirp. offset ( j) . cast :: < i64 > ( ) ) ;
68- j += std:: mem:: size_of :: < i64 > ( ) as isize ;
69- let reclen = ptr:: read ( dirp. offset ( j) . cast :: < u16 > ( ) ) ;
70- j += std:: mem:: size_of :: < u16 > ( ) as isize ;
71- let ty = ptr:: read ( dirp. offset ( j) . cast :: < u8 > ( ) ) ;
72- j += std:: mem:: size_of :: < u8 > ( ) as isize ;
73- let name = std:: slice:: from_raw_parts ( dirp. offset ( j) , 1 + reclen as usize - j as usize ) ;
74- let ent = Dirent64 {
75- ino,
76- off,
77- reclen,
78- ty,
79- name,
80- } ;
81- res. push ( ent) ;
82- k += reclen as isize ;
63+ while k < nb as isize {
64+ let dirp = dirp. offset ( k) ;
65+ let mut j: isize = 0 ;
66+ let ino = ptr:: read ( dirp. offset ( j) . cast :: < u64 > ( ) ) ;
67+ j += std:: mem:: size_of :: < u64 > ( ) as isize ;
68+ let off = ptr:: read ( dirp. offset ( j) . cast :: < i64 > ( ) ) ;
69+ j += std:: mem:: size_of :: < i64 > ( ) as isize ;
70+ let reclen = ptr:: read ( dirp. offset ( j) . cast :: < u16 > ( ) ) ;
71+ j += std:: mem:: size_of :: < u16 > ( ) as isize ;
72+ let ty = ptr:: read ( dirp. offset ( j) . cast :: < u8 > ( ) ) ;
73+ j += std:: mem:: size_of :: < u8 > ( ) as isize ;
74+ let name = std:: slice:: from_raw_parts ( dirp. offset ( j) , 1 + reclen as usize - j as usize ) ;
75+ let ent = Dirent64 {
76+ ino,
77+ off,
78+ reclen,
79+ ty,
80+ name,
81+ } ;
82+ res. push ( ent) ;
83+ k += reclen as isize ;
84+ }
85+ res
8386 }
84- res
8587}
8688
8789pub unsafe fn serialize_dirents64 ( dents : & [ Dirent64 ] , bytes : & mut [ u8 ] ) -> usize {
88- let nb = bytes. len ( ) ;
89- let mut k = 0 ;
90- let mut i = 0 ;
90+ unsafe {
91+ let nb = bytes. len ( ) ;
92+ let mut k = 0 ;
93+ let mut i = 0 ;
9194
92- while k < nb as isize && i < dents. len ( ) {
93- let ent = & dents[ i] ;
94- let dirp = bytes. as_mut_ptr ( ) . offset ( k) ;
95- let mut j: isize = 0 ;
96- ptr:: write ( dirp. offset ( j) . cast :: < u64 > ( ) , ent. ino ) ;
97- j += std:: mem:: size_of :: < u64 > ( ) as isize ;
98- ptr:: write ( dirp. offset ( j) . cast :: < i64 > ( ) , ent. off ) ;
99- j += std:: mem:: size_of :: < i64 > ( ) as isize ;
100- ptr:: write ( dirp. offset ( j) . cast :: < u16 > ( ) , ent. reclen ) ;
101- j += std:: mem:: size_of :: < u16 > ( ) as isize ;
102- ptr:: write ( dirp. offset ( j) . cast :: < u8 > ( ) , ent. ty ) ;
103- j += std:: mem:: size_of :: < u8 > ( ) as isize ;
104- let reclen = ent. reclen ;
105- ptr:: copy_nonoverlapping (
106- ent. name . as_ptr ( ) ,
107- dirp. offset ( j) ,
108- // NOTE: name is null-terminated with the man page
109- // explicitly warning against other methods to read
110- // d_name besides strlen(): https://man7.org/linux/man-pages/man3/readdir.3.html
111- strlen ( ent. name . as_ptr ( ) as * const i8 ) ,
112- ) ;
113- k += reclen as isize ;
114- i += 1 ;
95+ while k < nb as isize && i < dents. len ( ) {
96+ let ent = & dents[ i] ;
97+ let dirp = bytes. as_mut_ptr ( ) . offset ( k) ;
98+ let mut j: isize = 0 ;
99+ ptr:: write ( dirp. offset ( j) . cast :: < u64 > ( ) , ent. ino ) ;
100+ j += std:: mem:: size_of :: < u64 > ( ) as isize ;
101+ ptr:: write ( dirp. offset ( j) . cast :: < i64 > ( ) , ent. off ) ;
102+ j += std:: mem:: size_of :: < i64 > ( ) as isize ;
103+ ptr:: write ( dirp. offset ( j) . cast :: < u16 > ( ) , ent. reclen ) ;
104+ j += std:: mem:: size_of :: < u16 > ( ) as isize ;
105+ ptr:: write ( dirp. offset ( j) . cast :: < u8 > ( ) , ent. ty ) ;
106+ j += std:: mem:: size_of :: < u8 > ( ) as isize ;
107+ let reclen = ent. reclen ;
108+ ptr:: copy_nonoverlapping (
109+ ent. name . as_ptr ( ) ,
110+ dirp. offset ( j) ,
111+ // NOTE: name is null-terminated with the man page
112+ // explicitly warning against other methods to read
113+ // d_name besides strlen(): https://man7.org/linux/man-pages/man3/readdir.3.html
114+ strlen ( ent. name . as_ptr ( ) as * const i8 ) ,
115+ ) ;
116+ k += reclen as isize ;
117+ i += 1 ;
118+ }
119+ dents. len ( )
115120 }
116- dents. len ( )
117121}
118122
119123pub unsafe fn deserialize_dirents ( bytes : & [ u8 ] ) -> Vec < Dirent64 > {
120- let mut res = Vec :: new ( ) ;
124+ unsafe {
125+ let mut res = Vec :: new ( ) ;
121126
122- let dirp: * const u8 = bytes. as_ptr ( ) ;
123- let nb = bytes. len ( ) ;
124- let mut k = 0 ;
127+ let dirp: * const u8 = bytes. as_ptr ( ) ;
128+ let nb = bytes. len ( ) ;
129+ let mut k = 0 ;
125130
126- while k < nb as isize {
127- let dirp = dirp. offset ( k) ;
128- let mut j: isize = 0 ;
129- let ino = ptr:: read ( dirp. offset ( j) . cast :: < u64 > ( ) ) ;
130- j += std:: mem:: size_of :: < u64 > ( ) as isize ;
131- let off = ptr:: read ( dirp. offset ( j) . cast :: < i64 > ( ) ) ;
132- j += std:: mem:: size_of :: < i64 > ( ) as isize ;
133- let reclen = ptr:: read ( dirp. offset ( j) . cast :: < u16 > ( ) ) ;
134- j += std:: mem:: size_of :: < u16 > ( ) as isize ;
135- let name = std:: slice:: from_raw_parts ( dirp. offset ( j) , reclen as usize - j as usize ) ;
136- j = reclen as isize - 1 ;
137- let ty = ptr:: read ( dirp. offset ( j) . cast :: < u8 > ( ) ) ;
138- let ent = Dirent64 {
139- ino,
140- off,
141- reclen,
142- ty,
143- name,
144- } ;
145- res. push ( ent) ;
146- k += reclen as isize ;
131+ while k < nb as isize {
132+ let dirp = dirp. offset ( k) ;
133+ let mut j: isize = 0 ;
134+ let ino = ptr:: read ( dirp. offset ( j) . cast :: < u64 > ( ) ) ;
135+ j += std:: mem:: size_of :: < u64 > ( ) as isize ;
136+ let off = ptr:: read ( dirp. offset ( j) . cast :: < i64 > ( ) ) ;
137+ j += std:: mem:: size_of :: < i64 > ( ) as isize ;
138+ let reclen = ptr:: read ( dirp. offset ( j) . cast :: < u16 > ( ) ) ;
139+ j += std:: mem:: size_of :: < u16 > ( ) as isize ;
140+ let name = std:: slice:: from_raw_parts ( dirp. offset ( j) , reclen as usize - j as usize ) ;
141+ j = reclen as isize - 1 ;
142+ let ty = ptr:: read ( dirp. offset ( j) . cast :: < u8 > ( ) ) ;
143+ let ent = Dirent64 {
144+ ino,
145+ off,
146+ reclen,
147+ ty,
148+ name,
149+ } ;
150+ res. push ( ent) ;
151+ k += reclen as isize ;
152+ }
153+ res
147154 }
148- res
149155}
150156
151157pub unsafe fn serialize_dirents ( dents : & [ Dirent64 ] , bytes : & mut [ u8 ] ) -> usize {
152- let nb = bytes. len ( ) ;
153- let mut k = 0 ;
154- let mut i = 0 ;
158+ unsafe {
159+ let nb = bytes. len ( ) ;
160+ let mut k = 0 ;
161+ let mut i = 0 ;
155162
156- while k < nb as isize && i < dents. len ( ) {
157- let ent = & dents[ i] ;
158- let dirp = bytes. as_mut_ptr ( ) . offset ( k) ;
159- let mut j: isize = 0 ;
160- ptr:: write ( dirp. offset ( j) . cast :: < u64 > ( ) , ent. ino ) ;
161- j += std:: mem:: size_of :: < u64 > ( ) as isize ;
162- ptr:: write ( dirp. offset ( j) . cast :: < i64 > ( ) , ent. off ) ;
163- j += std:: mem:: size_of :: < i64 > ( ) as isize ;
164- ptr:: write ( dirp. offset ( j) . cast :: < u16 > ( ) , ent. reclen ) ;
165- j += std:: mem:: size_of :: < u16 > ( ) as isize ;
166- let reclen = ent. reclen ;
167- ptr:: copy_nonoverlapping (
168- ent. name . as_ptr ( ) ,
169- dirp. offset ( j) ,
170- strlen ( ent. name . as_ptr ( ) as * const i8 ) ,
171- ) ;
172- j = reclen as isize - 1 ;
173- ptr:: write ( dirp. offset ( j) . cast :: < u8 > ( ) , ent. ty ) ;
174- k += reclen as isize ;
175- i += 1 ;
163+ while k < nb as isize && i < dents. len ( ) {
164+ let ent = & dents[ i] ;
165+ let dirp = bytes. as_mut_ptr ( ) . offset ( k) ;
166+ let mut j: isize = 0 ;
167+ ptr:: write ( dirp. offset ( j) . cast :: < u64 > ( ) , ent. ino ) ;
168+ j += std:: mem:: size_of :: < u64 > ( ) as isize ;
169+ ptr:: write ( dirp. offset ( j) . cast :: < i64 > ( ) , ent. off ) ;
170+ j += std:: mem:: size_of :: < i64 > ( ) as isize ;
171+ ptr:: write ( dirp. offset ( j) . cast :: < u16 > ( ) , ent. reclen ) ;
172+ j += std:: mem:: size_of :: < u16 > ( ) as isize ;
173+ let reclen = ent. reclen ;
174+ ptr:: copy_nonoverlapping (
175+ ent. name . as_ptr ( ) ,
176+ dirp. offset ( j) ,
177+ strlen ( ent. name . as_ptr ( ) as * const i8 ) ,
178+ ) ;
179+ j = reclen as isize - 1 ;
180+ ptr:: write ( dirp. offset ( j) . cast :: < u8 > ( ) , ent. ty ) ;
181+ k += reclen as isize ;
182+ i += 1 ;
183+ }
184+ dents. len ( )
176185 }
177- dents. len ( )
178186}
179187
180188#[ cfg( test) ]
0 commit comments