typedef int (*__libpam_pam_acct_mgmt)(pam_handle_t *pamh, int flags);
+typedef int (*__libpam_pam_putenv)(pam_handle_t *pamh, const char *name_value);
+
+typedef const char * (*__libpam_pam_getenv)(pam_handle_t *pamh, const char *name);
+
+typedef char ** (*__libpam_pam_getenvlist)(pam_handle_t *pamh);
+
#define PWRAP_SYMBOL_ENTRY(i) \
union { \
__libpam_##i f; \
PWRAP_SYMBOL_ENTRY(pam_end);
PWRAP_SYMBOL_ENTRY(pam_authenticate);
PWRAP_SYMBOL_ENTRY(pam_acct_mgmt);
+ PWRAP_SYMBOL_ENTRY(pam_putenv);
+ PWRAP_SYMBOL_ENTRY(pam_getenv);
+ PWRAP_SYMBOL_ENTRY(pam_getenvlist);
};
struct pwrap {
return pwrap.libpam.symbols._libpam_pam_acct_mgmt.f(pamh, flags);
}
+static int libpam_pam_putenv(pam_handle_t *pamh, const char *name_value)
+{
+ pwrap_bind_symbol_libpam(pam_putenv);
+
+ return pwrap.libpam.symbols._libpam_pam_putenv.f(pamh, name_value);
+}
+
+static const char *libpam_pam_getenv(pam_handle_t *pamh, const char *name)
+{
+ pwrap_bind_symbol_libpam(pam_getenv);
+
+ return pwrap.libpam.symbols._libpam_pam_getenv.f(pamh, name);
+}
+
+static char **libpam_pam_getenvlist(pam_handle_t *pamh)
+{
+ pwrap_bind_symbol_libpam(pam_getenvlist);
+
+ return pwrap.libpam.symbols._libpam_pam_getenvlist.f(pamh);
+}
+
/*********************************************************
* PWRAP INIT
*********************************************************/
return pwrap_pam_acct_mgmt(pamh, flags);
}
+static int pwrap_pam_putenv(pam_handle_t *pamh, const char *name_value)
+{
+ PWRAP_LOG(PWRAP_LOG_TRACE, "pwrap_putenv name_value=%s", name_value);
+ return libpam_pam_putenv(pamh, name_value);
+}
+
+int pam_putenv(pam_handle_t *pamh, const char *name_value)
+{
+ return pwrap_pam_putenv(pamh, name_value);
+}
+
+static const char *pwrap_pam_getenv(pam_handle_t *pamh, const char *name)
+{
+ PWRAP_LOG(PWRAP_LOG_TRACE, "pwrap_getenv name=%s", name);
+ return libpam_pam_getenv(pamh, name);
+}
+
+const char *pam_getenv(pam_handle_t *pamh, const char *name)
+{
+ return pwrap_pam_getenv(pamh, name);
+}
+
+static char **pwrap_pam_getenvlist(pam_handle_t *pamh)
+{
+ PWRAP_LOG(PWRAP_LOG_TRACE, "pwrap_getenvlist called");
+ return libpam_pam_getenvlist(pamh);
+}
+
+char **pam_getenvlist(pam_handle_t *pamh)
+{
+ return pwrap_pam_getenvlist(pamh);
+}
+
/****************************
* DESTRUCTOR
***************************/
assert_int_equal(rv, PAM_PERM_DENIED);
}
+static inline void free_vlist(char **vlist)
+{
+ free(vlist[0]);
+ free(vlist[1]);
+ free(vlist);
+}
+
+static void test_pam_env_functions(void **state)
+{
+ int rv;
+ const char *v;
+ char **vlist;
+ struct pwrap_test_ctx *test_ctx;
+
+ test_ctx = (struct pwrap_test_ctx *) *state;
+
+ rv = pam_putenv(test_ctx->ph, "KEY=value");
+ assert_int_equal(rv, PAM_SUCCESS);
+ rv = pam_putenv(test_ctx->ph, "KEY2=value2");
+ assert_int_equal(rv, PAM_SUCCESS);
+
+ v = pam_getenv(test_ctx->ph, "KEY");
+ assert_non_null(v);
+ assert_string_equal(v, "value");
+
+ v = pam_getenv(test_ctx->ph, "KEY2");
+ assert_non_null(v);
+ assert_string_equal(v, "value2");
+
+ vlist = pam_getenvlist(test_ctx->ph);
+ assert_non_null(vlist);
+ assert_non_null(vlist[0]);
+ assert_string_equal(vlist[0], "KEY=value");
+ assert_non_null(vlist[1]);
+ assert_string_equal(vlist[1], "KEY2=value2");
+ assert_null(vlist[2]);
+ free_vlist(vlist);
+
+ rv = pam_putenv(test_ctx->ph, "KEY2=");
+ assert_int_equal(rv, PAM_SUCCESS);
+
+ vlist = pam_getenvlist(test_ctx->ph);
+ assert_non_null(vlist);
+ assert_non_null(vlist[0]);
+ assert_string_equal(vlist[0], "KEY=value");
+ assert_non_null(vlist[1]);
+ assert_string_equal(vlist[1], "KEY2=");
+ assert_null(vlist[2]);
+ free_vlist(vlist);
+
+ rv = pam_putenv(test_ctx->ph, "KEY2");
+ assert_int_equal(rv, PAM_SUCCESS);
+
+ vlist = pam_getenvlist(test_ctx->ph);
+ assert_non_null(vlist);
+ assert_non_null(vlist[0]);
+ assert_string_equal(vlist[0], "KEY=value");
+ assert_null(vlist[1]);
+ free_vlist(vlist);
+}
int main(void) {
int rc;
cmocka_unit_test_setup_teardown(test_pam_acct_err,
setup_simple,
teardown),
+ cmocka_unit_test_setup_teardown(test_pam_env_functions,
+ setup,
+ teardown),
};
rc = cmocka_run_group_tests(init_tests, NULL, NULL);