@@ -256,15 +256,20 @@ patch_ensure_safety(struct object_file *o,
256256 ret = kpatch_ptrace_execute_until (o -> proc , 3000 , 0 );
257257
258258 /* OK, at this point we may have new threads, discover them */
259- if (ret == 0 )
259+ if (ret == 0 ) {
260260 ret = kpatch_process_attach (o -> proc );
261+ if (ret == ERROR_RESOURCE_ACCESS ) {
262+ free (retips );
263+ return ret ;
264+ }
265+ }
261266 if (ret == 0 )
262267 ret = patch_verify_safety (o , NULL , action );
263268 }
264269
265270 free (retips );
266271
267- return ret ? -1 : 0 ;
272+ return ret ? ERROR_RESOURCE_BUSY : 0 ;
268273}
269274
270275/*****************************************************************************
@@ -347,12 +352,12 @@ object_apply_patch(struct object_file *o)
347352 ret = duplicate_kp_file (o );
348353 if (ret < 0 ) {
349354 kplogerror ("can't duplicate kp_file\n" );
350- return -1 ;
355+ return ERROR_PATCH_FAILURE ;
351356 }
352357
353358 ret = kpatch_elf_load_kpatch_info (o );
354359 if (ret < 0 )
355- return ret ;
360+ return ERROR_PATCH_FAILURE ;
356361
357362 kp = o -> kpfile .patch ;
358363
@@ -379,26 +384,26 @@ object_apply_patch(struct object_file *o)
379384 */
380385 ret = kpatch_object_allocate_patch (o , sz );
381386 if (ret < 0 )
382- return ret ;
387+ return ERROR_PATCH_FAILURE ;
383388 ret = kpatch_resolve (o );
384389 if (ret < 0 )
385- return ret ;
390+ return ERROR_PATCH_FAILURE ;
386391 ret = kpatch_relocate (o );
387392 if (ret < 0 )
388- return ret ;
393+ return ERROR_PATCH_FAILURE ;
389394 ret = kpatch_process_mem_write (o -> proc ,
390395 kp ,
391396 o -> kpta ,
392397 kp -> total_size );
393398 if (ret < 0 )
394- return -1 ;
399+ return ERROR_PATCH_FAILURE ;
395400 if (o -> jmp_table ) {
396401 ret = kpatch_process_mem_write (o -> proc ,
397402 o -> jmp_table ,
398403 o -> kpta + kp -> jmp_offset ,
399404 o -> jmp_table -> size );
400405 if (ret < 0 )
401- return ret ;
406+ return ERROR_PATCH_FAILURE ;
402407 }
403408
404409 ret = patch_ensure_safety (o , ACTION_APPLY_PATCH );
@@ -408,7 +413,7 @@ object_apply_patch(struct object_file *o)
408413 for (i = 0 ; i < o -> ninfo ; i ++ ) {
409414 ret = patch_apply_hunk (o , i );
410415 if (ret < 0 )
411- return ret ;
416+ return ERROR_PATCH_FAILURE ;
412417 }
413418
414419 return 1 ;
@@ -442,9 +447,10 @@ object_unapply_old_patch(struct object_file *o)
442447 kpatch_applied -> user_level ,
443448 kpatch_storage -> user_level );
444449 ret = object_unapply_patch (o , /* check_flag */ 0 );
445- if (ret < 0 )
450+ if (ret < 0 ) {
446451 kperr ("can't unapply patch for %s\n" , o -> name );
447- else {
452+ ret = ERROR_UNPATCH_FAILURE ;
453+ } else {
448454 /* TODO(pboldin): handle joining the holes here */
449455 o -> applied_patch = NULL ;
450456 o -> info = NULL ;
@@ -464,7 +470,7 @@ kpatch_apply_patches(kpatch_process_t *proc)
464470
465471 ret = object_unapply_old_patch (o );
466472 if (ret < 0 )
467- break ;
473+ return ret ;
468474
469475 ret = object_apply_patch (o );
470476 if (ret < 0 )
@@ -480,11 +486,11 @@ kpatch_apply_patches(kpatch_process_t *proc)
480486 * TODO(pboldin): close the holes so the state is the same
481487 * after unpatch
482488 */
483- ret = object_unapply_patch (o , /* check_flag */ 1 );
484- if ( ret < 0 ) {
489+ if ( object_unapply_patch (o , /* check_flag */ 1 ) < 0 ) {
490+ ret = ERROR_UNPATCH_FAILURE ;
485491 kperr ("Can't unapply patch for %s\n" , o -> name );
486492 }
487- return -1 ;
493+ return ret ;
488494}
489495
490496int process_patch (int pid , void * _data )
@@ -565,16 +571,18 @@ int process_patch(int pid, void *_data)
565571
566572out :
567573 if (ret < 0 ) {
568- printf ("Failed to apply patch '%s'\n" , storage -> path );
574+ if (ret == -1 )
575+ return ERROR_PATCH_FAILURE ;
576+ kpinfo ("Failed to apply patch '%s'\n" , storage -> path );
569577 kperr ("Failed to apply patch '%s'\n" , storage -> path );
570- } else if (ret == 0 )
571- printf ("No patch(es) applicable to PID '%d' have been found\n" , pid );
572- else {
573- printf ("%d patch hunk(s) have been successfully applied to PID '%d'\n" , ret , pid );
574- ret = 0 ;
578+ return ret ;
579+ } else if (ret == 0 ) {
580+ kpinfo ("No patch(es) applicable to PID '%d' have been found\n" , pid );
581+ return ERROR_PATCH_NOT_FOUND ;
582+ } else {
583+ kpinfo ("%d patch hunk(s) have been successfully applied to PID '%d'\n" , ret , pid );
584+ return ERROR_SUCCESS ;
575585 }
576-
577- return ret ;
578586}
579587
580588
@@ -592,6 +600,8 @@ object_find_applied_patch_info(struct object_file *o)
592600
593601 if (o -> info != NULL )
594602 return 0 ;
603+ if (!o -> kpta || !o -> kpfile .patch )
604+ return -1 ;
595605
596606 iter = kpatch_process_mem_iter_init (o -> proc );
597607 if (iter == NULL )
@@ -617,6 +627,8 @@ object_find_applied_patch_info(struct object_file *o)
617627 o -> ninfo ++ ;
618628 } while (1 );
619629
630+ if (!o -> applied_patch )
631+ return 0 ;
620632 o -> applied_patch -> info = o -> info ;
621633 o -> applied_patch -> ninfo = o -> ninfo ;
622634
@@ -641,6 +653,8 @@ object_unapply_patch(struct object_file *o, int check_flag)
641653 if (ret < 0 )
642654 return ret ;
643655
656+ if (!o -> kpta || !o -> kpfile .patch )
657+ return -1 ;
644658 orig_code_addr = o -> kpta + o -> kpfile .patch -> user_undo ;
645659
646660 for (i = 0 ; i < o -> ninfo ; i ++ ) {
@@ -728,7 +742,7 @@ int process_unpatch(int pid, void *_data)
728742
729743 ret = kpatch_process_init (proc , pid , /* start */ 0 , /* send_fd */ -1 );
730744 if (ret < 0 )
731- return -1 ;
745+ return ret ;
732746
733747 kpatch_process_print_short (proc );
734748
@@ -749,13 +763,17 @@ int process_unpatch(int pid, void *_data)
749763out :
750764 kpatch_process_free (proc );
751765
752- if (ret < 0 )
753- printf ("Failed to cancel patches for %d\n" , pid );
754- else if (ret == 0 )
755- printf ("No patch(es) cancellable from PID '%d' were found\n" , pid );
756- else
757- printf ("%d patch hunk(s) were successfully cancelled from PID '%d'\n" , ret , pid );
758-
759- return ret ;
766+ if (ret < 0 ) {
767+ kpinfo ("Failed to cancel patches for %d\n" , pid );
768+ if (ret == -1 )
769+ return ERROR_UNPATCH_FAILURE ;
770+ return ret ;
771+ } else if (ret == 0 ) {
772+ kpinfo ("No patch(es) cancellable from PID '%d' were found\n" , pid );
773+ return ERROR_PATCH_NOT_FOUND ;
774+ } else {
775+ kpinfo ("%d patch hunk(s) were successfully cancelled from PID '%d'\n" , ret , pid );
776+ return 0 ;
777+ }
760778}
761779
0 commit comments