Browse code

Fixes clamdscan and clamscan crashes on Windows

This addresses an issue introduced early in 0.103 development when the
start/end timestamps were added to the scan summary.
The localtime function equivalent on Windows has the argument order reversed.

Micah Snyder authored on 2019/11/04 07:05:25
Showing 2 changed files
... ...
@@ -62,7 +62,8 @@ int main(int argc, char **argv)
62 62
 {
63 63
     int ds, dms, ret, infected = 0, err = 0;
64 64
     struct timeval t1, t2;
65
-    time_t starttime;
65
+	time_t date_start, date_end;
66
+
66 67
     struct optstruct *opts;
67 68
     const struct optstruct *opt;
68 69
     char buffer[26];
... ...
@@ -142,9 +143,7 @@ int main(int argc, char **argv)
142 142
     sigaction(SIGPIPE, &sigact, NULL);
143 143
 #endif
144 144
 
145
-    time(&starttime);
146
-    /* ctime() does \n, but I need it once more */
147
-
145
+	date_start = time(NULL);
148 146
     gettimeofday(&t1, NULL);
149 147
 
150 148
     ret = client(opts, &infected, &err);
... ...
@@ -152,6 +151,9 @@ int main(int argc, char **argv)
152 152
 
153 153
     /* TODO: Implement STATUS in clamd */
154 154
     if (!optget(opts, "no-summary")->enabled) {
155
+		struct tm tmp;
156
+
157
+		date_end = time(NULL);
155 158
         gettimeofday(&t2, NULL);
156 159
         ds  = t2.tv_sec - t1.tv_sec;
157 160
         dms = t2.tv_usec - t1.tv_usec;
... ...
@@ -168,10 +170,26 @@ int main(int argc, char **argv)
168 168
             logg("Not moved: %d\n", notmoved);
169 169
         }
170 170
         logg("Time: %d.%3.3d sec (%d m %d s)\n", ds, dms / 1000, ds / 60, ds % 60);
171
-        strftime(buffer, sizeof(buffer), "%Y:%m:%d %H:%M:%S", localtime(&t1.tv_sec));
171
+
172
+#ifdef _WIN32
173
+		if (0 != localtime_s(&tmp, &date_start)) {
174
+#else
175
+		if (!localtime_r(&date_start, &tmp)) {
176
+#endif
177
+			logg("!Failed to get local time for Start Date.\n");
178
+		}
179
+        strftime(buffer, sizeof(buffer), "%Y:%m:%d %H:%M:%S", &tmp);
172 180
         logg("Start Date: %s\n", buffer);
173
-        strftime(buffer, sizeof(buffer), "%Y:%m:%d %H:%M:%S", localtime(&t2.tv_sec));
174
-        logg("End Date: %s\n", buffer);
181
+
182
+#ifdef _WIN32
183
+		if (0 != localtime_s(&tmp, &date_end)) {
184
+#else
185
+		if (!localtime_r(&date_end, &tmp)) {
186
+#endif
187
+			logg("!Failed to get local time for End Date.\n");
188
+		}
189
+        strftime(buffer, sizeof(buffer), "%Y:%m:%d %H:%M:%S", &tmp);
190
+        logg("End Date:   %s\n", buffer);
175 191
     }
176 192
 
177 193
     logg_close();
... ...
@@ -62,6 +62,8 @@ int main(int argc, char **argv)
62 62
     int ds, dms, ret;
63 63
     double mb, rmb;
64 64
     struct timeval t1, t2;
65
+	time_t date_start, date_end;
66
+
65 67
     char buffer[26];
66 68
 #ifndef _WIN32
67 69
     sigset_t sigset;
... ...
@@ -155,13 +157,16 @@ int main(int argc, char **argv)
155 155
 
156 156
     memset(&info, 0, sizeof(struct s_info));
157 157
 
158
+	date_start = time(NULL);
158 159
     gettimeofday(&t1, NULL);
159 160
 
160 161
     ret = scanmanager(opts);
161 162
 
162 163
     if (!optget(opts, "no-summary")->enabled) {
163
-        gettimeofday(&t2, NULL);
164
+		struct tm tmp;
164 165
 
166
+		date_end = time(NULL);
167
+        gettimeofday(&t2, NULL);
165 168
         ds  = t2.tv_sec - t1.tv_sec;
166 169
         dms = t2.tv_usec - t1.tv_usec;
167 170
         ds -= (dms < 0) ? (1) : (0);
... ...
@@ -185,10 +190,26 @@ int main(int argc, char **argv)
185 185
         rmb = info.rblocks * (CL_COUNT_PRECISION / 1024) / 1024.0;
186 186
         logg("Data read: %2.2lf MB (ratio %.2f:1)\n", rmb, info.rblocks ? (double)info.blocks / (double)info.rblocks : 0);
187 187
         logg("Time: %u.%3.3u sec (%u m %u s)\n", ds, dms / 1000, ds / 60, ds % 60);
188
-        strftime(buffer, sizeof(buffer), "%Y:%m:%d %H:%M:%S", localtime(&t1.tv_sec));
189
-        logg("Start Date: %s\n", buffer);
190
-        strftime(buffer, sizeof(buffer), "%Y:%m:%d %H:%M:%S", localtime(&t2.tv_sec));
191
-        logg("End Date: %s\n", buffer);
188
+
189
+#ifdef _WIN32
190
+		if (0 != localtime_s(&tmp, &date_start)) {
191
+#else
192
+		if (!localtime_r(&date_start, &tmp)) {
193
+#endif
194
+			logg("!Failed to get local time for Start Date.\n");
195
+		}
196
+		strftime(buffer, sizeof(buffer), "%Y:%m:%d %H:%M:%S", &tmp);
197
+		logg("Start Date: %s\n", buffer);
198
+
199
+#ifdef _WIN32
200
+		if (0 != localtime_s(&tmp, &date_end)) {
201
+#else
202
+		if (!localtime_r(&date_end, &tmp)) {
203
+#endif
204
+			logg("!Failed to get local time for End Date.\n");
205
+		}
206
+		strftime(buffer, sizeof(buffer), "%Y:%m:%d %H:%M:%S", &tmp);
207
+        logg("End Date:   %s\n", buffer);
192 208
     }
193 209
 
194 210
     optfree(opts);