Merge pull request #11077 from yuwata/udev-issue-better-fix
sd-device: do not change buffer size if the socket is already bound
This commit is contained in:
@@ -93,6 +93,12 @@ _public_ int sd_device_monitor_set_receive_buffer_size(sd_device_monitor *m, siz
|
||||
assert_return(m, -EINVAL);
|
||||
assert_return((size_t) n == size, -EINVAL);
|
||||
|
||||
if (m->bound)
|
||||
return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
|
||||
"sd-device-monitor: Socket fd is already bound. "
|
||||
"It may be dangerous to change buffer size. "
|
||||
"Refusing to change buffer size.");
|
||||
|
||||
if (setsockopt_int(m->sock, SOL_SOCKET, SO_RCVBUF, n) < 0) {
|
||||
r = setsockopt_int(m->sock, SOL_SOCKET, SO_RCVBUFFORCE, n);
|
||||
if (r < 0)
|
||||
@@ -211,11 +217,9 @@ _public_ int sd_device_monitor_start(sd_device_monitor *m, sd_device_monitor_han
|
||||
return r;
|
||||
}
|
||||
|
||||
if (!m->bound) {
|
||||
r = device_monitor_enable_receiving(m);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
r = device_monitor_enable_receiving(m);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
m->callback = callback;
|
||||
m->userdata = userdata;
|
||||
@@ -277,21 +281,21 @@ int device_monitor_enable_receiving(sd_device_monitor *m) {
|
||||
return log_debug_errno(r, "sd-device-monitor: Failed to update filter: %m");
|
||||
|
||||
if (!m->bound) {
|
||||
/* enable receiving of sender credentials */
|
||||
r = setsockopt_int(m->sock, SOL_SOCKET, SO_PASSCRED, true);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "sd-device-monitor: Failed to set socket option SO_PASSCRED: %m");
|
||||
|
||||
if (bind(m->sock, &m->snl.sa, sizeof(struct sockaddr_nl)) < 0)
|
||||
return log_debug_errno(errno, "sd-device-monitor: Failed to bind monitoring socket: %m");
|
||||
|
||||
m->bound = true;
|
||||
|
||||
r = monitor_set_nl_address(m);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "sd-device-monitor: Failed to set address: %m");
|
||||
}
|
||||
|
||||
r = monitor_set_nl_address(m);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "sd-device-monitor: Failed to set address: %m");
|
||||
|
||||
/* enable receiving of sender credentials */
|
||||
r = setsockopt_int(m->sock, SOL_SOCKET, SO_PASSCRED, true);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "sd-device-monitor: Failed to set socket option SO_PASSCRED: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -1630,8 +1630,7 @@ static int manager_new(Manager **ret, int fd_ctrl, int fd_uevent, const char *cg
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to initialize device monitor: %m");
|
||||
|
||||
if (fd_uevent < 0)
|
||||
(void) sd_device_monitor_set_receive_buffer_size(manager->monitor, 128 * 1024 * 1024);
|
||||
(void) sd_device_monitor_set_receive_buffer_size(manager->monitor, 128 * 1024 * 1024);
|
||||
|
||||
/* unnamed socket from workers to the main daemon */
|
||||
r = socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, manager->worker_watch);
|
||||
|
||||
Reference in New Issue
Block a user