From: wwp Date: Sat, 17 Mar 2018 19:02:48 +0000 (+0100) Subject: Few optimizations: avoid strlen when string length is known (read()>0 return); X-Git-Tag: 3.17.0~174 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=86b4d2c073e7346b591f9270352d772b288f24a7 Few optimizations: avoid strlen when string length is known (read()>0 return); end string at real end of string instead of at buffer boundary and be sure we print 0-terminated string (clamd_stream_scan()); clamd_verify_email: discover a strange multi-line response, be sure we print 0-terminated string (CID 1220483), debug_print all response lines. --- diff --git a/src/plugins/clamd/libclamd/clamd-plugin.c b/src/plugins/clamd/libclamd/clamd-plugin.c index 23358e52f..314f626ef 100644 --- a/src/plugins/clamd/libclamd/clamd-plugin.c +++ b/src/plugins/clamd/libclamd/clamd-plugin.c @@ -389,8 +389,8 @@ Clamd_Stat clamd_init(Clamd_Socket* config) { memset(buf, '\0', sizeof(buf)); while ((n_read = read(sock, buf, BUFSIZ - 1)) > 0) { buf[n_read] = '\0'; - if (buf[strlen(buf) - 1] == '\n') - buf[strlen(buf) - 1] = '\0'; + if (buf[n_read - 1] == '\n') + buf[n_read - 1] = '\0'; debug_print("Ping result: %s\n", buf); if (strcmp("PONG", buf) == 0) connect = TRUE; @@ -407,10 +407,10 @@ Clamd_Stat clamd_init(Clamd_Socket* config) { return NO_CONNECTION; } memset(buf, '\0', sizeof(buf)); - while ((n_read = read(sock, buf, BUFSIZ - 1)) > 0) { - buf[n_read] = '\0'; - if (buf[strlen(buf) - 1] == '\n') - buf[strlen(buf) - 1] = '\0'; + while ((n_read = read(sock, buf, BUFSIZ - 1)) > 0) { + buf[n_read] = '\0'; + if (buf[n_read - 1] == '\n') + buf[n_read - 1] = '\0'; debug_print("Version: %s\n", buf); } close(sock); @@ -462,10 +462,9 @@ static Clamd_Stat clamd_stream_scan(int sock, } while ((count = read(fd, (void *) buf, sizeof(buf))) > 0) { - buf[sizeof(buf) - 1] = '\0'; - if (buf[strlen(buf) - 1] == '\n') - buf[strlen(buf) - 1] = '\0'; - debug_print("read: %ld bytes\n", count); + buf[count] = '\0'; + if (buf[count - 1] == '\n') + buf[count - 1] = '\0'; debug_print("chunk size: %ld\n", count); chunk = htonl(count); @@ -500,6 +499,7 @@ static Clamd_Stat clamd_stream_scan(int sock, *res = g_strconcat("ERROR -> ", _("Socket read error"), NULL); return SCAN_ERROR; } + res[n_read] = '\0'; debug_print("received: %s\n", *res); return OK; } @@ -534,6 +534,7 @@ Clamd_Stat clamd_verify_email(const gchar* path, response* result) { debug_print("copy to buf: %s\n", tmp); memcpy(&buf, tmp, BUFSIZ); g_free(tmp); + debug_print("response: %s\n", buf); } else { command = g_strconcat(scan, " ", path, "\n", NULL); @@ -545,13 +546,18 @@ Clamd_Stat clamd_verify_email(const gchar* path, response* result) { } g_free(command); memset(buf, '\0', sizeof(buf)); + /* shouldn't we read only once here? we're checking the last response line anyway */ while ((n_read = read(sock, buf, BUFSIZ - 1)) > 0) { buf[n_read] = '\0'; - if (buf[strlen(buf) - 1] == '\n') - buf[strlen(buf) - 1] = '\0'; + if (buf[n_read - 1] == '\n') + buf[n_read - 1] = '\0'; + debug_print("response: %s\n", buf); + } + if (n_read == 0) { + buf[n_read] = '\0'; + debug_print("response: %s\n", buf); } } - debug_print("response: %s\n", buf); if (strstr(buf, "ERROR")) { stat = SCAN_ERROR; result->msg = g_strdup(buf);