iSulad/0006-ensure-isula-exec-inherits-the-config-of-create.patch
zhangxiaoyu 0fe88d116c upgrade from upstream
Signed-off-by: zhangxiaoyu <zhangxiaoyu58@huawei.com>
(cherry picked from commit d5491fea9ae065ee392984598d2f8cfeafb44a62)
2023-02-22 15:59:30 +08:00

138 lines
5.2 KiB
Diff

From d1960a64b04888f21173f5c4bb4993c86553f417 Mon Sep 17 00:00:00 2001
From: zhongtao <zhongtao17@huawei.com>
Date: Thu, 2 Feb 2023 06:49:03 +0800
Subject: [PATCH 06/19] ensure isula exec inherits the config of create.
Signed-off-by: zhongtao <zhongtao17@huawei.com>
---
.../modules/service/service_container.c | 73 ++++++++++++++++---
1 file changed, 63 insertions(+), 10 deletions(-)
diff --git a/src/daemon/modules/service/service_container.c b/src/daemon/modules/service/service_container.c
index 58c43476..340dea07 100644
--- a/src/daemon/modules/service/service_container.c
+++ b/src/daemon/modules/service/service_container.c
@@ -1755,8 +1755,34 @@ out:
return ret;
}
+static int append_rlimit_from_oci_spec(defs_process *spec, const oci_runtime_spec *oci_spec)
+{
+ size_t j;
+
+ spec->rlimits = (defs_process_rlimits_element **)util_smart_calloc_s(sizeof(defs_process_rlimits_element *),
+ (size_t)oci_spec->process->rlimits_len);
+ if (spec->rlimits == NULL) {
+ ERROR("Out of memory");
+ return -1;
+ }
+
+ for (j = 0; j < oci_spec->process->rlimits_len; j++) {
+ spec->rlimits[j] = util_common_calloc_s(sizeof(defs_process_rlimits_element));
+ if (spec->rlimits[j] == NULL) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ spec->rlimits[j]->type = util_strdup_s(oci_spec->process->rlimits[j]->type);
+ spec->rlimits[j]->hard = oci_spec->process->rlimits[j]->hard;
+ spec->rlimits[j]->soft = oci_spec->process->rlimits[j]->soft;
+ spec->rlimits_len++;
+ }
+
+ return 0;
+}
+
static defs_process *make_exec_process_spec(const container_config *container_spec, defs_process_user *puser,
- const char *runtime, const container_exec_request *request)
+ const char *runtime, const container_exec_request *request, const oci_runtime_spec *oci_spec)
{
int ret = 0;
defs_process *spec = NULL;
@@ -1767,25 +1793,38 @@ static defs_process *make_exec_process_spec(const container_config *container_sp
}
if (strcasecmp(runtime, "lcr") != 0) {
+ // for oci runtime:
+ // step 1: merge env from container;
ret = merge_exec_from_container_env(spec, container_spec);
if (ret != 0) {
ERROR("Failed to dup args for exec process spec");
goto err_out;
}
- }
-
- ret = merge_envs_from_request_env(spec, (const char **)request->env, request->env_len);
- if (ret != 0) {
- ERROR("Failed to dup args for exec process spec");
- goto err_out;
- }
- if (strcasecmp(runtime, "lcr") != 0) {
+ // step 2: merge process env including PATH, HOATNAME and TERM(if tty is true);
ret = append_necessary_process_env(request->tty, container_spec, spec);
if (ret != 0) {
ERROR("Failed to append necessary for exec process spec");
goto err_out;
}
+
+ ret = append_rlimit_from_oci_spec(spec, oci_spec);
+ if (ret != 0) {
+ ERROR("Failed to append rlimit for exec process spec");
+ goto err_out;
+ }
+
+ spec->no_new_privileges = oci_spec->process->no_new_privileges;
+ }
+
+ // for oci runtime:
+ // step 3 : Finally, merge env from request to ensure that the env in the request is not overwritten;
+ // for lcr:
+ // since the container env and the process env have been stored in the config file, lcr only needs to merge the env in the request.
+ ret = merge_envs_from_request_env(spec, (const char **)request->env, request->env_len);
+ if (ret != 0) {
+ ERROR("Failed to dup args for exec process spec");
+ goto err_out;
}
ret = util_dup_array_of_strings((const char **)request->argv, request->argv_len, &(spec->args), &(spec->args_len));
@@ -1822,6 +1861,8 @@ static int do_exec_container(const container_t *cont, const char *runtime, char
char *engine_log_path = NULL;
char *loglevel = NULL;
char *logdriver = NULL;
+ const char *id = cont->common_config->id;
+ oci_runtime_spec *oci_spec = NULL;
defs_process *process_spec = NULL;
rt_exec_params_t params = { 0 };
@@ -1844,7 +1885,18 @@ static int do_exec_container(const container_t *cont, const char *runtime, char
goto out;
}
- process_spec = make_exec_process_spec(cont->common_config->config, puser, runtime, request);
+ // lcr reads the config from the file and will not lose it.
+ // so there is no need to get the config from oci_spec.
+ if (strcasecmp(runtime, "lcr") != 0) {
+ oci_spec = load_oci_config(cont->root_path, id);
+ if (oci_spec == NULL) {
+ ERROR("Failed to load oci config");
+ ret = -1;
+ goto out;
+ }
+ }
+
+ process_spec = make_exec_process_spec(cont->common_config->config, puser, runtime, request, oci_spec);
if (process_spec == NULL) {
ERROR("Exec: Failed to make process spec");
ret = -1;
@@ -1873,6 +1925,7 @@ out:
free(engine_log_path);
free(logdriver);
free_defs_process(process_spec);
+ free_oci_runtime_spec(oci_spec);
return ret;
}
--
2.25.1