Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix coverity 1.3.8 #2007

Merged
merged 3 commits into from
Jul 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/OVAL/probes/unix/linux/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ endif()
if(OPENSCAP_PROBE_LINUX_SYSTEMDUNITDEPENDENCY OR OPENSCAP_PROBE_LINUX_SYSTEMDUNITPROPERTY)
list(APPEND LINUX_PROBES_SOURCES
"systemdshared.h"
"oval_dbus.c"
"oval_dbus.h"
)
list(APPEND LINUX_PROBES_INCLUDE_DIRECTORIES
${DBUS_INCLUDE_DIRS}
Expand All @@ -113,10 +115,17 @@ if(OPENSCAP_PROBE_LINUX_SYSTEMDUNITPROPERTY)
endif()

if(OPENSCAP_PROBE_LINUX_FWUPDSECURITYATTR)
list(APPEND LINUX_PROBES_SOURCES
"oval_dbus.c"
"oval_dbus.h"
)
list(APPEND LINUX_PROBES_SOURCES
"fwupdsecattr_probe.c"
"fwupdsecattr_probe.h"
)
list(APPEND LINUX_PROBES_INCLUDE_DIRECTORIES
${DBUS_INCLUDE_DIRS}
)
endif()


Expand Down
20 changes: 11 additions & 9 deletions src/OVAL/probes/unix/linux/fwupdsecattr_probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@
#include "probe/entcmp.h"
#include "common/debug_priv.h"

#include "oval_dbus.h"
#include "fwupdsecattr_probe.h"
#include "systemdshared.h"


static struct cachehed hsi_result_cache;
Expand Down Expand Up @@ -206,24 +206,26 @@ static int get_all_security_attributes(DBusConnection *conn, void(*callback)(cha

switch (arg_type) {
case DBUS_TYPE_UINT32:
if(strncmp(property_name, "HsiResult", strlen("HsiResult")) == 0) {
if(!strncmp(property_name, "HsiResult", strlen("HsiResult"))) {
_DBusBasicValue hsiresult_value;
dbus_message_iter_get_basic(&value_variant, &hsiresult_value);
hsi_flags = hsiresult_value.u32;
}
break;
case DBUS_TYPE_STRING:
if(!strncmp(property_name, "AppstreamId", strlen("AppstreamId"))) {
appstream_name = dbus_value_to_string(&value_variant);
free(appstream_name);
appstream_name = oval_dbus_value_to_string(&value_variant);
dD("Element string: %s", appstream_name);
}
break;
}
free(property_name);
} while (dbus_message_iter_next(&array_entry));
callback(appstream_name, hsi_flags);
}
while (dbus_message_iter_next(&property_iter));
free(appstream_name);
appstream_name = NULL;
} while (dbus_message_iter_next(&property_iter));

dbus_message_unref(msg); msg = NULL;
ret = 0;
Expand Down Expand Up @@ -315,27 +317,27 @@ int fwupdsecattr_probe_main(probe_ctx *ctx, void *arg)
DBusConnection *dbus_conn;

dbus_error_init(&dbus_error);
dbus_conn = connect_dbus();
dbus_conn = oval_connect_dbus();

if (dbus_conn == NULL) {
dbus_error_free(&dbus_error);
SEXP_t *msg = probe_msg_creat(OVAL_MESSAGE_LEVEL_INFO, "D-Bus connection failed, could not identify fwupd.");
probe_cobj_set_flag(probe_ctx_getresult(ctx), SYSCHAR_FLAG_ERROR);
probe_cobj_add_msg(probe_ctx_getresult(ctx), msg);
SEXP_free(msg);
return 0;
goto exit;
}

int res = get_all_security_attributes(dbus_conn, hsicache_callback, NULL);
disconnect_dbus(dbus_conn);
oval_disconnect_dbus(dbus_conn);

if (res) {
dbus_error_free(&dbus_error);
SEXP_t *msg = probe_msg_creat(OVAL_MESSAGE_LEVEL_INFO, "The fwupd service is not properly installed or configured.");
probe_cobj_set_flag(probe_ctx_getresult(ctx), SYSCHAR_FLAG_ERROR);
probe_cobj_add_msg(probe_ctx_getresult(ctx), msg);
SEXP_free(msg);
return 0;
goto exit;
}
}

Expand Down
161 changes: 161 additions & 0 deletions src/OVAL/probes/unix/linux/oval_dbus.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
/*
* Copyright 2023 Red Hat Inc., Durham, North Carolina.
* All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors:
* Evgenii Kolesnikov <ekolesni@redhat.com>
*/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <limits.h>
#include "common/util.h"
#include "oscap_helpers.h"
#include "common/debug_priv.h"
#include "oval_dbus.h"


char *oval_dbus_value_to_string(DBusMessageIter *iter)
{
const int arg_type = dbus_message_iter_get_arg_type(iter);
if (dbus_type_is_basic(arg_type)) {
_DBusBasicValue value;
dbus_message_iter_get_basic(iter, &value);

switch (arg_type)
{
case DBUS_TYPE_BYTE:
return oscap_sprintf("%c", value.byt);

case DBUS_TYPE_BOOLEAN:
return oscap_strdup(value.bool_val ? "true" : "false");

case DBUS_TYPE_INT16:
return oscap_sprintf("%i", value.i16);

case DBUS_TYPE_UINT16:
return oscap_sprintf("%u", value.u16);

case DBUS_TYPE_INT32:
return oscap_sprintf("%i", value.i32);

case DBUS_TYPE_UINT32:
return oscap_sprintf("%u", value.u32);

#ifdef DBUS_HAVE_INT64
case DBUS_TYPE_INT64:
return oscap_sprintf("%li", value.i64);

case DBUS_TYPE_UINT64:
return oscap_sprintf("%lu", value.u64);
#endif

case DBUS_TYPE_DOUBLE:
return oscap_sprintf("%g", value.dbl);

case DBUS_TYPE_STRING:
case DBUS_TYPE_OBJECT_PATH:
case DBUS_TYPE_SIGNATURE:
return oscap_strdup(value.str);

// We skip non-basic types for now
//case DBUS_TYPE_ARRAY:
//case DBUS_TYPE_STRUCT:
//case DBUS_TYPE_DICT_ENTRY:
//case DBUS_TYPE_VARIANT:
//case DBUS_TYPE_UNIX_FD:
// return oscap_sprintf("%i", value.fd);

default:
dD("Encountered unknown D-Bus basic type: %d!", arg_type);
return oscap_strdup("error, unknown basic type!");
}
} else if (arg_type == DBUS_TYPE_ARRAY) {
DBusMessageIter array;
dbus_message_iter_recurse(iter, &array);

char *ret = NULL;
do {
char *element = oval_dbus_value_to_string(&array);

if (element == NULL)
continue;

char *old_ret = ret;
if (old_ret == NULL)
ret = oscap_sprintf("%s", element);
else
ret = oscap_sprintf("%s, %s", old_ret, element);

free(old_ret);
free(element);
}
while (dbus_message_iter_next(&array));

return ret;
}

return NULL;
}

DBusConnection *oval_connect_dbus(void)
{
DBusConnection *conn = NULL;

DBusError err;
dbus_error_init(&err);

const char *prefix = getenv("OSCAP_PROBE_ROOT");
if (prefix != NULL) {
char dbus_address[PATH_MAX] = {0};
snprintf(dbus_address, PATH_MAX, "unix:path=%s/run/dbus/system_bus_socket", prefix);
setenv("DBUS_SYSTEM_BUS_ADDRESS", dbus_address, 0);
/* We won't overwrite DBUS_SYSTEM_BUS_ADDRESS so that
* user could have a way to define some non-standard system bus socket location */
}

conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
if (dbus_error_is_set(&err)) {
dD("Failed to get DBUS_BUS_SYSTEM connection - %s", err.message);
goto cleanup;
}
if (conn == NULL) {
dD("DBusConnection == NULL!");
goto cleanup;
}

dbus_bus_register(conn, &err);
if (dbus_error_is_set(&err)) {
dD("Failed to register on dbus - %s", err.message);
goto cleanup;
}

cleanup:
dbus_error_free(&err);

return conn;
}

void oval_disconnect_dbus(DBusConnection *conn)
{
// NOOP

// Connections retrieved via dbus_bus_get shall not be destroyed,
// these connections are shared.
}
65 changes: 65 additions & 0 deletions src/OVAL/probes/unix/linux/oval_dbus.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright 2023 Red Hat Inc., Durham, North Carolina.
* All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors:
* Evgenii Kolesnikov <ekolesni@redhat.com>
*/

#ifndef OPENSCAP_OVAL_DBUS_H_
#define OPENSCAP_OVAL_DBUS_H_

#include <dbus/dbus.h>


// Old versions of libdbus API don't have DBusBasicValue and DBus8ByteStruct
// as a public typedefs.
// These two typedefs were copied from libdbus 1.8 branch, see
// http://cgit.freedesktop.org/dbus/dbus/tree/dbus/dbus-types.h?h=dbus-1.8#n137
typedef struct
{
dbus_uint32_t first32;
dbus_uint32_t second32;
} _DBus8ByteStruct;

typedef union
{
unsigned char bytes[8]; /**< as 8 individual bytes */
dbus_int16_t i16; /**< as int16 */
dbus_uint16_t u16; /**< as int16 */
dbus_int32_t i32; /**< as int32 */
dbus_uint32_t u32; /**< as int32 */
dbus_bool_t bool_val; /**< as boolean */
#ifdef DBUS_HAVE_INT64
dbus_int64_t i64; /**< as int64 */
dbus_uint64_t u64; /**< as int64 */
#endif
_DBus8ByteStruct eight; /**< as 8-byte struct */
double dbl; /**< as double */
unsigned char byt; /**< as byte */
char *str; /**< as char* (string, object path or signature) */
int fd; /**< as Unix file descriptor */
} _DBusBasicValue;


char *oval_dbus_value_to_string(DBusMessageIter *iter);

DBusConnection *oval_connect_dbus(void);

void oval_disconnect_dbus(DBusConnection *conn);

#endif
Loading