@@ -256,15 +256,18 @@ 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_ACCESS )
262+ return ret ;
263+ }
261264 if (ret == 0 )
262265 ret = patch_verify_safety (o , NULL , action );
263266 }
264267
265268 free (retips );
266269
267- return ret ? -1 : 0 ;
270+ return ret ? ERROR_BUSY : 0 ;
268271}
269272
270273/*****************************************************************************
@@ -347,12 +350,12 @@ object_apply_patch(struct object_file *o)
347350 ret = duplicate_kp_file (o );
348351 if (ret < 0 ) {
349352 kplogerror ("can't duplicate kp_file\n" );
350- return -1 ;
353+ return ERROR_PATCH ;
351354 }
352355
353356 ret = kpatch_elf_load_kpatch_info (o );
354357 if (ret < 0 )
355- return ret ;
358+ return ERROR_PATCH ;
356359
357360 kp = o -> kpfile .patch ;
358361
@@ -379,26 +382,26 @@ object_apply_patch(struct object_file *o)
379382 */
380383 ret = kpatch_object_allocate_patch (o , sz );
381384 if (ret < 0 )
382- return ret ;
385+ return ERROR_PATCH ;
383386 ret = kpatch_resolve (o );
384387 if (ret < 0 )
385- return ret ;
388+ return ERROR_PATCH ;
386389 ret = kpatch_relocate (o );
387390 if (ret < 0 )
388- return ret ;
391+ return ERROR_PATCH ;
389392 ret = kpatch_process_mem_write (o -> proc ,
390393 kp ,
391394 o -> kpta ,
392395 kp -> total_size );
393396 if (ret < 0 )
394- return -1 ;
397+ return ERROR_PATCH ;
395398 if (o -> jmp_table ) {
396399 ret = kpatch_process_mem_write (o -> proc ,
397400 o -> jmp_table ,
398401 o -> kpta + kp -> jmp_offset ,
399402 o -> jmp_table -> size );
400403 if (ret < 0 )
401- return ret ;
404+ return ERROR_PATCH ;
402405 }
403406
404407 ret = patch_ensure_safety (o , ACTION_APPLY_PATCH );
@@ -408,7 +411,7 @@ object_apply_patch(struct object_file *o)
408411 for (i = 0 ; i < o -> ninfo ; i ++ ) {
409412 ret = patch_apply_hunk (o , i );
410413 if (ret < 0 )
411- return ret ;
414+ return ERROR_PATCH ;
412415 }
413416
414417 return 1 ;
@@ -442,9 +445,10 @@ object_unapply_old_patch(struct object_file *o)
442445 kpatch_applied -> user_level ,
443446 kpatch_storage -> user_level );
444447 ret = object_unapply_patch (o , /* check_flag */ 0 );
445- if (ret < 0 )
448+ if (ret < 0 ) {
446449 kperr ("can't unapply patch for %s\n" , o -> name );
447- else {
450+ ret = ERROR_UNPATCH ;
451+ } else {
448452 /* TODO(pboldin): handle joining the holes here */
449453 o -> applied_patch = NULL ;
450454 o -> info = NULL ;
@@ -464,7 +468,7 @@ kpatch_apply_patches(kpatch_process_t *proc)
464468
465469 ret = object_unapply_old_patch (o );
466470 if (ret < 0 )
467- break ;
471+ return ret ;
468472
469473 ret = object_apply_patch (o );
470474 if (ret < 0 )
@@ -480,11 +484,11 @@ kpatch_apply_patches(kpatch_process_t *proc)
480484 * TODO(pboldin): close the holes so the state is the same
481485 * after unpatch
482486 */
483- ret = object_unapply_patch (o , /* check_flag */ 1 );
484- if ( ret < 0 ) {
487+ if ( object_unapply_patch (o , /* check_flag */ 1 ) < 0 ) {
488+ ret = ERROR_PATCH_UNPATCH ;
485489 kperr ("Can't unapply patch for %s\n" , o -> name );
486490 }
487- return -1 ;
491+ return ret ;
488492}
489493
490494int process_patch (int pid , void * _data )
@@ -565,16 +569,18 @@ int process_patch(int pid, void *_data)
565569
566570out :
567571 if (ret < 0 ) {
568- printf ("Failed to apply patch '%s'\n" , storage -> path );
572+ if (ret == -1 )
573+ return ERROR_PATCH ;
574+ kpinfo ("Failed to apply patch '%s'\n" , storage -> path );
569575 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 ;
576+ return ret ;
577+ } else if (ret == 0 ) {
578+ kpinfo ("No patch(es) applicable to PID '%d' have been found\n" , pid );
579+ return ERROR_NOPATCH ;
580+ } else {
581+ kpinfo ("%d patch hunk(s) have been successfully applied to PID '%d'\n" , ret , pid );
582+ return ERROR_SUCCESS ;
575583 }
576-
577- return ret ;
578584}
579585
580586
@@ -592,6 +598,8 @@ object_find_applied_patch_info(struct object_file *o)
592598
593599 if (o -> info != NULL )
594600 return 0 ;
601+ if (!o -> kpta || !o -> kpfile .patch )
602+ return -1 ;
595603
596604 iter = kpatch_process_mem_iter_init (o -> proc );
597605 if (iter == NULL )
@@ -617,6 +625,8 @@ object_find_applied_patch_info(struct object_file *o)
617625 o -> ninfo ++ ;
618626 } while (1 );
619627
628+ if (!o -> applied_patch )
629+ return 0 ;
620630 o -> applied_patch -> info = o -> info ;
621631 o -> applied_patch -> ninfo = o -> ninfo ;
622632
@@ -641,6 +651,8 @@ object_unapply_patch(struct object_file *o, int check_flag)
641651 if (ret < 0 )
642652 return ret ;
643653
654+ if (!o -> kpta || !o -> kpfile .patch )
655+ return -1 ;
644656 orig_code_addr = o -> kpta + o -> kpfile .patch -> user_undo ;
645657
646658 for (i = 0 ; i < o -> ninfo ; i ++ ) {
@@ -728,7 +740,7 @@ int process_unpatch(int pid, void *_data)
728740
729741 ret = kpatch_process_init (proc , pid , /* start */ 0 , /* send_fd */ -1 );
730742 if (ret < 0 )
731- return -1 ;
743+ return ret ;
732744
733745 kpatch_process_print_short (proc );
734746
@@ -749,13 +761,17 @@ int process_unpatch(int pid, void *_data)
749761out :
750762 kpatch_process_free (proc );
751763
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 ;
764+ if (ret < 0 ) {
765+ kpinfo ("Failed to cancel patches for %d\n" , pid );
766+ if (ret == -1 )
767+ return ERROR_UNPATCH ;
768+ return ret ;
769+ } else if (ret == 0 ) {
770+ kpinfo ("No patch(es) cancellable from PID '%d' were found\n" , pid );
771+ return ERROR_NOPATCH ;
772+ } else {
773+ kpinfo ("%d patch hunk(s) were successfully cancelled from PID '%d'\n" , ret , pid );
774+ return 0 ;
775+ }
760776}
761777
0 commit comments