Skip to content

Commit eb345e8

Browse files
shailend-ggvisor-bot
authored andcommitted
signalfd: Populate ssi_int and ssi_ptr
PiperOrigin-RevId: 896674700
1 parent d52aaf9 commit eb345e8

3 files changed

Lines changed: 40 additions & 2 deletions

File tree

pkg/sentry/fsimpl/signalfd/signalfd.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ func (sfd *SignalFileDescription) Read(ctx context.Context, dst usermem.IOSequen
112112
Status: info.Status(),
113113
Overrun: uint32(info.Overrun()),
114114
Addr: info.Addr(),
115+
Int: int32(info.Sigval()),
116+
Ptr: info.Sigval(),
115117
}
116118
n, err := infoNative.WriteTo(dst.Writer(ctx))
117119
if err == usermem.ErrEndOfIOSequence {

test/syscalls/linux/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2604,7 +2604,9 @@ cc_binary(
26042604
"//test/util:test_main",
26052605
"//test/util:test_util",
26062606
"//test/util:thread_util",
2607+
"@com_google_absl//absl/strings",
26072608
"@com_google_absl//absl/synchronization",
2609+
"@com_google_absl//absl/time",
26082610
],
26092611
)
26102612

test/syscalls/linux/signalfd.cc

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,22 @@
1616
#include <poll.h>
1717
#include <signal.h>
1818
#include <stdio.h>
19-
#include <string.h>
2019
#include <sys/signalfd.h>
20+
#include <sys/syscall.h>
2121
#include <unistd.h>
2222

23+
#include <ctime>
2324
#include <functional>
24-
#include <vector>
25+
#include <string>
2526

27+
#include "gmock/gmock.h"
2628
#include "gtest/gtest.h"
29+
#include "absl/strings/str_cat.h"
2730
#include "absl/synchronization/mutex.h"
31+
#include "absl/time/clock.h"
32+
#include "absl/time/time.h"
2833
#include "test/util/file_descriptor.h"
34+
#include "test/util/logging.h"
2935
#include "test/util/posix_error.h"
3036
#include "test/util/signal_util.h"
3137
#include "test/util/test_util.h"
@@ -341,6 +347,34 @@ TEST(Signalfd, KillStillKills) {
341347
EXPECT_EXIT(tgkill(getpid(), gettid(), SIGKILL), KilledBySignal(SIGKILL), "");
342348
}
343349

350+
TEST(Signalfd, RtQueueDeliversPayload) {
351+
const int signo = kSignoMax;
352+
sigset_t mask;
353+
sigemptyset(&mask);
354+
sigaddset(&mask, signo);
355+
356+
const auto scoped_sigmask =
357+
ASSERT_NO_ERRNO_AND_VALUE(ScopedSignalMask(SIG_BLOCK, signo));
358+
FileDescriptor fd =
359+
ASSERT_NO_ERRNO_AND_VALUE(NewSignalFD(&mask, SFD_NONBLOCK));
360+
361+
sigval_t first, second;
362+
first.sival_int = 101;
363+
second.sival_int = 102;
364+
ASSERT_THAT(sigqueue(getpid(), signo, first), SyscallSucceeds());
365+
ASSERT_THAT(sigqueue(getpid(), signo, second), SyscallSucceeds());
366+
367+
struct signalfd_siginfo ssi;
368+
ASSERT_THAT(read(fd.get(), &ssi, sizeof(ssi)),
369+
SyscallSucceedsWithValue(sizeof(ssi)));
370+
EXPECT_EQ(ssi.ssi_signo, signo);
371+
EXPECT_EQ(ssi.ssi_int, first.sival_int);
372+
ASSERT_THAT(read(fd.get(), &ssi, sizeof(ssi)),
373+
SyscallSucceedsWithValue(sizeof(ssi)));
374+
EXPECT_EQ(ssi.ssi_signo, signo);
375+
EXPECT_EQ(ssi.ssi_int, second.sival_int);
376+
}
377+
344378
} // namespace
345379

346380
} // namespace testing

0 commit comments

Comments
 (0)