platform: merge branch 'th/platform-recvmsgs-fixes-bgo761959'
https://bugzilla.gnome.org/show_bug.cgi?id=761959
This commit is contained in:
@@ -41,6 +41,8 @@
|
|||||||
|
|
||||||
/* always include these headers for our internal source files. */
|
/* always include these headers for our internal source files. */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "nm-glib.h"
|
#include "nm-glib.h"
|
||||||
#include "nm-version.h"
|
#include "nm-version.h"
|
||||||
#include "gsystem-local-alloc.h"
|
#include "gsystem-local-alloc.h"
|
||||||
|
@@ -22,7 +22,15 @@
|
|||||||
#ifndef __NM_MACROS_INTERNAL_H__
|
#ifndef __NM_MACROS_INTERNAL_H__
|
||||||
#define __NM_MACROS_INTERNAL_H__
|
#define __NM_MACROS_INTERNAL_H__
|
||||||
|
|
||||||
#include "nm-default.h"
|
/********************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_auto_free:
|
||||||
|
*
|
||||||
|
* Call free() on a variable location when it goes out of scope.
|
||||||
|
*/
|
||||||
|
#define nm_auto_free __attribute__ ((cleanup(_nm_auto_free_impl)))
|
||||||
|
GS_DEFINE_CLEANUP_FUNCTION(void*, _nm_auto_free_impl, free)
|
||||||
|
|
||||||
/********************************************************/
|
/********************************************************/
|
||||||
|
|
||||||
|
@@ -5556,8 +5556,7 @@ event_handler_recvmsgs (NMPlatform *platform, gboolean handle_events)
|
|||||||
{
|
{
|
||||||
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
|
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
|
||||||
struct nl_sock *sk = priv->nlh;
|
struct nl_sock *sk = priv->nlh;
|
||||||
int n, err = 0, multipart = 0, interrupted = 0, nrecv = 0;
|
int n, err = 0, multipart = 0, interrupted = 0;
|
||||||
unsigned char *buf = NULL;
|
|
||||||
struct nlmsghdr *hdr;
|
struct nlmsghdr *hdr;
|
||||||
WaitForNlResponseResult seq_result;
|
WaitForNlResponseResult seq_result;
|
||||||
|
|
||||||
@@ -5567,10 +5566,12 @@ event_handler_recvmsgs (NMPlatform *platform, gboolean handle_events)
|
|||||||
initialize the variable. Thomas Graf.
|
initialize the variable. Thomas Graf.
|
||||||
*/
|
*/
|
||||||
struct sockaddr_nl nla = {0};
|
struct sockaddr_nl nla = {0};
|
||||||
struct nl_msg *msg = NULL;
|
nm_auto_free struct ucred *creds = NULL;
|
||||||
struct ucred *creds = NULL;
|
nm_auto_free unsigned char *buf = NULL;
|
||||||
|
|
||||||
continue_reading:
|
continue_reading:
|
||||||
|
g_clear_pointer (&buf, free);
|
||||||
|
g_clear_pointer (&creds, free);
|
||||||
errno = 0;
|
errno = 0;
|
||||||
n = nl_recv (sk, &nla, &buf, &creds);
|
n = nl_recv (sk, &nla, &buf, &creds);
|
||||||
|
|
||||||
@@ -5600,9 +5601,9 @@ continue_reading:
|
|||||||
|
|
||||||
hdr = (struct nlmsghdr *) buf;
|
hdr = (struct nlmsghdr *) buf;
|
||||||
while (nlmsg_ok (hdr, n)) {
|
while (nlmsg_ok (hdr, n)) {
|
||||||
|
nm_auto_nlmsg struct nl_msg *msg = NULL;
|
||||||
gboolean abort_parsing = FALSE;
|
gboolean abort_parsing = FALSE;
|
||||||
|
|
||||||
nlmsg_free (msg);
|
|
||||||
msg = nlmsg_convert (hdr);
|
msg = nlmsg_convert (hdr);
|
||||||
if (!msg) {
|
if (!msg) {
|
||||||
err = -NLE_NOMEM;
|
err = -NLE_NOMEM;
|
||||||
@@ -5611,13 +5612,13 @@ continue_reading:
|
|||||||
|
|
||||||
nlmsg_set_proto (msg, NETLINK_ROUTE);
|
nlmsg_set_proto (msg, NETLINK_ROUTE);
|
||||||
nlmsg_set_src (msg, &nla);
|
nlmsg_set_src (msg, &nla);
|
||||||
nrecv++;
|
|
||||||
|
|
||||||
if (!creds || creds->pid) {
|
if (!creds || creds->pid) {
|
||||||
if (creds)
|
if (creds)
|
||||||
_LOGD ("netlink: recvmsg: received non-kernel message (pid %d)", creds->pid);
|
_LOGT ("netlink: recvmsg: received non-kernel message (pid %d)", creds->pid);
|
||||||
else
|
else
|
||||||
_LOGD ("netlink: recvmsg: received message without credentials");
|
_LOGT ("netlink: recvmsg: received message without credentials");
|
||||||
|
err = 0;
|
||||||
goto stop;
|
goto stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5697,19 +5698,13 @@ continue_reading:
|
|||||||
}
|
}
|
||||||
|
|
||||||
event_seq_check (platform, msg, seq_result);
|
event_seq_check (platform, msg, seq_result);
|
||||||
err = 0;
|
|
||||||
hdr = nlmsg_next (hdr, &n);
|
|
||||||
|
|
||||||
if (abort_parsing)
|
if (abort_parsing)
|
||||||
goto out;
|
goto stop;
|
||||||
}
|
|
||||||
|
|
||||||
nlmsg_free (msg);
|
err = 0;
|
||||||
free (buf);
|
hdr = nlmsg_next (hdr, &n);
|
||||||
free (creds);
|
}
|
||||||
buf = NULL;
|
|
||||||
msg = NULL;
|
|
||||||
creds = NULL;
|
|
||||||
|
|
||||||
if (multipart) {
|
if (multipart) {
|
||||||
/* Multipart message not yet complete, continue reading */
|
/* Multipart message not yet complete, continue reading */
|
||||||
@@ -5722,18 +5717,9 @@ stop:
|
|||||||
* Repeat reading. */
|
* Repeat reading. */
|
||||||
goto continue_reading;
|
goto continue_reading;
|
||||||
}
|
}
|
||||||
err = 0;
|
|
||||||
out:
|
out:
|
||||||
nlmsg_free (msg);
|
|
||||||
free (buf);
|
|
||||||
free (creds);
|
|
||||||
|
|
||||||
if (interrupted)
|
if (interrupted)
|
||||||
err = -NLE_DUMP_INTR;
|
err = -NLE_DUMP_INTR;
|
||||||
|
|
||||||
if (!err)
|
|
||||||
err = nrecv;
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user