Parcourir la source

Fix some PVS Studio warnings (#597)

bel2125 il y a 7 ans
Parent
commit
f146e6eb4c
4 fichiers modifiés avec 34 ajouts et 16 suppressions
  1. 3 5
      src/civetweb.c
  2. 8 6
      src/main.c
  3. 21 3
      unittest/public_func.c
  4. 2 2
      unittest/public_server.c

+ 3 - 5
src/civetweb.c

@@ -4622,13 +4622,11 @@ mg_send_http_error_impl(struct mg_connection *conn,
 		          "Connection: close\r\n\r\n",
 		          date);
 
-		/* Errors 1xx, 204 and 304 MUST NOT send a body */
+		/* HTTP responses 1xx, 204 and 304 MUST NOT send a body */
 		if (has_body) {
+			/* For other errors, send a generic error message. */
 			mg_printf(conn, "Error %d: %s\n", status, status_text);
-
-			if (fmt != NULL) { /* <-- should be always true */
-				mg_write(conn, errmsg_buf, strlen(errmsg_buf));
-			}
+			mg_write(conn, errmsg_buf, strlen(errmsg_buf));
 
 		} else {
 			/* No body allowed. Close the connection. */

+ 8 - 6
src/main.c

@@ -1046,7 +1046,7 @@ static int
 run_client(const char *url_arg)
 {
 	/* connection data */
-	char *url = sdup(url_arg);
+	char *url = sdup(url_arg); /* OOM will cause program to exit */
 	char *host;
 	char *resource;
 	int is_ssl = 0;
@@ -1059,11 +1059,13 @@ run_client(const char *url_arg)
 	struct mg_connection *conn;
 	char ebuf[1024] = {0};
 
-	/* Check out of memory */
-	if (!url) {
-		fprintf(stderr, "Out of memory\n");
-		return 0;
-	}
+#if 0 /* Unreachable code, since sdup will never return NULL */
+    /* Check out of memory */
+    if (!url) {
+        fprintf(stderr, "Out of memory\n");
+        return 0;
+    }
+#endif
 
 	/* Check parameter */
 	if (!strncmp(url, "http://", 7)) {

+ 21 - 3
unittest/public_func.c

@@ -108,7 +108,7 @@ START_TEST(test_mg_version)
 	len = mg_get_system_info(NULL, 0);
 	ck_assert_int_gt(len, 0);
 	buf = (char *)malloc((unsigned)len + 1);
-	ck_assert_ptr_ne(buf, NULL);
+	ck_assert(buf != NULL);
 	ret = mg_get_system_info(buf, len + 1);
 	ck_assert_int_eq(len, ret);
 	ret = (int)strlen(buf);
@@ -120,7 +120,7 @@ START_TEST(test_mg_version)
 	len = mg_get_context_info(ctx, NULL, 0);
 	ck_assert_int_gt(len, 0);
 	buf = (char *)malloc((unsigned)len + 100);
-	ck_assert_ptr_ne(buf, NULL);
+	ck_assert(buf != NULL);
 	ret = mg_get_context_info(ctx, buf, len + 100);
 	ck_assert_int_gt(ret, 0);
 	len = (int)strlen(buf);
@@ -132,7 +132,7 @@ START_TEST(test_mg_version)
 	len = mg_get_context_info(ctx, NULL, 0);
 	ck_assert_int_gt(len, 0);
 	buf = (char *)malloc((unsigned)len + 100);
-	ck_assert_ptr_ne(buf, NULL);
+	ck_assert(buf != NULL);
 	ret = mg_get_context_info(ctx, buf, len + 100);
 	ck_assert_int_gt(ret, 0);
 	len = (int)strlen(buf);
@@ -202,11 +202,19 @@ END_TEST
 
 START_TEST(test_mg_strncasecmp)
 {
+	/* equal */
 	ck_assert(mg_strncasecmp("abc", "abc", 3) == 0);
+
+	/* equal, since only 3 letters are compared */
 	ck_assert(mg_strncasecmp("abc", "abcd", 3) == 0);
+
+	/* not equal, since now all 4 letters are compared */
 	ck_assert(mg_strncasecmp("abc", "abcd", 4) != 0);
+
+	/* equal, since we do not care about cases */
 	ck_assert(mg_strncasecmp("a", "A", 1) == 0);
 
+	/* a < b */
 	ck_assert(mg_strncasecmp("A", "B", 1) < 0);
 	ck_assert(mg_strncasecmp("A", "b", 1) < 0);
 	ck_assert(mg_strncasecmp("a", "B", 1) < 0);
@@ -487,25 +495,35 @@ START_TEST(test_mg_url_decode)
 	char buf[20];
 	int ret;
 
+	/* decode entire string */
 	ret = mg_url_decode("abc", 3, buf, sizeof(buf), 0);
 	ck_assert_int_eq(ret, 3);
 	ck_assert_str_eq(buf, "abc");
 
+	/* decode only a part of the string */
 	ret = mg_url_decode("abcdef", 3, buf, sizeof(buf), 0);
 	ck_assert_int_eq(ret, 3);
 	ck_assert_str_eq(buf, "abc");
 
+	/* a + remains a + in standard decoding */
 	ret = mg_url_decode("x+y", 3, buf, sizeof(buf), 0);
 	ck_assert_int_eq(ret, 3);
 	ck_assert_str_eq(buf, "x+y");
 
+	/* a + becomes a space in form decoding */
 	ret = mg_url_decode("x+y", 3, buf, sizeof(buf), 1);
 	ck_assert_int_eq(ret, 3);
 	ck_assert_str_eq(buf, "x y");
 
+	/* a %25 is a % character */
 	ret = mg_url_decode("%25", 3, buf, sizeof(buf), 1);
 	ck_assert_int_eq(ret, 1);
 	ck_assert_str_eq(buf, "%");
+
+	/* a %20 is space, %21 is ! */
+	ret = mg_url_decode("%20%21", 6, buf, sizeof(buf), 0);
+	ck_assert_int_eq(ret, 2);
+	ck_assert_str_eq(buf, " !");
 }
 END_TEST
 

+ 2 - 2
unittest/public_server.c

@@ -2473,7 +2473,7 @@ START_TEST(test_handle_form)
 	char ebuf[1024];
 	const char *multipart_body;
 	const char *boundary;
-	size_t body_len, body_sent, chunk_len;
+	size_t body_len, body_sent, chunk_len, bound_len;
 	int sleep_cnt;
 
 	mark_point();
@@ -2953,8 +2953,8 @@ START_TEST(test_handle_form)
 	/* sending megabytes to localhost does not always work in CI test
 	 * environments (depending on the network stack) */
 	body_sent = 0;
+	bound_len = strlen(boundary);
 	do {
-		size_t bound_len = strlen(boundary);
 		send_chunk_string(client_conn, "ignore\r\n");
 		body_sent += 8;
 		/* send some strings that are almost boundaries */