diff --git a/apps/restconf/clixon_http_data.c b/apps/restconf/clixon_http_data.c index 790745f2..e2602cb8 100644 --- a/apps/restconf/clixon_http_data.c +++ b/apps/restconf/clixon_http_data.c @@ -282,19 +282,20 @@ api_http_data_file(clixon_handle h, char *pathname, int head) { - int retval = -1; - cbuf *cbfile = NULL; - char *filename = NULL; - cbuf *cbdata = NULL; - FILE *f = NULL; - off_t fsz = 0; - long fsize; - char *www_data_root = NULL; - char *suffix; - char *media; - int ret; - char *buf = NULL; - size_t sz; + int retval = -1; + cbuf *cbfile = NULL; + char *filename = NULL; + cbuf *cbdata = NULL; + FILE *f = NULL; + off_t fsz = 0; + long fsize; + char *www_data_root = NULL; + char *suffix; + char *media; + char *buf = NULL; + size_t sz; + char *media_list = NULL; + int ret; clixon_debug(CLIXON_DBG_RESTCONF, ""); if ((cbfile = cbuf_new()) == NULL){ @@ -305,7 +306,6 @@ api_http_data_file(clixon_handle h, clixon_err(OE_RESTCONF, ENOENT, "CLICON_HTTP_DATA_ROOT missing"); goto done; } - cprintf(cbfile, "%s", www_data_root); if (pathname){ if (strlen(pathname) && pathname[0] != '/'){ @@ -331,6 +331,19 @@ api_http_data_file(clixon_handle h, if ((media = clicon_str2str(mime_map, suffix)) == NULL) media = "application/octet-stream"; } + /* 5. Accepted media_out: should check text/html, JavaScript, image, and css + */ + if ((media_list = restconf_param_get(h, "HTTP_ACCEPT")) != NULL){ + if (restconf_media_in_list(media, media_list) != 1 && + restconf_media_in_list("*/*", media_list) != 1) { + /* If the server does not support any of the requested + * output encodings for a request, then it MUST return an error response + * with a "406 Not Acceptable" status-line. */ + if (restconf_not_acceptable(h, req, 1, HTTP_DATA_TEXT_HTML) < 0) + goto done; + goto ok; + } + } /* Size could have been taken from stat() but this reduces the race condition interval * There is still one without flock */ @@ -416,12 +429,11 @@ api_http_data(clixon_handle h, { int retval = -1; char *request_method = NULL; - char *media_list = NULL; int head = 0; int options = 0; - int ret; cbuf *indata = NULL; char *path = NULL; + int ret; clixon_debug(CLIXON_DBG_RESTCONF, ""); if (req == NULL){ @@ -467,20 +479,6 @@ api_http_data(clixon_handle h, goto done; goto ok; } - /* 5. Accepted media_out: should check text/html, JavaScript, image, and css - */ - if ((media_list = restconf_param_get(h, "HTTP_ACCEPT")) != NULL){ - if (restconf_media_in_list("text/html", media_list) != 1 && - restconf_media_in_list("*/*", media_list) != 1 - && 0) { /* XXX: not yet */ - /* If the server does not support any of the requested - * output encodings for a request, then it MUST return an error response - * with a "406 Not Acceptable" status-line. */ - if (restconf_not_acceptable(h, req, 1, HTTP_DATA_TEXT_HTML) < 0) - goto done; - goto ok; - } - } /* 6. Authenticate * Note, error handling may need change since it is restconf based */ diff --git a/docker/test/Makefile.in b/docker/test/Makefile.in index 1312b782..4a4bbce2 100644 --- a/docker/test/Makefile.in +++ b/docker/test/Makefile.in @@ -78,7 +78,7 @@ openconfig: ./getopenconfig.sh docker: clixon yang openconfig $(DOCKERFILE) - sudo docker build -f $(DOCKERFILE) -t $(IMG) $(DOCKERFLAGS) . + sudo docker build --progress plain -f $(DOCKERFILE) -t $(IMG) $(DOCKERFLAGS) . push: sudo docker push $(IMG) diff --git a/lib/src/clixon_yang.c b/lib/src/clixon_yang.c index db6368f1..ad2da873 100644 --- a/lib/src/clixon_yang.c +++ b/lib/src/clixon_yang.c @@ -912,11 +912,16 @@ ys_free1(yang_stmt *ys, { rpc_callback_t *rc; cg_var *cv; + cvec *cvv; - if ((cv = ys->ys_cv) != NULL){ // To not trigger asserts + if ((cv = ys->ys_cv) != NULL){ ys->ys_cv = NULL; cv_free(cv); } + if ((cvv = ys->ys_cvec) != NULL){ + ys->ys_cvec = NULL; + cvec_free(cvv); + } if (ys->ys_argument){ free(ys->ys_argument); ys->ys_argument = NULL; diff --git a/test/mem.sh b/test/mem.sh index 889a5b71..0778357e 100755 --- a/test/mem.sh +++ b/test/mem.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Run valgrind leak test for cli, restconf, netconf or background. +# Run valgrind leak test for backend, restconf, cli, netconf or snmp. # Stop on first error # Typical run: ./mem.sh 2>&1 | tee mylog @@ -7,32 +7,22 @@ : ${pattern:=test_*.sh} # Run valgrindtest once, args: -# what: (cli|netconf|restconf|backend)* # no args means all +# what: (backend|restconf|cli|netconf|snmp)* # no args means all function memonce(){ what=$1 valgrindfile=$(mktemp) echo "valgrindfile:$valgrindfile" - clixon_cli= - clixon_netconf= clixon_backend= clixon_restconf= + clixon_cli= + clixon_netconf= clixon_snmp= case "$what" in - 'cli') - valgrindtest=1 - : ${DEMWAIT:=5} # valgrind backend needs some time to get up - clixon_cli="/usr/bin/valgrind --leak-check=full --show-leak-kinds=all --suppressions=./valgrind-clixon.supp --track-fds=yes --trace-children=no --child-silent-after-fork=yes --log-file=$valgrindfile clixon_cli" - ;; - 'netconf') - valgrindtest=1 - : ${DEMWAIT:=5} # valgrind backend needs some time to get up - clixon_netconf="/usr/bin/valgrind --leak-check=full --show-leak-kinds=all --suppressions=./valgrind-clixon.supp --track-fds=yes --trace-children=no --child-silent-after-fork=yes --log-file=$valgrindfile clixon_netconf" - ;; 'backend') valgrindtest=2 # This means backend valgrind test - : ${DEMWAIT:=10} # valgrind backend needs some time to get up + : ${DEMWAIT:=10} # valgrind backend needs some time to get up # trace-children=no for test_restconf_rpc.sh sudo chown root $valgrindfile sudo chmod 777 $valgrindfile @@ -40,9 +30,19 @@ function memonce(){ ;; 'restconf') valgrindtest=3 # This means restconf valgrind test - : ${DEMWAIT:=15} # valgrind backend needs some time to get up + : ${DEMWAIT:=15} # valgrind backend needs some time to get up clixon_restconf="/usr/bin/valgrind --num-callers=50 --leak-check=full --show-leak-kinds=all --suppressions=./valgrind-clixon.supp --track-fds=yes --trace-children=no --child-silent-after-fork=yes --log-file=$valgrindfile clixon_restconf" + ;; + 'cli') + valgrindtest=1 + : ${DEMWAIT:=5} # valgrind backend needs some time to get up + clixon_cli="/usr/bin/valgrind --leak-check=full --show-leak-kinds=all --suppressions=./valgrind-clixon.supp --track-fds=yes --trace-children=no --child-silent-after-fork=yes --log-file=$valgrindfile clixon_cli" + ;; + 'netconf') + valgrindtest=1 + : ${DEMWAIT:=5} # valgrind backend needs some time to get up + clixon_netconf="/usr/bin/valgrind --leak-check=full --show-leak-kinds=all --suppressions=./valgrind-clixon.supp --track-fds=yes --trace-children=no --child-silent-after-fork=yes --log-file=$valgrindfile clixon_netconf" ;; 'snmp') valgrindtest=4 # This means snmp valgrind test @@ -50,9 +50,8 @@ function memonce(){ : ${DEMWAIT:=15} # valgrind snmp needs some time to get up clixon_snmp="/usr/bin/valgrind --num-callers=50 --leak-check=full --show-leak-kinds=all --suppressions=./valgrind-clixon.supp --track-fds=yes --trace-children=no --child-silent-after-fork=yes --log-file=$valgrindfile clixon_snmp" ;; - *) - echo "usage: $0 cli|netconf|restconf|backend|snmp" # valgrind memleak checks + echo "usage: $0 backend|restconf|cli|netconf|snmp" # valgrind memleak checks rm -f $valgrindfile exit -1 ;; @@ -108,9 +107,9 @@ fi # First run sanity for c in $cmds; do - if [ $c != cli -a $c != netconf -a $c != restconf -a $c != backend -a $c != snmp ]; then + if [ $c != backend -a $c != restconf -a $c != cli -a $c != netconf -a $c != snmp ]; then echo "c:$c" - echo "usage: $0 [cli|netconf|restconf|backend|snmp]+" + echo "usage: $0 [backend||restconf|cli|netconf|snmp]+" echo " with no args run all" exit -1 fi diff --git a/test/test_http_data.sh b/test/test_http_data.sh index acb4ffa0..a990bbe9 100755 --- a/test/test_http_data.sh +++ b/test/test_http_data.sh @@ -213,10 +213,8 @@ EOF expectpart "$(curl $CURLOPTS -X GET -H 'Accept: wrong/media,*/*' $proto://localhost/data/index.html)" 0 "HT TP/$HVER 200" "Content-Type: text/html" "