@@ -104,6 +104,7 @@ bitflags! {
104
104
const ADD_UEVENT_SENT = 1 << 1 ;
105
105
const REMOVE_UEVENT_SENT = 1 << 2 ;
106
106
const INITIALIZED = 1 << 3 ;
107
+ const UEVENT_SUPPRESS = 1 << 4 ;
107
108
}
108
109
}
109
110
#[ derive( Debug ) ]
@@ -262,19 +263,36 @@ impl KObjectManager {
262
263
}
263
264
264
265
fn get_kobj_path_length ( kobj : & Arc < dyn KObject > ) -> usize {
266
+ log:: info!( "get_kobj_path_length() kobj:{:?}" , kobj. name( ) ) ;
265
267
let mut length = 1 ;
266
268
let mut parent = kobj. parent ( ) . unwrap ( ) . upgrade ( ) . unwrap ( ) ;
267
269
/* walk up the ancestors until we hit the one pointing to the
268
270
* root.
269
271
* Add 1 to strlen for leading '/' of each level.
270
272
*/
273
+ let mut length = 0 ; // 确保 length 被正确初始化
274
+ let mut iteration_count = 0 ; // 用于记录迭代次数
275
+ const MAX_ITERATIONS : usize = 10 ; // 最大迭代次数
276
+
271
277
loop {
272
- if parent. name ( ) . is_empty ( ) {
273
- break ;
274
- }
278
+ log:: info!( "Iteration {}: parent.name():{:?}" , iteration_count, parent. name( ) ) ;
275
279
length += parent. name ( ) . len ( ) + 1 ;
276
280
if let Some ( weak_parent) = parent. parent ( ) {
277
- parent = weak_parent. upgrade ( ) . unwrap ( ) ;
281
+ if let Some ( upgraded_parent) = weak_parent. upgrade ( ) {
282
+ parent = upgraded_parent;
283
+ } else {
284
+ log:: error!( "Failed to upgrade weak reference to parent" ) ;
285
+ break ;
286
+ }
287
+ } else {
288
+ log:: error!( "Parent has no parent" ) ;
289
+ break ;
290
+ }
291
+
292
+ iteration_count += 1 ;
293
+ if iteration_count >= MAX_ITERATIONS {
294
+ log:: error!( "Reached maximum iteration count, breaking to avoid infinite loop" ) ;
295
+ break ;
278
296
}
279
297
}
280
298
return length;
@@ -298,31 +316,45 @@ impl KObjectManager {
298
316
kobj, __func__, path);
299
317
}
300
318
*/
301
- fn fill_kobj_path ( kobj : & Arc < dyn KObject > , path : * mut u8 , length : usize ) {
319
+ fn fill_kobj_path ( kobj : & Arc < dyn KObject > , path : & mut [ u8 ] , length : usize ) {
302
320
let mut parent = kobj. parent ( ) . unwrap ( ) . upgrade ( ) . unwrap ( ) ;
303
321
let mut length = length;
304
322
length -= 1 ;
305
323
loop {
324
+ log:: info!( "fill_kobj_path parent.name():{:?}" , parent. name( ) ) ;
306
325
let cur = parent. name ( ) . len ( ) ;
326
+ if length < cur + 1 {
327
+ // 如果剩余长度不足以容纳当前名称和分隔符,则退出
328
+ break ;
329
+ }
307
330
length -= cur;
308
- unsafe {
309
- core:: ptr:: copy_nonoverlapping ( parent. name ( ) . as_ptr ( ) , path. add ( length) , cur) ;
310
- * path. add ( length - 1 ) = b'/' ;
331
+ let parent_name = parent. name ( ) ;
332
+ let name = parent_name. as_bytes ( ) ;
333
+ for i in 0 ..cur {
334
+ path[ length + i] = name[ i] ;
311
335
}
336
+ length -= 1 ;
337
+ path[ length] = '/' as u8 ;
312
338
if let Some ( weak_parent) = parent. parent ( ) {
313
- parent = weak_parent. upgrade ( ) . unwrap ( ) ;
339
+ if let Some ( upgraded_parent) = weak_parent. upgrade ( ) {
340
+ parent = upgraded_parent;
341
+ } else {
342
+ break ;
343
+ }
344
+ } else {
345
+ break ;
314
346
}
315
347
}
316
348
}
317
349
// TODO: 实现kobject_get_path
318
350
// https://code.dragonos.org.cn/xref/linux-6.1.9/lib/kobject.c#139
319
351
pub fn kobject_get_path ( kobj : & Arc < dyn KObject > ) -> String {
352
+ log:: debug!( "kobject_get_path() kobj:{:?}" , kobj. name( ) ) ;
320
353
let length = Self :: get_kobj_path_length ( kobj) ;
321
- let path_raw = vec ! [ 0u8 ; length] . into_boxed_slice ( ) ;
322
- let path = Box :: into_raw ( path_raw) as * mut u8 ;
354
+ let path: & mut [ u8 ] = & mut vec ! [ 0 ; length] ;
323
355
Self :: fill_kobj_path ( kobj, path, length) ;
324
- let path_string = unsafe { String :: from_raw_parts ( path, length , length ) } ;
325
- path_string
356
+ let path_string = String :: from_utf8 ( path. to_vec ( ) ) . unwrap ( ) ;
357
+ return path_string;
326
358
}
327
359
}
328
360
0 commit comments