summaryrefslogtreecommitdiffstats
path: root/libmount/src/context.c
diff options
context:
space:
mode:
authorKarel Zak2013-04-12 12:35:34 +0200
committerKarel Zak2013-04-12 12:35:34 +0200
commit4569bbeab783632c81ee14793da84b3e29444543 (patch)
treeb165e3f418600bef11edbd962bc7f76b9d95113f /libmount/src/context.c
parentbuild-sys: release++ (v2.23-rc2) (diff)
downloadkernel-qcow2-util-linux-4569bbeab783632c81ee14793da84b3e29444543.tar.gz
kernel-qcow2-util-linux-4569bbeab783632c81ee14793da84b3e29444543.tar.xz
kernel-qcow2-util-linux-4569bbeab783632c81ee14793da84b3e29444543.zip
libmount: fix mount.nfs segfault, rely on assert() rather than on nonnull
We use mnt_optstr_append_option(&o, mnt_fs_get_vfs_options(fs), NULL); in mount.nfs, unfortunately mnt_optstr_append_option() has been marked ass nonnull(1, 2). That's wrong because append and prepend should robust enough to accept NULL as option name. The patch also removes almost all __attribute__((nonnull). It seems better to rely on assert() to have usable feedback. In many cases (nonnull) is premature optimization for the library. This attribute makes sense for things like strlen() or so... Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=948274 Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount/src/context.c')
-rw-r--r--libmount/src/context.c55
1 files changed, 49 insertions, 6 deletions
diff --git a/libmount/src/context.c b/libmount/src/context.c
index 614d3f3b5..38f80de7a 100644
--- a/libmount/src/context.c
+++ b/libmount/src/context.c
@@ -196,6 +196,7 @@ int mnt_reset_context(struct libmnt_context *cxt)
*/
int mnt_context_reset_status(struct libmnt_context *cxt)
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
@@ -207,6 +208,7 @@ int mnt_context_reset_status(struct libmnt_context *cxt)
static int set_flag(struct libmnt_context *cxt, int flag, int enable)
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
if (enable) {
@@ -227,7 +229,6 @@ static int set_flag(struct libmnt_context *cxt, int flag, int enable)
*/
int mnt_context_is_restricted(struct libmnt_context *cxt)
{
- assert(cxt);
return cxt->restricted;
}
@@ -270,6 +271,7 @@ int mnt_context_is_restricted(struct libmnt_context *cxt)
*/
int mnt_context_set_optsmode(struct libmnt_context *cxt, int mode)
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
cxt->optsmode = mode;
@@ -285,6 +287,7 @@ int mnt_context_set_optsmode(struct libmnt_context *cxt, int mode)
int mnt_context_get_optsmode(struct libmnt_context *cxt)
{
+ assert(cxt);
return cxt->optsmode;
}
@@ -663,6 +666,7 @@ int mnt_context_set_fs(struct libmnt_context *cxt, struct libmnt_fs *fs)
*/
struct libmnt_fs *mnt_context_get_fs(struct libmnt_context *cxt)
{
+ assert(cxt);
if (!cxt)
return NULL;
if (!cxt->fs) {
@@ -681,6 +685,7 @@ struct libmnt_fs *mnt_context_get_fs(struct libmnt_context *cxt)
*/
int mnt_context_set_source(struct libmnt_context *cxt, const char *source)
{
+ assert(cxt);
return mnt_fs_set_source(mnt_context_get_fs(cxt), source);
}
@@ -692,6 +697,7 @@ int mnt_context_set_source(struct libmnt_context *cxt, const char *source)
*/
const char *mnt_context_get_source(struct libmnt_context *cxt)
{
+ assert(cxt);
return mnt_fs_get_source(mnt_context_get_fs(cxt));
}
@@ -704,6 +710,7 @@ const char *mnt_context_get_source(struct libmnt_context *cxt)
*/
int mnt_context_set_target(struct libmnt_context *cxt, const char *target)
{
+ assert(cxt);
return mnt_fs_set_target(mnt_context_get_fs(cxt), target);
}
@@ -715,6 +722,7 @@ int mnt_context_set_target(struct libmnt_context *cxt, const char *target)
*/
const char *mnt_context_get_target(struct libmnt_context *cxt)
{
+ assert(cxt);
return mnt_fs_get_target(mnt_context_get_fs(cxt));
}
@@ -731,6 +739,7 @@ const char *mnt_context_get_target(struct libmnt_context *cxt)
*/
int mnt_context_set_fstype(struct libmnt_context *cxt, const char *fstype)
{
+ assert(cxt);
return mnt_fs_set_fstype(mnt_context_get_fs(cxt), fstype);
}
@@ -742,6 +751,7 @@ int mnt_context_set_fstype(struct libmnt_context *cxt, const char *fstype)
*/
const char *mnt_context_get_fstype(struct libmnt_context *cxt)
{
+ assert(cxt);
return mnt_fs_get_fstype(mnt_context_get_fs(cxt));
}
@@ -754,6 +764,7 @@ const char *mnt_context_get_fstype(struct libmnt_context *cxt)
*/
int mnt_context_set_options(struct libmnt_context *cxt, const char *optstr)
{
+ assert(cxt);
return mnt_fs_set_options(mnt_context_get_fs(cxt), optstr);
}
@@ -766,6 +777,7 @@ int mnt_context_set_options(struct libmnt_context *cxt, const char *optstr)
*/
int mnt_context_append_options(struct libmnt_context *cxt, const char *optstr)
{
+ assert(cxt);
return mnt_fs_append_options(mnt_context_get_fs(cxt), optstr);
}
@@ -784,6 +796,7 @@ int mnt_context_append_options(struct libmnt_context *cxt, const char *optstr)
*/
const char *mnt_context_get_options(struct libmnt_context *cxt)
{
+ assert(cxt);
return mnt_fs_get_options(mnt_context_get_fs(cxt));
}
@@ -800,6 +813,7 @@ int mnt_context_set_fstype_pattern(struct libmnt_context *cxt, const char *patte
{
char *p = NULL;
+ assert(cxt);
if (!cxt)
return -EINVAL;
if (pattern) {
@@ -825,6 +839,7 @@ int mnt_context_set_options_pattern(struct libmnt_context *cxt, const char *patt
{
char *p = NULL;
+ assert(cxt);
if (!cxt)
return -EINVAL;
if (pattern) {
@@ -856,6 +871,7 @@ int mnt_context_set_options_pattern(struct libmnt_context *cxt, const char *patt
*/
int mnt_context_set_fstab(struct libmnt_context *cxt, struct libmnt_table *tb)
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
if (!(cxt->flags & MNT_FL_EXTERN_FSTAB))
@@ -879,9 +895,9 @@ int mnt_context_get_fstab(struct libmnt_context *cxt, struct libmnt_table **tb)
{
struct libmnt_cache *cache;
+ assert(cxt);
if (!cxt)
return -EINVAL;
-
if (!cxt->fstab) {
int rc;
@@ -921,9 +937,9 @@ int mnt_context_get_mtab(struct libmnt_context *cxt, struct libmnt_table **tb)
{
struct libmnt_cache *cache;
+ assert(cxt);
if (!cxt)
return -EINVAL;
-
if (!cxt->mtab) {
int rc;
@@ -962,6 +978,7 @@ int mnt_context_set_tabfilter(struct libmnt_context *cxt,
int (*fltr)(struct libmnt_fs *, void *),
void *data)
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
@@ -1002,6 +1019,8 @@ int mnt_context_get_table(struct libmnt_context *cxt,
struct libmnt_cache *cache;
int rc;
+ assert(cxt);
+ assert(tb);
if (!cxt || !tb)
return -EINVAL;
@@ -1042,6 +1061,7 @@ int mnt_context_get_table(struct libmnt_context *cxt,
int mnt_context_set_tables_errcb(struct libmnt_context *cxt,
int (*cb)(struct libmnt_table *tb, const char *filename, int line))
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
@@ -1085,6 +1105,7 @@ int mnt_context_set_cache(struct libmnt_context *cxt, struct libmnt_cache *cache
*/
struct libmnt_cache *mnt_context_get_cache(struct libmnt_context *cxt)
{
+ assert(cxt);
if (!cxt || mnt_context_is_nocanonicalize(cxt))
return NULL;
@@ -1112,9 +1133,9 @@ int mnt_context_set_passwd_cb(struct libmnt_context *cxt,
char *(*get)(struct libmnt_context *),
void (*release)(struct libmnt_context *, char *))
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
-
cxt->pwd_get_cb = get;
cxt->pwd_release_cb = release;
return 0;
@@ -1142,6 +1163,7 @@ int mnt_context_set_passwd_cb(struct libmnt_context *cxt,
*/
struct libmnt_lock *mnt_context_get_lock(struct libmnt_context *cxt)
{
+ assert(cxt);
/*
* DON'T call this function within libmount, it will always allocate
* the lock. The mnt_update_* functions are able to allocate the lock
@@ -1181,6 +1203,7 @@ struct libmnt_lock *mnt_context_get_lock(struct libmnt_context *cxt)
*/
int mnt_context_set_mflags(struct libmnt_context *cxt, unsigned long flags)
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
@@ -1213,6 +1236,8 @@ int mnt_context_get_mflags(struct libmnt_context *cxt, unsigned long *flags)
int rc = 0;
struct list_head *p;
+ assert(cxt);
+ assert(flags);
if (!cxt || !flags)
return -EINVAL;
@@ -1249,6 +1274,7 @@ int mnt_context_get_mflags(struct libmnt_context *cxt, unsigned long *flags)
*/
int mnt_context_set_user_mflags(struct libmnt_context *cxt, unsigned long flags)
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
cxt->user_mountflags = flags;
@@ -1268,6 +1294,9 @@ int mnt_context_set_user_mflags(struct libmnt_context *cxt, unsigned long flags)
int mnt_context_get_user_mflags(struct libmnt_context *cxt, unsigned long *flags)
{
int rc = 0;
+
+ assert(cxt);
+ assert(flags);
if (!cxt || !flags)
return -EINVAL;
@@ -1299,6 +1328,7 @@ int mnt_context_get_user_mflags(struct libmnt_context *cxt, unsigned long *flags
*/
int mnt_context_set_mountdata(struct libmnt_context *cxt, void *data)
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
cxt->mountdata = data;
@@ -1908,6 +1938,7 @@ int mnt_context_apply_fstab(struct libmnt_context *cxt)
*/
int mnt_context_tab_applied(struct libmnt_context *cxt)
{
+ assert(cxt);
return cxt->flags & MNT_FL_TAB_APPLIED;
}
@@ -1949,6 +1980,7 @@ int mnt_context_propagation_only(struct libmnt_context *cxt)
*/
int mnt_context_get_status(struct libmnt_context *cxt)
{
+ assert(cxt);
return !cxt->syscall_status || !cxt->helper_exec_status;
}
@@ -1960,6 +1992,7 @@ int mnt_context_get_status(struct libmnt_context *cxt)
*/
int mnt_context_helper_executed(struct libmnt_context *cxt)
{
+ assert(cxt);
return cxt->helper_exec_status != 1;
}
@@ -1972,6 +2005,7 @@ int mnt_context_helper_executed(struct libmnt_context *cxt)
*/
int mnt_context_get_helper_status(struct libmnt_context *cxt)
{
+ assert(cxt);
return cxt->helper_status;
}
@@ -1983,6 +2017,7 @@ int mnt_context_get_helper_status(struct libmnt_context *cxt)
*/
int mnt_context_syscall_called(struct libmnt_context *cxt)
{
+ assert(cxt);
return cxt->syscall_status != 1;
}
@@ -1997,9 +2032,9 @@ int mnt_context_syscall_called(struct libmnt_context *cxt)
*/
int mnt_context_get_syscall_errno(struct libmnt_context *cxt)
{
+ assert(cxt);
if (cxt->syscall_status < 0)
return -cxt->syscall_status;
-
return 0;
}
@@ -2017,6 +2052,7 @@ int mnt_context_get_syscall_errno(struct libmnt_context *cxt)
*/
int mnt_context_set_syscall_status(struct libmnt_context *cxt, int status)
{
+ assert(cxt);
if (!cxt)
return -EINVAL;
@@ -2063,8 +2099,11 @@ int mnt_context_strerror(struct libmnt_context *cxt __attribute__((__unused__)),
int mnt_context_init_helper(struct libmnt_context *cxt, int action,
int flags __attribute__((__unused__)))
{
- int rc = mnt_context_disable_helpers(cxt, TRUE);
+ int rc;
+ assert(cxt);
+
+ rc = mnt_context_disable_helpers(cxt, TRUE);
if (!rc)
rc = set_flag(cxt, MNT_FL_HELPER, 1);
if (!rc)
@@ -2115,6 +2154,7 @@ int mnt_context_is_fs_mounted(struct libmnt_context *cxt,
struct libmnt_table *mtab;
int rc;
+ assert(cxt);
if (!cxt || !fs || !mounted)
return -EINVAL;
@@ -2130,6 +2170,7 @@ static int mnt_context_add_child(struct libmnt_context *cxt, pid_t pid)
{
pid_t *pids;
+ assert(cxt);
if (!cxt)
return -EINVAL;
@@ -2149,6 +2190,7 @@ int mnt_fork_context(struct libmnt_context *cxt)
int rc = 0;
pid_t pid;
+ assert(cxt);
if (!mnt_context_is_parent(cxt))
return -EINVAL;
@@ -2182,6 +2224,7 @@ int mnt_context_wait_for_children(struct libmnt_context *cxt,
{
int i;
+ assert(cxt);
if (!cxt)
return -EINVAL;