seccomp_notify_receive()
рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╕ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
if (ioctl(fd, SECCOMP_IOCTL_NOTIF_RECV, req) < 0)
return -ECANCELED;
errno
рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ -ECANCELED
рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рд╕реНрдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рд┐рдЧрд░реНрдЧ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдХрд╛рд░рдг ioctl рдиреЗ EINTR рд▓реМрдЯрд╛ рджрд┐рдпрд╛:
1448850 ioctl(7, SECCOMP_IOCTL_NOTIF_RECV <unfinished ...>
1448230 getpid() = 1448217
1448230 tgkill(1448217, 1448850, SIGURG) = 0
1448850 <... ioctl resumed>, 0x7fc65d49ecd0) = -1 EINTR (Interrupted system call)
рд╕рд┐рдЧреНрдирд▓ SIGURL рдЧреЛрд▓рдВрдЧ рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, https://go-review.googlesource.com/c/go/+/232862/ рдореЗрдВ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВред
рдЙрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, EINTR рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп syscall рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ libseccomp рдХреЛ рдЗрд╕рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА рд╣реИред
рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ seccomp_notify_receive() рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдФрд░ seccomp_notify_respond()
рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП syscall рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдкреИрдЯрд░реНрди рд╕рдорд╛рди рд╣реИ:
if (ioctl(fd, SECCOMP_IOCTL_NOTIF_SEND, resp) < 0)
return -ECANCELED;
рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдореБрдЭреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ errno = ENOENT рдорд┐рд▓рддрд╛ рд╣реИ:
1497880 ioctl(12, SECCOMP_IOCTL_NOTIF_SEND, 0x7f718fd28e10) = -1 ENOENT (No such file or directory)
libseccomp рдореБрдЭреЗ ENOENT рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ ( SECCOMP_IOCTL_NOTIF_SEND
рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╛рдзрд┐рдд рд╣реЛ рдЧрдИ рд╣реИ) рдФрд░ EINTR (seccomp рдПрдЬреЗрдВрдЯ рдХреЛ SIGURG рд╕рд┐рдЧреНрдирд▓ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдореИрдВ рдЧреЛрд▓рд╛рдВрдЧ рд╕реЗ errno
рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред
рд╣рд╛рдп @ рдЕрд▓реНрдмрд╛рдиред
SCMP_FLTATR_API_SYSRAWRC
рдХреЛ seccomp_attr_set(3)
рдореИрдирдкреЗрдЬ рдореЗрдВ рджреЗрдЦреЗрдВ:
рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реНрд▓реИрдЧ рдХрд┐ рдХреНрдпрд╛ libseccomp рдХреЛ рд╕рд┐рд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ -ECANCELED рдХреЗ рдмрдЬрд╛рдп рдХреЙрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рдорд╛рди == 0)ред
рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдХрд░реНрдиреЗрд▓/libc рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ libseccomp API рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд░рд┐рдЯрд░реНрди рдХреЛрдб рд╡рд╛рджрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -ECANCELED
рдХреЛ рдмрд╛рдзреНрдп рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП SCMP_FLTATR_API_SYSRAWRC
рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд░реНрдиреЗрд▓/libc рд░рд┐рдЯрд░реНрди рдХреЛрдб рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдмрд╕ рдЪреЗрддрд╛рд╡рдиреА рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдПрдХ рд╕реНрдерд┐рд░ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред
рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ NOTABUG рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╢реНрди рд╣реИрдВ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдЗрд╕ рдкрд░ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рд╣рдо рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рд╛рдп @pcmoore , рддреНрд╡рд░рд┐рдд рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╣рдо рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП SCMP_FLTATR_API_SYSRAWRC рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд░реНрдиреЗрд▓/libc рд░рд┐рдЯрд░реНрди рдХреЛрдб рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рд▓реЗрдХрд┐рди рдирдП рдХрд╛рд░реНрдп
_rc_filter()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ _rc_filter_sys()
рдХрд╛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП SCMP_FLTATR_API_SYSRAWRC
рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВред
рд▓реЗрдХрд┐рди рдирдП рдлрд╝рдВрдХреНрд╢рди ... _rc_filter() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рди рдХрд┐ _rc_filter_sys() ...
рдЖрд╣ ... рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рддрд╛ рд╣реИ, "system.c" рдореЗрдВ рджреЗрдЦреЗрдВ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ libseccomp рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдХреЙрд▓ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдирдкреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП SCMP_FLTATR_API_SYSRAWRC
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рддрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП seccomp_load(3)
рджреЗрдЦреЗрдВ)ред
рдореИрдВ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ RFE рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
@drakenclimber рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ v2.6.x (рд╕рдВрднрд╡рддрдГ v2.5.2) рд╕рд╛рдордЧреНрд░реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ v2.5.1 рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдЕрдЧрд░ рдЖрдкрдХреА рд╕реЛрдЪ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред
рдзрдиреНрдпрд╡рд╛рдж!
рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдХреЛрдб рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде ENOENT рдФрд░ EINTR рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛрд▓рд╛рдВрдЧ рдкрдХреНрд╖ рдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкрд╛рдпрд╛:
- if retCode := C.seccomp_notify_respond(C.int(fd), resp); retCode != 0 {
- return errRc(retCode)
+ for {
+ retCode, errno := C.seccomp_notify_respond(C.int(fd), resp)
+ if errno == syscall.EINTR {
+ continue
+ }
+ if errno == syscall.ENOENT {
+ return errno
+ }
+ if retCode != 0 {
+ return errRc(retCode)
+ }
+ break
}
рдЗрд╕рдХреЗ рд╕рд╛рде, рдпрд╣ libseccomp-2.5.0 рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ,
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЖрд╣ ... рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рддрд╛ рд╣реИ, "system.c" рдореЗрдВ рджреЗрдЦреЗрдВ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ libseccomp рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдХреЙрд▓ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдирдкреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП
SCMP_FLTATR_API_SYSRAWRC
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рддрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПseccomp_load(3)
рджреЗрдЦреЗрдВ)редрдореИрдВ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ RFE рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
@drakenclimber рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ v2.6.x (рд╕рдВрднрд╡рддрдГ v2.5.2) рд╕рд╛рдордЧреНрд░реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ v2.5.1 рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдЕрдЧрд░ рдЖрдкрдХреА рд╕реЛрдЪ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред