From: Ben Pfaff Date: Fri, 8 Apr 2011 23:37:22 +0000 (-0700) Subject: dpif-linux: Avoid segfault on netdev_get_stats() without kernel module. X-Git-Tag: v1.1.1~45 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=8996f83642d6bd73a72d5864a1c6a66448b49214 dpif-linux: Avoid segfault on netdev_get_stats() without kernel module. netdev_linux_get_stats() calls into netdev_vport_get_stats(), which in turn attempts a transaction on genl_sock. If the kernel module isn't loaded, then genl_sock won't be there, and in any case there's nothing that guarantees that it's been initialized yet. This fixes the problem by ensuring that dpif_linux was initialized properly before attempting a transaction on genl_sock. Reported-by: Aaron Rosen --- diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c index 75cff0c43..fd08e6402 100644 --- a/lib/dpif-linux.c +++ b/lib/dpif-linux.c @@ -1254,6 +1254,15 @@ dpif_linux_vport_transact(const struct dpif_linux_vport *request, assert((reply != NULL) == (bufp != NULL)); + error = dpif_linux_init(); + if (error) { + if (reply) { + *bufp = NULL; + dpif_linux_vport_init(reply); + } + return error; + } + request_buf = ofpbuf_new(1024); dpif_linux_vport_to_ofpbuf(request, request_buf); error = nl_sock_transact(genl_sock, request_buf, bufp);