merge: branch 'jv/strv-checked'

create nm_strvarray_get_idxnull_or_greturn macro, use in libnm api

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1765
This commit is contained in:
Beniamino Galvani
2023-11-09 10:30:56 +00:00
3 changed files with 29 additions and 29 deletions

View File

@@ -808,21 +808,11 @@ nm_setting_connection_get_num_secondaries(NMSettingConnection *setting)
const char *
nm_setting_connection_get_secondary(NMSettingConnection *setting, guint32 idx)
{
NMSettingConnectionPrivate *priv;
guint secondaries_len;
g_return_val_if_fail(NM_IS_SETTING_CONNECTION(setting), NULL);
priv = NM_SETTING_CONNECTION_GET_PRIVATE(setting);
secondaries_len = nm_g_array_len(priv->secondaries.arr);
if (idx >= secondaries_len) {
/* access one past the length is OK. */
g_return_val_if_fail(idx == secondaries_len, NULL);
return NULL;
}
return nm_strvarray_get_idx(priv->secondaries.arr, idx);
return nm_strvarray_get_idxnull_or_greturn(
NM_SETTING_CONNECTION_GET_PRIVATE(setting)->secondaries.arr,
idx);
}
/**

View File

@@ -68,6 +68,8 @@ nm_setting_match_get_num_interface_names(NMSettingMatch *setting)
* @setting: the #NMSettingMatch
* @idx: index number of the DNS search domain to return
*
* Since 1.46, access at index "len" is allowed and returns NULL.
*
* Returns: the interface name at index @idx
*
* Since: 1.14
@@ -77,11 +79,7 @@ nm_setting_match_get_interface_name(NMSettingMatch *setting, int idx)
{
g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL);
g_return_val_if_fail(setting->interface_name.arr && idx >= 0
&& idx < setting->interface_name.arr->len,
NULL);
return nm_strvarray_get_idx(setting->interface_name.arr, idx);
return nm_strvarray_get_idxnull_or_greturn(setting->interface_name.arr, idx);
}
/**
@@ -213,6 +211,8 @@ nm_setting_match_get_num_kernel_command_lines(NMSettingMatch *setting)
* @setting: the #NMSettingMatch
* @idx: index number of the kernel command line argument to return
*
* Since 1.46, access at index "len" is allowed and returns NULL.
*
* Returns: the kernel command line argument at index @idx
*
* Since: 1.26
@@ -222,11 +222,7 @@ nm_setting_match_get_kernel_command_line(NMSettingMatch *setting, guint idx)
{
g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL);
g_return_val_if_fail(setting->kernel_command_line.arr
&& idx < setting->kernel_command_line.arr->len,
NULL);
return nm_strvarray_get_idx(setting->kernel_command_line.arr, idx);
return nm_strvarray_get_idxnull_or_greturn(setting->kernel_command_line.arr, idx);
}
/**
@@ -356,6 +352,8 @@ nm_setting_match_get_num_drivers(NMSettingMatch *setting)
* @setting: the #NMSettingMatch
* @idx: index number of the DNS search domain to return
*
* Since 1.46, access at index "len" is allowed and returns NULL.
*
* Returns: the driver at index @idx
*
* Since: 1.26
@@ -365,9 +363,7 @@ nm_setting_match_get_driver(NMSettingMatch *setting, guint idx)
{
g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL);
g_return_val_if_fail(setting->driver.arr && idx < setting->driver.arr->len, NULL);
return nm_strvarray_get_idx(setting->driver.arr, idx);
return nm_strvarray_get_idxnull_or_greturn(setting->driver.arr, idx);
}
/**
@@ -495,6 +491,8 @@ nm_setting_match_get_num_paths(NMSettingMatch *setting)
* @setting: the #NMSettingMatch
* @idx: index number of the path to return
*
* Since 1.46, access at index "len" is allowed and returns NULL.
*
* Returns: the path at index @idx
*
* Since: 1.26
@@ -504,9 +502,7 @@ nm_setting_match_get_path(NMSettingMatch *setting, guint idx)
{
g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL);
g_return_val_if_fail(setting->path.arr && idx < setting->path.arr->len, NULL);
return nm_strvarray_get_idx(setting->path.arr, idx);
return nm_strvarray_get_idxnull_or_greturn(setting->path.arr, idx);
}
/**

View File

@@ -3019,6 +3019,20 @@ nm_strvarray_get_idx(GArray *array, guint idx)
return nm_g_array_index(array, const char *, idx);
}
/* nm_strvarray_get_idxnull_or_greturn() permits access at `len`,
* returning NULL. If the access is out of bounds, the assertion
* will fail (and also return NULL). */
#define nm_strvarray_get_idxnull_or_greturn(arr, idx) \
({ \
GArray *_arr = (arr); \
gsize _idx = (idx); \
guint _len = nm_g_array_len(_arr); \
\
g_return_val_if_fail(_idx <= _len, NULL); \
\
_idx == _len ? NULL : nm_strvarray_get_idx(_arr, _idx); \
})
static inline const char *const *
nm_strvarray_get_strv_non_empty(GArray *arr, guint *length)
{