@@ -775,40 +775,44 @@ print_known_syscall(char *dst, const struct syscall_desc *desc,
775775 }
776776 }
777777
778- dst = print_cstr (dst , ") = " );
779- switch (desc -> return_type ) {
780- case rhex :
781- dst = print_hex (dst , result );
782- break ;
783- case rdec :
784- dst = print_rdec (dst , result );
785- break ;
786- case runsigned :
787- dst = print_runsigned (dst , result );
788- break ;
789- case rmode :
790- dst = print_mode_t (dst , result );
791- break ;
778+ * dst ++ = ')' ;
779+ if (desc -> return_type != rnoreturn ) {
780+ dst = print_cstr (dst , " = " );
781+ switch (desc -> return_type ) {
782+ default :
783+ case rhex :
784+ dst = print_hex (dst , result );
785+ break ;
786+ case rdec :
787+ dst = print_rdec (dst , result );
788+ break ;
789+ case runsigned :
790+ dst = print_runsigned (dst , result );
791+ break ;
792+ case rmode :
793+ dst = print_mode_t (dst , result );
794+ break ;
795+ }
792796 }
793797
794798 return dst ;
795799}
796800
797- static ssize_t
798- print_syscall (char * dst , long syscall_number , long args [6 ], long result )
801+ static void
802+ print_syscall (const struct syscall_desc * desc ,
803+ long syscall_number , const long args [6 ], long result )
799804{
800- const struct syscall_desc * desc =
801- get_syscall_desc (syscall_number , args );
802-
805+ char local_buffer [0x300 ];
803806 char * c ;
804807
805808 if (desc != NULL )
806- c = print_known_syscall (dst , desc , args , result );
809+ c = print_known_syscall (local_buffer , desc , args , result );
807810 else
808- c = print_unknown_syscall (dst , syscall_number , args , result );
811+ c = print_unknown_syscall (local_buffer , syscall_number ,
812+ args , result );
809813
810814 * c ++ = '\n' ;
811- return c - dst ;
815+ append_buffer ( local_buffer , c - local_buffer ) ;
812816}
813817
814818static int
@@ -818,17 +822,21 @@ hook(long syscall_number,
818822 long arg4 , long arg5 ,
819823 long * result )
820824{
821- * result = syscall_no_intercept (syscall_number ,
822- arg0 , arg1 , arg2 , arg3 , arg4 , arg5 );
823-
824825 long args [6 ] = {arg0 , arg1 , arg2 , arg3 , arg4 , arg5 };
826+ const struct syscall_desc * desc =
827+ get_syscall_desc (syscall_number , args );
825828
826- char local_buffer [0x300 ];
827- ssize_t len ;
829+ if (desc != NULL && desc -> return_type == rnoreturn ) {
830+ print_syscall (desc , syscall_number , args , 0 );
831+ if (syscall_number == SYS_exit_group && buffer_offset > 0 )
832+ syscall_no_intercept (SYS_write , log_fd ,
833+ buffer , buffer_offset );
834+ }
828835
829- len = print_syscall (local_buffer , syscall_number , args , * result );
836+ * result = syscall_no_intercept (syscall_number ,
837+ arg0 , arg1 , arg2 , arg3 , arg4 , arg5 );
830838
831- append_buffer ( local_buffer , len );
839+ print_syscall ( desc , syscall_number , args , * result );
832840
833841 return 0 ;
834842}
@@ -848,10 +856,3 @@ start(void)
848856
849857 intercept_hook_point = & hook ;
850858}
851-
852- static __attribute__((destructor )) void
853- end (void )
854- {
855- if (buffer_offset > 0 )
856- syscall_no_intercept (SYS_write , log_fd , buffer , buffer_offset );
857- }
0 commit comments