diff --git a/clamd/session.c b/clamd/session.c index 9347897a5..5e1bcef91 100644 --- a/clamd/session.c +++ b/clamd/session.c @@ -265,8 +265,12 @@ int command(client_conn_t *conn, int *virus) thrmgr_setactivetask(NULL, "MULTISCAN"); type = TYPE_MULTISCAN; scandata.group = group = thrmgr_group_new(); - if (!group) - return CL_EMEM; + if (!group) { + if(optget(opts, "ExitOnOOM")->enabled) + return -1; + else + return 1; + } break; } case COMMAND_MULTISCANFILE: @@ -280,29 +284,34 @@ int command(client_conn_t *conn, int *virus) *virus = scandata.infected; if (ret == CL_BREAK) { thrmgr_group_terminate(conn->group); - return CL_BREAK; + return 1; } return scandata.errors > 0 ? scandata.errors : 0; case COMMAND_FILDES: thrmgr_setactivetask(NULL, "FILDES"); #ifdef HAVE_FD_PASSING - if (conn->scanfd == -1) + if (conn->scanfd == -1) { conn_reply_error(conn, "FILDES: didn't receive file descriptor."); + return 1; + } else { ret = scanfd(conn, NULL, engine, options, opts, desc, 0); if (ret == CL_VIRUS) { *virus = 1; + ret = 0; } else if (ret == CL_EMEM) { if(optget(opts, "ExitOnOOM")->enabled) ret = -1; + else + ret = 1; } else if (ret == CL_ETIMEOUT) { thrmgr_group_terminate(conn->group); ret = 1; } else ret = 0; + logg("$Closed fd %d\n", conn->scanfd); + close(conn->scanfd); } - logg("$Closed fd %d\n", conn->scanfd); - close(conn->scanfd); return ret; #else conn_reply_error(conn, "FILDES support not compiled in."); @@ -323,6 +332,8 @@ int command(client_conn_t *conn, int *virus) if (ret == CL_EMEM) { if(optget(opts, "ExitOnOOM")->enabled) return -1; + else + return 1; } return 0; case COMMAND_INSTREAMSCAN: @@ -330,9 +341,12 @@ int command(client_conn_t *conn, int *virus) ret = scanfd(conn, NULL, engine, options, opts, desc, 1); if (ret == CL_VIRUS) { *virus = 1; + ret = 0; } else if (ret == CL_EMEM) { if(optget(opts, "ExitOnOOM")->enabled) ret = -1; + else + ret = 1; } else if (ret == CL_ETIMEOUT) { thrmgr_group_terminate(conn->group); ret = 1; @@ -363,9 +377,12 @@ int command(client_conn_t *conn, int *virus) scandata.dev = sb.st_dev; ret = cli_ftw(conn->filename, flags, maxdirrec ? maxdirrec : INT_MAX, scan_callback, &data, scan_pathchk); - if (ret == CL_EMEM) + if (ret == CL_EMEM) { if(optget(opts, "ExitOnOOM")->enabled) return -1; + else + return 1; + } if (scandata.group && type == TYPE_MULTISCAN) { thrmgr_group_waitforall(group, &ok, &error, &total); pthread_mutex_lock(&conn->thrpool->pool_mutex);