#include <signal.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/random.h>
#include <sys/types.h>
#include <sys/vfs.h>
#include <time.h>
NULL,
};
+static char random_character() {
+ static char characters[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789";
+
+ int random;
+
+ int r = getrandom(&random, sizeof(random), GRND_NONBLOCK);
+ if (r != sizeof(random))
+ return -1;
+
+ return characters[random % sizeof(characters)];
+}
+
+int pakfire_cgroup_random_name(char* template) {
+ for (int i = strlen(template) - 1; i > 0 && template[i] == 'X'; i--) {
+ char c = random_character();
+ if (c < 0)
+ return 1;
+
+ template[i] = c;
+ }
+
+ return 0;
+}
+
/*
Returns the name of the parent group
*/
DEBUG(pakfire, "Execution environment has been forked as PID %d\n", getpid());
DEBUG(pakfire, " root : %s\n", root);
+ DEBUG(pakfire, " cgroup : %s\n", env->cgroup);
for (unsigned int i = 0; env->argv[i]; i++)
DEBUG(pakfire, " argv[%u] : %s\n", i, env->argv[i]);
.pakfire = pakfire,
.argv = argv,
.envp = envp,
+ .cgroup = "pakfire/execute-XXXXXX",
};
- // Make cgroup name
- snprintf(env.cgroup, sizeof(env.cgroup) - 1, "%s", "pakfire/execute-XXXXXX");
-
// argv is invalid
if (!argv || !argv[0])
return -EINVAL;
}
}
+ // Make cgroup name
+ int r = pakfire_cgroup_random_name(env.cgroup);
+ if (r)
+ goto ERROR;
+
// Create cgroup
- int r = pakfire_cgroup_create(pakfire, env.cgroup);
+ r = pakfire_cgroup_create(pakfire, env.cgroup);
if (r)
goto ERROR;
#include <pakfire/types.h>
+int pakfire_cgroup_random_name(char* template);
+
int pakfire_cgroup_create(Pakfire pakfire, const char* group);
int pakfire_cgroup_destroy(Pakfire pakfire, const char* group);
);
}
+static int test_random_name(const struct test* t) {
+ char name1[] = "pakfire/execute-XXXXXX";
+ char name2[] = "pakfire/execute-XXXXXX";
+
+ ASSERT_SUCCESS(pakfire_cgroup_random_name(name1));
+ ASSERT_SUCCESS(pakfire_cgroup_random_name(name2));
+
+ // Make sure we got different results
+ ASSERT_STRING_NOT_EQUALS(name1, name2);
+
+ return EXIT_SUCCESS;
+}
+
int main(int argc, char** argv) {
testsuite_add_test(test_create_and_destroy);
testsuite_add_test(test_attach);
testsuite_add_test(test_killall);
testsuite_add_test(test_cpustat);
+ testsuite_add_test(test_random_name);
return testsuite_run();
}
} \
} while (0)
+#define ASSERT_STRING_NOT_EQUALS(value1, value2) \
+ do { \
+ if (strcmp(value1, value2) == 0) { \
+ LOG_ERROR("Failed assertion: " #value1 " (%s) != " #value2 " (%s) %s:%d %s\n", \
+ value1, value2, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
+ return EXIT_FAILURE; \
+ } \
+ } while (0)
+
#define ASSERT_STRING_STARTSWITH(string, start) \
do { \
if (strncmp(string, start, strlen(start)) != 0) { \