~louis/ubuntu/trusty/clamav/lp799623_fix_logrotate

« back to all changes in this revision

Viewing changes to clamd/scanner.c

  • Committer: Package Import Robot
  • Author(s): Scott Kitterman
  • Date: 2014-02-01 11:06:17 UTC
  • mfrom: (0.35.37 sid)
  • Revision ID: package-import@ubuntu.com-20140201110617-33h2xxk09dep0ui4
Tags: 0.98.1+dfsg-1ubuntu1
* Merge from Debian unstable.  Remaining changes:
  - Drop build-dep on electric-fence (in Universe)
  - Add apparmor profiles for clamd and freshclam along with maintainer
    script changes
  - Add autopkgtest

Show diffs side-by-side

added added

removed removed

Lines of Context:
103
103
}
104
104
 
105
105
#define BUFFSIZE 1024
106
 
int scan_callback(struct stat *sb, char *filename, const char *msg, enum cli_ftw_reason reason, struct cli_ftw_cbdata *data)
 
106
int scan_callback(STATBUF *sb, char *filename, const char *msg, enum cli_ftw_reason reason, struct cli_ftw_cbdata *data)
107
107
{
108
108
    struct scan_cb_data *scandata = data->data;
109
 
    const char *virname;
 
109
    const char *virname = NULL;
110
110
    const char **virpp = &virname;
111
111
    int ret;
112
112
    int type = scandata->type;
225
225
        return CL_SUCCESS;
226
226
    }
227
227
 
228
 
    thrmgr_setactivetask(filename,
229
 
                         type == TYPE_MULTISCAN ? "MULTISCANFILE" : NULL);
 
228
    thrmgr_setactivetask(filename, NULL);
230
229
    context.filename = filename;
231
230
    context.virsize = 0;
232
231
    ret = cl_scanfile_callback(filename, virpp, &scandata->scanned, scandata->engine, scandata->options, &context);
234
233
 
235
234
    if (scandata->options & CL_SCAN_ALLMATCHES) {
236
235
        virpp = (const char **)*virpp; /* temp hack for scanall mode until api augmentation */
237
 
        virname = virpp[0];
 
236
        if (virpp) virname = virpp[0];
238
237
    }
239
238
 
240
239
    if (thrmgr_group_need_terminate(scandata->conn->group)) {
241
240
        free(filename);
242
 
        if (ret == CL_VIRUS && scandata->options & CL_SCAN_ALLMATCHES)
 
241
        if ((scandata->options & CL_SCAN_ALLMATCHES) && (virpp != &virname))
243
242
            free((void *)virpp);
244
243
        logg("*Client disconnected while scanjob was active\n");
245
244
        return ret == CL_ETIMEOUT ? ret : CL_BREAK;
246
245
    }
247
246
 
 
247
    if ((ret == CL_VIRUS) && (virname == NULL)) {
 
248
        logg("*%s: reported CL_VIRUS but no virname returned!\n", filename);
 
249
        ret = CL_EMEM;
 
250
    }
 
251
 
248
252
    if (ret == CL_VIRUS) {
249
253
        scandata->infected++;
250
254
        if (conn_reply_virus(scandata->conn, filename, virname) == -1) {
251
255
            free(filename);
252
 
            if (scandata->options & CL_SCAN_ALLMATCHES)
 
256
            if((scandata->options & CL_SCAN_ALLMATCHES) && (virpp != &virname))
253
257
                free((void *)virpp);
254
258
            return CL_ETIMEOUT;
255
259
        }
258
262
            while (NULL != virpp[i])
259
263
                if (conn_reply_virus(scandata->conn, filename, virpp[i++]) == -1) {
260
264
                    free(filename);
261
 
                    free((void *)virpp);
 
265
                    if (virpp != &virname)
 
266
                        free((void *)virpp);
262
267
                    return CL_ETIMEOUT;
263
268
                }
264
269
        }
277
282
    } else if (ret != CL_CLEAN) {
278
283
        scandata->errors++;
279
284
        if (conn_reply(scandata->conn, filename, cl_strerror(ret), "ERROR") == -1) {
 
285
            if((scandata->options & CL_SCAN_ALLMATCHES) && (virpp != &virname))
 
286
                free((void *)virpp);
280
287
            free(filename);
281
288
            return CL_ETIMEOUT;
282
289
        }
286
293
    }
287
294
 
288
295
    free(filename);
289
 
    if (ret == CL_VIRUS && scandata->options & CL_SCAN_ALLMATCHES)
 
296
    if((scandata->options & CL_SCAN_ALLMATCHES) && (virpp != &virname))
290
297
        free((void *)virpp);
291
298
    if(ret == CL_EMEM) /* stop scanning */
292
299
        return ret;
304
311
{
305
312
        struct scan_cb_data *scandata = data->data;
306
313
        const struct optstruct *opt;
307
 
        struct stat statbuf;
 
314
        STATBUF statbuf;
308
315
 
309
316
    if((opt = optget(scandata->opts, "ExcludePath"))->enabled) {
310
317
        while(opt) {
318
325
    }
319
326
 
320
327
    if(!optget(scandata->opts, "CrossFilesystems")->enabled) {
321
 
        if(stat(path, &statbuf) == 0) {
 
328
        if(CLAMSTAT(path, &statbuf) == 0) {
322
329
            if(statbuf.st_dev != scandata->dev) {
323
330
                if(scandata->type != TYPE_MULTISCAN)
324
331
                    conn_reply_single(scandata->conn, path, "Excluded (another filesystem)");
336
343
{
337
344
    int ret, fd = conn->scanfd;
338
345
        const char *virname;
339
 
        struct stat statbuf;
 
346
        STATBUF statbuf;
340
347
        struct cb_context context;
341
348
        char fdstr[32];
342
349
        const char*reply_fdstr;
353
360
            snprintf(fdstr, sizeof(fdstr), "fd[%d]", fd);
354
361
            reply_fdstr = fdstr;
355
362
        }
356
 
        if(fstat(fd, &statbuf) == -1 || !S_ISREG(statbuf.st_mode)) {
 
363
        if(FSTAT(fd, &statbuf) == -1 || !S_ISREG(statbuf.st_mode)) {
357
364
                logg("%s: Not a regular file. ERROR\n", fdstr);
358
365
                if (conn_reply(conn, reply_fdstr, "Not a regular file", "ERROR") == -1)
359
366
                    return CL_ETIMEOUT;
428
435
        if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
429
436
            continue;
430
437
 
431
 
        if(bind(sockfd, (struct sockaddr *) &server, sizeof(struct sockaddr_in)) == -1)
 
438
        if(bind(sockfd, (struct sockaddr *) &server, (socklen_t)sizeof(struct sockaddr_in)) == -1)
432
439
            closesocket(sockfd);
433
440
        else {
434
441
            bound = 1;
440
447
    timeout = optget(opts, "ReadTimeout")->numarg;
441
448
    firsttimeout = optget(opts, "CommandReadTimeout")->numarg;
442
449
 
443
 
    if(!bound && !portscan) {
 
450
    if(!bound) {
444
451
        logg("!ScanStream: Can't find any free port.\n");
445
452
        mdprintf(odesc, "Can't find any free port. ERROR%c", term);
446
 
        closesocket(sockfd);
447
453
        return -1;
448
454
    } else {
449
 
        listen(sockfd, 1);
 
455
        if (listen(sockfd, 1) == -1) {
 
456
        logg("!ScanStream: listen() error on socket. Error returned is %s.\n", strerror(errno));
 
457
        closesocket(sockfd);
 
458
        return -1;
 
459
    }
450
460
        if(mdprintf(odesc, "PORT %u%c", port, term) <= 0) {
451
461
            logg("!ScanStream: error transmitting port.\n");
452
462
            closesocket(sockfd);
464
474
    }
465
475
 
466
476
    addrlen = sizeof(peer);
467
 
    if((acceptd = accept(sockfd, (struct sockaddr *) &peer, &addrlen)) == -1) {
 
477
    if((acceptd = accept(sockfd, (struct sockaddr *) &peer, (socklen_t *)&addrlen)) == -1) {
468
478
        closesocket(sockfd);
469
479
        mdprintf(odesc, "accept() ERROR%c", term);
470
480
        logg("!ScanStream %u: accept() failed.\n", port);