@@ -340,39 +340,45 @@ handle_execve(pid_t pid, PROCESS_INFO *pi, int dirfd, char *path)
340
340
static void
341
341
handle_rename_entry (pid_t pid , PROCESS_INFO * pi , int olddirfd , char * oldpath )
342
342
{
343
- char * abspath = absolutepath (pid , olddirfd , oldpath );
344
- char * hash = get_file_hash (abspath );
345
-
346
- FILE_INFO * f = find_finfo (abspath , hash );
347
-
348
- if (!f ) {
349
- f = next_finfo ();
350
- finfo_new (f , oldpath , abspath , hash );
351
- record_file (f -> outname , oldpath , abspath );
352
- record_hash (f -> outname , f -> hash );
353
- } else {
354
- free (oldpath );
355
- free (abspath );
356
- free (hash );
357
- }
358
-
359
- pi -> entry_info = (void * ) (f - finfo );
360
- if (pi -> entry_info == NULL )
361
- error (EXIT_FAILURE , errno , "on handle_rename_entry absolutepath" );
343
+ pi -> entry_info = absolutepath (pid , olddirfd , oldpath );
344
+ free (oldpath );
362
345
}
363
346
364
347
static void
365
- handle_rename_exit (pid_t pid , PROCESS_INFO * pi , int newdirfd , char * newpath )
348
+ handle_rename_exit (pid_t pid , PROCESS_INFO * pi , char * oldpath , int newdirfd ,
349
+ char * newpath )
366
350
{
367
- FILE_INFO * from = finfo + (ptrdiff_t ) pi -> entry_info ;
351
+ char * oldabspath = pi -> entry_info ;
352
+ char * newabspath = absolutepath (pid , newdirfd , newpath );
353
+
354
+ char * hash = get_file_hash (newabspath );
368
355
369
- char * abspath = absolutepath ( pid , newdirfd , newpath );
356
+ FILE_INFO * from = find_finfo ( oldabspath , hash );
370
357
371
- FILE_INFO * to = next_finfo ();
358
+ if (!from ) {
359
+ from = next_finfo ();
360
+ finfo_new (from , oldpath , oldabspath , hash );
361
+ record_file (from -> outname , oldpath , oldabspath );
362
+ record_hash (from -> outname , hash );
363
+ } else {
364
+ free (oldpath );
365
+ free (oldabspath );
366
+ }
372
367
373
- finfo_new (to , newpath , abspath , from -> hash );
374
- record_file (to -> outname , newpath , abspath );
375
- record_hash (to -> outname , to -> hash );
368
+ FILE_INFO * to = find_finfo (newabspath , hash );
369
+
370
+ if (!to ) {
371
+ to = next_finfo ();
372
+ finfo_new (to , newpath , newabspath , hash );
373
+ record_file (to -> outname , newpath , newabspath );
374
+ record_hash (to -> outname , hash );
375
+ } else {
376
+ free (newpath );
377
+ free (newabspath );
378
+ if (from -> hash != hash ) {
379
+ free (hash );
380
+ }
381
+ }
376
382
377
383
record_rename (pi -> outname , from -> outname , to -> outname );
378
384
}
@@ -447,6 +453,7 @@ handle_syscall_exit(pid_t pid, PROCESS_INFO *pi, int64_t rval)
447
453
int flags ;
448
454
int dirfd ;
449
455
FILE_INFO * f ;
456
+ char * oldpath ;
450
457
int newdirfd ;
451
458
char * newpath ;
452
459
@@ -532,29 +539,32 @@ handle_syscall_exit(pid_t pid, PROCESS_INFO *pi, int64_t rval)
532
539
#ifdef HAVE_SYS_RENAME
533
540
case SYS_rename :
534
541
// int rename(const char *oldpath, const char *newpath);
542
+ oldpath = get_str_from_process (pid , (void * ) pi -> args [0 ]);
535
543
newpath = get_str_from_process (pid , (void * ) pi -> args [1 ]);
536
544
537
- handle_rename_exit (pid , pi , AT_FDCWD , newpath );
545
+ handle_rename_exit (pid , pi , oldpath , AT_FDCWD , newpath );
538
546
break ;
539
547
#endif
540
548
#ifdef HAVE_SYS_RENAMEAT
541
549
case SYS_renameat :
542
550
// int renameat(int olddirfd, const char *oldpath, int newdirfd,
543
551
// const char *newpath);
552
+ oldpath = get_str_from_process (pid , (void * ) pi -> args [1 ]);
544
553
newdirfd = pi -> args [2 ];
545
554
newpath = get_str_from_process (pid , (void * ) pi -> args [3 ]);
546
555
547
- handle_rename_exit (pid , pi , newdirfd , newpath );
556
+ handle_rename_exit (pid , pi , oldpath , newdirfd , newpath );
548
557
break ;
549
558
#endif
550
559
#ifdef HAVE_SYS_RENAMEAT2
551
560
case SYS_renameat2 :
552
561
// int renameat2(int olddirfd, const char *oldpath, int newdirfd,
553
562
// const char *newpath, unsigned int flags);
563
+ oldpath = get_str_from_process (pid , (void * ) pi -> args [1 ]);
554
564
newdirfd = pi -> args [2 ];
555
565
newpath = get_str_from_process (pid , (void * ) pi -> args [3 ]);
556
566
557
- handle_rename_exit (pid , pi , newdirfd , newpath );
567
+ handle_rename_exit (pid , pi , oldpath , newdirfd , newpath );
558
568
break ;
559
569
#endif
560
570
#ifdef HAVE_SYS_FORK
0 commit comments