From 0f2ccbd78b47f62759fa1b6856ad0027ae82e709 Mon Sep 17 00:00:00 2001 From: Dariusz Sosnowski Date: Sat, 5 Sep 2020 19:50:53 +0200 Subject: [PATCH] record_syscall: Handle ETHTOOL_GLINKSETTINGS correctly --- src/record_syscall.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/record_syscall.cc b/src/record_syscall.cc index 4c928dcc144..3927c0f8cc3 100644 --- a/src/record_syscall.cc +++ b/src/record_syscall.cc @@ -1573,9 +1573,20 @@ template void prepare_ethtool_ioctl(RecordTask* t, TaskSyscallSt case ETHTOOL_SFEATURES: break; // Expected EINVAL for 'ioctl' but got result 0 (errno SUCCESS); unknown ETHTOOL command 76 - case ETHTOOL_GLINKSETTINGS: - // TODO(sodar): Handle it somehow? + case ETHTOOL_GLINKSETTINGS: { + auto buf = t->read_mem(buf_ptr.cast(), &ok); + if (ok) { + auto nwords = ( + buf.link_mode_masks_nwords > 0 ? buf.link_mode_masks_nwords : -buf.link_mode_masks_nwords + ); + auto size = ParamSize(sizeof(buf) + sizeof(buf.link_mode_masks[0]) * nwords); + syscall_state.mem_ptr_parameter(payload, size, IN_OUT); + } else { + syscall_state.expect_errno = EFAULT; + return; + } break; + } // Expected EINVAL for 'ioctl' but got result 0 (errno SUCCESS); unknown ETHTOOL command 29 case ETHTOOL_GSTATS: // TODO(sodar): Handle it somehow?