diff --git a/src/include/66/service.h b/src/include/66/service.h index fe26e010d2453214dd21e0c884501c8f8cd399e7..bfb1381246c6f0a249ccf972044e700c4bd000cf 100644 --- a/src/include/66/service.h +++ b/src/include/66/service.h @@ -305,7 +305,8 @@ extern int service_cmp_basedir(char const *dir) ; extern int service_endof_dir(char const *dir, char const *name) ; extern int service_frontend_path(stralloc *sasrc,char const *sv, uid_t owner,char const *directory_forced, char const **exclude) ; extern int service_frontend_src(stralloc *sasrc, char const *name, char const *src, char const **exclude) ; -extern int service_is_g(char *atree, char const *name, uint32_t flag) ; +extern int service_is_g(char const *name, uint32_t flag) ; +extern int service_get_treename(char *atree, char const *name, uint32_t flag) ; extern void service_resolve_array_free(resolve_service_t *ares, unsigned int areslen) ; extern int service_resolve_array_search(resolve_service_t *ares, unsigned int areslen, char const *name) ; extern int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res) ; diff --git a/src/lib66/exec/ssexec_env.c b/src/lib66/exec/ssexec_env.c index d0cb5f2e4e315577539bb13058d0b66ac7f92aec..b4fbd8bcb6699e31cde3d77e2fd88b688271389e 100644 --- a/src/lib66/exec/ssexec_env.c +++ b/src/lib66/exec/ssexec_env.c @@ -218,8 +218,6 @@ int ssexec_env(int argc, char const *const *argv, ssexec_t *info) resolve_service_t res = RESOLVE_SERVICE_ZERO ; resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; - char atree[SS_MAX_TREENAME + 1] ; - uint8_t todo = T_UNSET ; char const *sv = 0, *svconf = 0, *src = 0, *import = 0 ; @@ -300,7 +298,7 @@ int ssexec_env(int argc, char const *const *argv, ssexec_t *info) if (todo == T_UNSET && !import && !saversion.len && !eversion.len) todo = T_EDIT ; - r = service_is_g(atree, sv, STATE_FLAGS_ISPARSED) ; + r = service_is_g(sv, STATE_FLAGS_ISPARSED) ; if (r == -1) log_dieusys(LOG_EXIT_SYS, "get information of service: ", sv, " -- please a bug report") ; else if (!r || r == STATE_FLAGS_FALSE) { diff --git a/src/lib66/exec/ssexec_reconfigure.c b/src/lib66/exec/ssexec_reconfigure.c index d2515e54b9ec8d8e3ad3d6ead034ca0cc85e90cc..0572da566a06e4a6978fad07c7c90c13f058676a 100644 --- a/src/lib66/exec/ssexec_reconfigure.c +++ b/src/lib66/exec/ssexec_reconfigure.c @@ -44,7 +44,6 @@ int ssexec_reconfigure(int argc, char const *const *argv, ssexec_t *info) unsigned int areslen = 0, list[SS_MAX_SERVICE + 1], visit[SS_MAX_SERVICE + 1], nservice = 0, n = 0 ; resolve_service_t ares[SS_MAX_SERVICE + 1] ; - char atree[SS_MAX_TREENAME + 1] ; FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_TOPARSE|STATE_FLAGS_WANTUP) ; @@ -96,7 +95,7 @@ int ssexec_reconfigure(int argc, char const *const *argv, ssexec_t *info) if (!state_messenger(&ares[aresid], STATE_FLAGS_TOPARSE, STATE_FLAGS_TRUE)) log_dieusys(LOG_EXIT_SYS, "send message to state of: ", argv[n]) ; - r = service_is_g(atree, argv[n], STATE_FLAGS_ISSUPERVISED) ; + r = service_is_g(argv[n], STATE_FLAGS_ISSUPERVISED) ; if (r < 0) log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ; diff --git a/src/lib66/exec/ssexec_reload.c b/src/lib66/exec/ssexec_reload.c index f6c7361cb9ff31b3c9d0b5326a756346eb232cee..436a0d644efcacc256bd9218edb5e6ae3a4a2521 100644 --- a/src/lib66/exec/ssexec_reload.c +++ b/src/lib66/exec/ssexec_reload.c @@ -40,7 +40,6 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info) unsigned int areslen = 0, m = 0 ; resolve_service_t ares[SS_MAX_SERVICE + 1] ; - char atree[SS_MAX_TREENAME + 1] ; FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_WANTUP) ; @@ -84,7 +83,7 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info) for (; n < argc ; n++) { - r = service_is_g(atree, argv[n], STATE_FLAGS_ISPARSED) ; + r = service_is_g(argv[n], STATE_FLAGS_ISPARSED) ; if (r < 0) log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ; @@ -94,7 +93,7 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info) return 0 ; } - r = service_is_g(atree, argv[n], STATE_FLAGS_ISSUPERVISED) ; + r = service_is_g(argv[n], STATE_FLAGS_ISSUPERVISED) ; if (r < 0) log_dieusys(LOG_EXIT_SYS, "get information of service: ", argv[n], " -- please make a bug report") ; diff --git a/src/lib66/exec/ssexec_resolve.c b/src/lib66/exec/ssexec_resolve.c index 00610854a3881f1649fa735efb34461acd263307..f8df5af4946c8eec4b0dd7bf8a6d8d8a148df92f 100644 --- a/src/lib66/exec/ssexec_resolve.c +++ b/src/lib66/exec/ssexec_resolve.c @@ -163,7 +163,6 @@ int ssexec_resolve(int argc, char const *const *argv, ssexec_t *info) int r = 0 ; char const *svname = 0 ; - char atree[SS_MAX_TREENAME + 1] ; resolve_service_t res = RESOLVE_SERVICE_ZERO ; resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; @@ -260,7 +259,7 @@ int ssexec_resolve(int argc, char const *const *argv, ssexec_t *info) } ; - r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; + r = service_is_g(svname, STATE_FLAGS_ISPARSED) ; if (r == -1) log_dieu(LOG_EXIT_SYS, "get information of service: ", svname, " -- please a bug report") ; else if (!r || r == STATE_FLAGS_FALSE) diff --git a/src/lib66/exec/ssexec_state.c b/src/lib66/exec/ssexec_state.c index 61d11b30193209500285b5837a166f047a3a939c..cb28b86651746ceff161aeb60e13dc88eb991fb7 100644 --- a/src/lib66/exec/ssexec_state.c +++ b/src/lib66/exec/ssexec_state.c @@ -67,7 +67,6 @@ int ssexec_state(int argc, char const *const *argv, ssexec_t *info) ss_state_t sta = STATE_ZERO ; char const *svname = 0 ; - char atree[SS_MAX_TREENAME + 1] ; char buf[MAXOPTS][INFO_FIELD_MAXLEN] = { "toinit", @@ -90,7 +89,7 @@ int ssexec_state(int argc, char const *const *argv, ssexec_t *info) svname = *argv ; - r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; + r = service_is_g(svname, STATE_FLAGS_ISPARSED) ; if (r == -1) log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please a bug report") ; else if (!r || r == STATE_FLAGS_FALSE) diff --git a/src/lib66/exec/ssexec_status.c b/src/lib66/exec/ssexec_status.c index 0cebee134d1e37d873fb1dbb7f604e78ce5ae547..2c021f6ed3a7b5b4de306cd8c927ab3bb798f537 100644 --- a/src/lib66/exec/ssexec_status.c +++ b/src/lib66/exec/ssexec_status.c @@ -881,7 +881,6 @@ int ssexec_status(int argc, char const *const *argv, ssexec_t *info) resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; char const *svname = 0 ; - char atree[SS_MAX_TREENAME + 1] ; for (int i = 0 ; i < MAXOPTS ; i++) what[i] = -1 ; @@ -953,7 +952,7 @@ int ssexec_status(int argc, char const *const *argv, ssexec_t *info) if(!strcmp(nl_langinfo(CODESET), "UTF-8")) S_STYLE = &graph_utf8; - r = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; + r = service_is_g(svname, STATE_FLAGS_ISPARSED) ; if (r < 0) log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please make a bug report") ; diff --git a/src/lib66/info/info_walk.c b/src/lib66/info/info_walk.c index bc6d72b9827a1a82e89d1f4aa7945712949acf4a..e6acb907a3c883479c9f5aa0cdc82ba9b042f484 100644 --- a/src/lib66/info/info_walk.c +++ b/src/lib66/info/info_walk.c @@ -73,7 +73,8 @@ int info_walk(graph_t *g, char const *name, char const *treename, info_graph_fun if (depth->level == 1 && treename) { char atree[SS_MAX_TREENAME + 1] ; - service_is_g(atree, name, 0) ; + if (!service_get_treename(atree, name, 0)) + goto err ; if (strcmp(treename, atree)) continue ; diff --git a/src/lib66/parse/parse_frontend.c b/src/lib66/parse/parse_frontend.c index 31f88b9c693f063246e80a7d160af26a65dfb171..39edf232d4dac5156491f2d21eebb62159560207 100644 --- a/src/lib66/parse/parse_frontend.c +++ b/src/lib66/parse/parse_frontend.c @@ -92,7 +92,6 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle uint8_t opt_tree_forced = 0 ; size_t svlen = strlen(sv) ; char svname[svlen + 1], svsrc[svlen + 1] ; - char atree[SS_MAX_TREENAME + 1] ; stralloc sa = STRALLOC_ZERO ; if (!ob_basename(svname, sv)) @@ -142,7 +141,7 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle char file[sa.len + 1] ; auto_strings(file, sa.s) ; - isparsed = service_is_g(atree, svname, STATE_FLAGS_ISPARSED) ; + isparsed = service_is_g(svname, STATE_FLAGS_ISPARSED) ; if (isparsed == -1) log_dieusys(LOG_EXIT_SYS, "get information of service: ", svname, " -- please make a bug report") ; else if (!isparsed) diff --git a/src/lib66/sanitize/sanitize_source.c b/src/lib66/sanitize/sanitize_source.c index f678f0edd990e6a1ad3b0562991f19827476a199..1b54882e9129df3560fba6c0902a65e7da54fc97 100644 --- a/src/lib66/sanitize/sanitize_source.c +++ b/src/lib66/sanitize/sanitize_source.c @@ -31,9 +31,8 @@ void sanitize_source(char const *name, ssexec_t *info) int r ; ssize_t logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ; - char atree[SS_MAX_TREENAME + 1] ; - r = service_is_g(atree, name, STATE_FLAGS_ISPARSED) ; + r = service_is_g(name, STATE_FLAGS_ISPARSED) ; if (r == -1) log_dieusys(LOG_EXIT_SYS, "get information of service: ", name, " -- please a bug report") ; diff --git a/src/lib66/service/service_is_g.c b/src/lib66/service/service_is_g.c index 22da6385a56306b9b1b40d461dbc7db3eb74187f..16656602bca3fa0674f3d05cccfebd2c493d82d4 100644 --- a/src/lib66/service/service_is_g.c +++ b/src/lib66/service/service_is_g.c @@ -65,11 +65,53 @@ int service_is(ss_state_t *ste, uint32_t flag) return STATE_FLAGS_FALSE ; } +int service_get_treename(char *atree, char const *name, uint32_t flag) +{ + log_flow() ; + + int e = 0, r = -1 ; + resolve_service_t res = RESOLVE_SERVICE_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; + + char base[SS_MAX_PATH_LEN + SS_SYSTEM_LEN + 1] ; + + if (!set_ownersysdir_stack(base, getuid())) { + resolve_free(wres) ; + log_warnusys_return(LOG_EXIT_ZERO, "set owner directory") ; + } + + size_t baselen = strlen(base) ; + auto_strings(base + baselen, SS_SYSTEM) ; + + // no tree exist yet + if (!scan_mode(base, S_IFDIR)) + goto freed ; + + base[baselen] = 0 ; + + r = resolve_read_g(wres, base, name) ; + if (r == -1 || !r) + goto freed ; + + if (strlen(res.sa.s + res.treename) >= SS_MAX_TREENAME) { + errno = ENAMETOOLONG ; + goto freed ; + } + + auto_strings(atree, res.sa.s + res.treename) ; + + e = 1 ; + + freed: + resolve_free(wres) ; + return e ; +} + /*@Return : * -1 system error * 0 check fail * STATE_FLAGS_TRUE/STATE_FLAGS_FALSE check success */ -int service_is_g(char *atree, char const *name, uint32_t flag) +int service_is_g(char const *name, uint32_t flag) { log_flow() ; @@ -106,13 +148,6 @@ int service_is_g(char *atree, char const *name, uint32_t flag) goto freed ; } - if (strlen(res.sa.s + res.treename) >= SS_MAX_TREENAME) { - errno = ENAMETOOLONG ; - goto freed ; - } - - auto_strings(atree, res.sa.s + res.treename) ; - if (!state_read(&ste, &res)) { log_warnu("read state file of: ", name, " -- please make a bug report") ; goto freed ;