Explorar o código

pline: Remove inactive expr after parsing

Serj Kalichev hai 1 ano
pai
achega
cd41dbeb27
Modificáronse 2 ficheiros con 26 adicións e 6 borrados
  1. 9 0
      src/pline.c
  2. 17 6
      src/syms.c

+ 9 - 0
src/pline.c

@@ -564,6 +564,7 @@ pline_t *pline_parse(sr_session_ctx_t *sess, faux_argv_t *argv, uint32_t flags)
 	struct lys_module *module = NULL;
 	pline_t *pline = NULL;
 	uint32_t i = 0;
+	faux_list_node_t *last_expr_node = NULL;
 
 	assert(sess);
 	if (!sess)
@@ -593,6 +594,14 @@ pline_t *pline_parse(sr_session_ctx_t *sess, faux_argv_t *argv, uint32_t flags)
 
 	sr_session_release_context(pline->sess);
 
+	// Last parsed expression can be inactive so remove it from list
+	last_expr_node = faux_list_tail(pline->exprs);
+	if (last_expr_node) {
+		pexpr_t *expr = (pexpr_t *)faux_list_data(last_expr_node);
+		if (!expr->active)
+			faux_list_del(pline->exprs, last_expr_node);
+	}
+
 	return pline;
 }
 

+ 17 - 6
src/syms.c

@@ -93,6 +93,7 @@ int srp_help(kcontext_t *context)
 
 int srp_set(kcontext_t *context)
 {
+	int ret = 0;
 	faux_argv_t *args = NULL;
 	pline_t *pline = NULL;
 	sr_conn_ctx_t *conn = NULL;
@@ -114,14 +115,23 @@ int srp_set(kcontext_t *context)
 	pline = pline_parse(sess, args, 0);
 	faux_argv_free(args);
 
+	if (pline->invalid) {
+		fprintf(stderr, "Invalid set request\n");
+		ret = -1;
+		goto cleanup;
+	}
+
 	iter = faux_list_head(pline->exprs);
 	while ((expr = (pexpr_t *)faux_list_each(&iter))) {
-		if (!expr->active)
+		if (!(expr->pat & PT_SET)) {
+			err_num++;
+			fprintf(stderr, "Illegal expression for set operation\n");
 			break;
+		}
 		if (sr_set_item_str(sess, expr->xpath, expr->value, NULL, 0) !=
 			SR_ERR_OK) {
 			err_num++;
-			fprintf(stderr, "Can't set data");
+			fprintf(stderr, "Can't set data\n");
 			break;
 		}
 	}
@@ -133,11 +143,12 @@ int srp_set(kcontext_t *context)
 			sr_apply_changes(sess, 0);
 	}
 
+	if (err_num > 0)
+		ret = -1;
+
+cleanup:
 	pline_free(pline);
 	sr_disconnect(conn);
 
-	if (err_num > 0)
-		return -1;
-
-	return 0;
+	return ret;
 }