From a8a87b810dec4361dc45cc4dbae0445df0825e54 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sat, 15 Oct 2022 20:38:55 +1100
Subject: [PATCH] fix stack allocation, do some check

---
 src/lib66/parse/deps-lib/deps              |  1 +
 src/lib66/parse/parse_compute_list.c       |  7 ++++---
 src/lib66/parse/parse_dependencies.c       |  6 +++---
 src/lib66/parse/parse_split_from_section.c |  6 +++---
 src/lib66/parse/parse_store_environ.c      |  2 --
 src/lib66/parse/parse_store_logger.c       |  5 +++++
 src/lib66/parse/parse_store_main.c         | 13 +++++++++++++
 7 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/src/lib66/parse/deps-lib/deps b/src/lib66/parse/deps-lib/deps
index d802130c..0313af57 100644
--- a/src/lib66/parse/deps-lib/deps
+++ b/src/lib66/parse/deps-lib/deps
@@ -3,6 +3,7 @@ parse_clean_list.o
 parse_clean_quotes.o
 parse_clean_runas.o
 parse_compute_list.o
+parse_compute_resolve.o
 parse_contents.o
 parse_dependencies.o
 parse_error.o
diff --git a/src/lib66/parse/parse_compute_list.c b/src/lib66/parse/parse_compute_list.c
index b85f0a1d..ad6c2157 100644
--- a/src/lib66/parse/parse_compute_list.c
+++ b/src/lib66/parse/parse_compute_list.c
@@ -27,14 +27,15 @@
 #include <66/service.h>
 
 /**
- * @opts -> 1 : build list of optional deps
+ * @opts -> 1 : build list removing commented optional deps
  * */
 int parse_compute_list(resolve_wrapper_t_ref wres, stralloc *sa, uint32_t *res, uint8_t opts)
 {
     int r, found = 0 ;
     size_t len = sa->len, pos = 0 ;
-    char t[len + 1] ;
-    char f[len + 1] ;
+    size_t nelement = sastr_nelement(sa) ;
+    char t[len + nelement + 2] ;
+    char f[len + nelement + 2] ;
 
     memset(f, 0, len) ;
     memset(t, 0, len) ;
diff --git a/src/lib66/parse/parse_dependencies.c b/src/lib66/parse/parse_dependencies.c
index 84265424..df4740fa 100644
--- a/src/lib66/parse/parse_dependencies.c
+++ b/src/lib66/parse/parse_dependencies.c
@@ -44,7 +44,7 @@ int parse_dependencies(resolve_service_t *res, resolve_service_t *ares, unsigned
             goto freed ;
         }
 
-        char t[sa.len] ;
+        char t[sa.len + 1] ;
 
         sastr_to_char(t, &sa) ;
 
@@ -53,8 +53,8 @@ int parse_dependencies(resolve_service_t *res, resolve_service_t *ares, unsigned
         for (; pos < len ; pos += strlen(t + pos) + 1) {
 
             sa.len = 0 ;
-            char name[strlen(t + pos)] ;
-            char ainsta[strlen(t + pos)] ;
+            char name[strlen(t + pos) + 1] ;
+            char ainsta[strlen(t + pos) + 1] ;
             int insta = -1 ;
 
             log_trace("parse dependencies: ", t + pos, " of service: ", res->sa.s + res->name) ;
diff --git a/src/lib66/parse/parse_split_from_section.c b/src/lib66/parse/parse_split_from_section.c
index f1ac67b6..18c5b34c 100644
--- a/src/lib66/parse/parse_split_from_section.c
+++ b/src/lib66/parse/parse_split_from_section.c
@@ -21,6 +21,7 @@
 #include <oblibs/mill.h>
 
 #include <skalibs/stralloc.h>
+#include <skalibs/types.h> //UINT_FMT
 
 #include <66/parser.h>
 #include <66/resolve.h>
@@ -44,7 +45,7 @@ int parse_split_from_section(resolve_service_t *res, stralloc *secname, char *st
 {
     log_flow() ;
 
-    int e = 0, r = 0, found = 0, skip = 0 ;
+    int e = 0, r = 0, found = 0 ;
 
     key_all_t const *list = total_list ;
     stralloc sakey = STRALLOC_ZERO ;
@@ -52,7 +53,7 @@ int parse_split_from_section(resolve_service_t *res, stralloc *secname, char *st
     // cpos -> current, ipos -> idx pos, tpos -> temporary pos, end -> end the parse process
     size_t len = strlen(str), cpos = 0, ipos = 0, tpos = 0, end = 0 ;
     char tline[len + 1] ;
-    char store[len + 1] ;
+    char store[len + UINT_FMT + 1] ; // +6 be paranoid
     char *line ;
 
     // find the name of the current section
@@ -85,7 +86,6 @@ int parse_split_from_section(resolve_service_t *res, stralloc *secname, char *st
 
     while(cpos < len) {
 
-        skip = 0 ;
         ipos = 0 ;
         tpos = 0 ;
         end = 0 ;
diff --git a/src/lib66/parse/parse_store_environ.c b/src/lib66/parse/parse_store_environ.c
index 2f4d644f..588b4c49 100644
--- a/src/lib66/parse/parse_store_environ.c
+++ b/src/lib66/parse/parse_store_environ.c
@@ -25,8 +25,6 @@
 #include <66/utils.h>
 #include <66/environ.h>
 
-#include <stdio.h>
-
 int parse_store_environ(resolve_service_t *res, char *store, int idsec, int idkey)
 {
     int e = 0 ;
diff --git a/src/lib66/parse/parse_store_logger.c b/src/lib66/parse/parse_store_logger.c
index 9dad2be5..3a444972 100644
--- a/src/lib66/parse/parse_store_logger.c
+++ b/src/lib66/parse/parse_store_logger.c
@@ -47,6 +47,8 @@ int parse_store_logger(resolve_service_t *res, char *store, int idsec, int idkey
 
         case KEY_LOGGER_SHEBANG:
 
+             log_1_warn("deprecated key @shebang -- define your complete shebang directly inside your @execute key field") ;
+
             if (!parse_store_start_stop(res, store, idsec, KEY_STARTSTOP_SHEBANG))
                 goto err ;
 
@@ -97,6 +99,9 @@ int parse_store_logger(resolve_service_t *res, char *store, int idsec, int idkey
             if (!uint320_scan(store, &res->logger.maxsize))
                 parse_error_return(0, 3, idsec, idkey) ;
 
+            if (res->logger.maxsize < 4096 || res->logger.maxsize > 268435455)
+                parse_error_return(0, 0, idsec, idkey) ;
+
             break ;
 
         case KEY_LOGGER_TIMESTP:
diff --git a/src/lib66/parse/parse_store_main.c b/src/lib66/parse/parse_store_main.c
index 29331239..075d794b 100644
--- a/src/lib66/parse/parse_store_main.c
+++ b/src/lib66/parse/parse_store_main.c
@@ -73,6 +73,10 @@ int parse_store_main(resolve_service_t *res, char *store, int idsec, int idkey)
 
         case KEY_MAIN_TYPE:
 
+            if (res->name)
+                /** already passed through here */
+                break ;
+
             if (!parse_clean_line(store))
                 parse_error_return(0, 8, idsec, idkey) ;
 
@@ -108,6 +112,9 @@ int parse_store_main(resolve_service_t *res, char *store, int idsec, int idkey)
             if (!uint320_scan(store, &res->maxdeath))
                 parse_error_return(0, 3, idsec, idkey) ;
 
+            if (res->maxdeath > 4096)
+                parse_error_return(0, 0, idsec, idkey) ;
+
             break ;
 
         case KEY_MAIN_FLAGS:
@@ -278,6 +285,12 @@ int parse_store_main(resolve_service_t *res, char *store, int idsec, int idkey)
 
                     if (pos == (size_t)p) {
 
+                        if (!owner)
+                            /** avoid field e.g root root where originaly
+                             * we want e.g. user root. The term user will be
+                             * root at getpwuid() call */
+                            continue ;
+
                         struct passwd *pw = getpwuid(owner);
                         if (!pw) {
 
-- 
GitLab