mirror of
https://github.com/zeek/zeek.git
synced 2025-10-09 10:08:20 +00:00
Improve return value checking and error handling.
This commit is contained in:
parent
4b24cebad9
commit
daf5d0d098
14 changed files with 101 additions and 33 deletions
|
@ -5435,7 +5435,7 @@ TraversalCode ListExpr::Traverse(TraversalCallback* cb) const
|
|||
|
||||
loop_over_list(exprs, i)
|
||||
{
|
||||
exprs[i]->Traverse(cb);
|
||||
tc = exprs[i]->Traverse(cb);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
}
|
||||
|
||||
|
|
13
src/Obj.cc
13
src/Obj.cc
|
@ -28,11 +28,14 @@ bool Location::DoSerialize(SerialInfo* info) const
|
|||
{
|
||||
DO_SERIALIZE(SER_LOCATION, SerialObj);
|
||||
info->s->WriteOpenTag("Location");
|
||||
SERIALIZE(filename);
|
||||
SERIALIZE(first_line);
|
||||
SERIALIZE(last_line);
|
||||
SERIALIZE(first_column);
|
||||
SERIALIZE(last_column);
|
||||
|
||||
if ( ! (SERIALIZE(filename) &&
|
||||
SERIALIZE(first_line) &&
|
||||
SERIALIZE(last_line) &&
|
||||
SERIALIZE(first_column) &&
|
||||
SERIALIZE(last_column)) )
|
||||
return false;
|
||||
|
||||
info->s->WriteCloseTag("Location");
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <map>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
@ -80,7 +81,12 @@ bool LoadPolicyFileText(const char* policy_filename)
|
|||
policy_files.insert(PolicyFileMap::value_type(policy_filename, pf));
|
||||
|
||||
struct stat st;
|
||||
fstat(fileno(f), &st);
|
||||
if ( fstat(fileno(f), &st) != 0 )
|
||||
{
|
||||
char buf[256];
|
||||
strerror_r(errno, buf, sizeof(buf));
|
||||
reporter->InternalError("fstat failed on %s: %s", policy_filename, buf);
|
||||
}
|
||||
|
||||
pf->lmtime = st.st_mtime;
|
||||
off_t size = st.st_size;
|
||||
|
|
|
@ -319,7 +319,8 @@ public:
|
|||
\
|
||||
if ( has_it ) \
|
||||
{ \
|
||||
info->s->Read(&dst, 0, "has_" #dst); \
|
||||
if ( ! info->s->Read(&dst, 0, "has_" #dst) ) \
|
||||
return false; \
|
||||
if ( ! dst ) \
|
||||
return false; \
|
||||
} \
|
||||
|
@ -339,7 +340,11 @@ public:
|
|||
\
|
||||
if ( has_it ) \
|
||||
{ \
|
||||
info->s->Read(&dst, 0, "has_" #dst); \
|
||||
if ( ! info->s->Read(&dst, 0, "has_" #dst) ) \
|
||||
{ \
|
||||
delete del; \
|
||||
return 0; \
|
||||
} \
|
||||
if ( ! dst ) \
|
||||
{ \
|
||||
delete del; \
|
||||
|
|
|
@ -136,7 +136,12 @@ bool Serializer::Serialize(SerialInfo* info, const char* func, val_list* args)
|
|||
Write(network_time, "time");
|
||||
Write(a, "len");
|
||||
|
||||
loop_over_list(*args, i) (*args)[i]->Serialize(info);
|
||||
loop_over_list(*args, i)
|
||||
if ( ! (*args)[i]->Serialize(info) )
|
||||
{
|
||||
Error("failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
WriteCloseTag("call");
|
||||
WriteSeparator();
|
||||
|
|
|
@ -179,7 +179,8 @@ unsigned int BroType::MemoryAllocation() const
|
|||
bool BroType::Serialize(SerialInfo* info) const
|
||||
{
|
||||
// We always send full types (see below).
|
||||
SERIALIZE(true);
|
||||
if ( ! SERIALIZE(true) )
|
||||
return false;
|
||||
|
||||
bool ret = SerialObj::Serialize(info);
|
||||
return ret;
|
||||
|
|
19
src/Val.cc
19
src/Val.cc
|
@ -81,7 +81,9 @@ Val* Val::Clone() const
|
|||
SerialInfo sinfo(&ss);
|
||||
sinfo.cache = false;
|
||||
|
||||
this->Serialize(&sinfo);
|
||||
if ( ! this->Serialize(&sinfo) )
|
||||
return 0;
|
||||
|
||||
char* data;
|
||||
uint32 len = form->EndWrite(&data);
|
||||
form->StartRead(data, len);
|
||||
|
@ -2326,7 +2328,7 @@ bool TableVal::DoSerialize(SerialInfo* info) const
|
|||
else
|
||||
reporter->InternalError("unknown continuation state");
|
||||
|
||||
HashKey* k;
|
||||
HashKey* k = 0;
|
||||
int count = 0;
|
||||
|
||||
assert((!info->cont.ChildSuspended()) || state->v);
|
||||
|
@ -2339,12 +2341,21 @@ bool TableVal::DoSerialize(SerialInfo* info) const
|
|||
if ( ! state->c )
|
||||
{
|
||||
// No next one.
|
||||
SERIALIZE(false);
|
||||
if ( ! SERIALIZE(false) )
|
||||
{
|
||||
delete k;
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// There's a value coming.
|
||||
SERIALIZE(true);
|
||||
if ( ! SERIALIZE(true) )
|
||||
{
|
||||
delete k;
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( state->v->Value() )
|
||||
state->v->Ref();
|
||||
|
|
|
@ -95,6 +95,18 @@ void Raw::ClosePipeEnd(int i)
|
|||
pipes[i] = -1;
|
||||
}
|
||||
|
||||
bool Raw::SetFDFlags(int fd, int cmd, int flags)
|
||||
{
|
||||
if ( fcntl(fd, cmd, flags) != -1 )
|
||||
return true;
|
||||
|
||||
char buf[256];
|
||||
strerror_r(errno, buf, sizeof(buf));
|
||||
Error(Fmt("failed to set fd flags: %s", buf));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool Raw::LockForkMutex()
|
||||
{
|
||||
int res = pthread_mutex_lock(&fork_mutex);
|
||||
|
@ -200,11 +212,13 @@ bool Raw::Execute()
|
|||
ClosePipeEnd(stdout_out);
|
||||
|
||||
if ( Info().mode == MODE_STREAM )
|
||||
fcntl(pipes[stdout_in], F_SETFL, O_NONBLOCK);
|
||||
if ( ! SetFDFlags(pipes[stdout_in], F_SETFL, O_NONBLOCK) )
|
||||
return false;
|
||||
|
||||
ClosePipeEnd(stdin_in);
|
||||
|
||||
if ( stdin_towrite )
|
||||
{
|
||||
// Ya, just always set this to nonblocking. we do not
|
||||
// want to block on a program receiving data. Note
|
||||
// that there is a small gotcha with it. More data is
|
||||
|
@ -213,14 +227,19 @@ bool Raw::Execute()
|
|||
// mode_manual where the first write cannot write
|
||||
// everything, the rest will be stuck in a queue that
|
||||
// is never emptied.
|
||||
fcntl(pipes[stdin_out], F_SETFL, O_NONBLOCK);
|
||||
if ( ! SetFDFlags(pipes[stdin_out], F_SETFL, O_NONBLOCK) )
|
||||
return false;
|
||||
}
|
||||
else
|
||||
ClosePipeEnd(stdin_out);
|
||||
|
||||
ClosePipeEnd(stderr_out);
|
||||
|
||||
if ( use_stderr )
|
||||
fcntl(pipes[stderr_in], F_SETFL, O_NONBLOCK); // true for this too.
|
||||
{
|
||||
if ( ! SetFDFlags(pipes[stderr_in], F_SETFL, O_NONBLOCK) )
|
||||
return false;
|
||||
}
|
||||
else
|
||||
ClosePipeEnd(stderr_in);
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ protected:
|
|||
|
||||
private:
|
||||
void ClosePipeEnd(int i);
|
||||
bool SetFDFlags(int fd, int cmd, int flags);
|
||||
bool LockForkMutex();
|
||||
bool UnlockForkMutex();
|
||||
|
||||
|
|
|
@ -242,17 +242,6 @@ public:
|
|||
* Note: Exactly one of the two FinishedRotation() methods must be
|
||||
* called by a writer's implementation of DoRotate() once rotation
|
||||
* has finished.
|
||||
*
|
||||
* @param new_name The filename of the rotated file.
|
||||
*
|
||||
* @param old_name The filename of the original file.
|
||||
*
|
||||
* @param open: The timestamp when the original file was opened.
|
||||
*
|
||||
* @param close: The timestamp when the origina file was closed.
|
||||
*
|
||||
* @param terminating: True if the original rotation request occured
|
||||
* due to the main Bro process shutting down.
|
||||
*/
|
||||
bool FinishedRotation();
|
||||
|
||||
|
|
|
@ -261,7 +261,16 @@ bool Ascii::DoRotate(const char* rotated_path, double open, double close, bool t
|
|||
CloseFile(close);
|
||||
|
||||
string nname = string(rotated_path) + "." + LogExt();
|
||||
rename(fname.c_str(), nname.c_str());
|
||||
|
||||
if ( rename(fname.c_str(), nname.c_str()) != 0 )
|
||||
{
|
||||
char buf[256];
|
||||
strerror_r(errno, buf, sizeof(buf));
|
||||
Error(Fmt("failed to rename %s to %s: %s", fname.c_str(),
|
||||
nname.c_str(), buf));
|
||||
FinishedRotation();
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( ! FinishedRotation(nname.c_str(), fname.c_str(), open, close, terminating) )
|
||||
{
|
||||
|
|
|
@ -423,7 +423,16 @@ bool DataSeries::DoRotate(const char* rotated_path, double open, double close, b
|
|||
|
||||
string dsname = string(Info().path) + ".ds";
|
||||
string nname = string(rotated_path) + ".ds";
|
||||
rename(dsname.c_str(), nname.c_str());
|
||||
|
||||
if ( rename(dsname.c_str(), nname.c_str()) != 0 )
|
||||
{
|
||||
char buf[256];
|
||||
strerror_r(errno, buf, sizeof(buf));
|
||||
Error(Fmt("failed to rename %s to %s: %s", dsname.c_str(),
|
||||
nname.c_str(), buf));
|
||||
FinishedRotation();
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( ! FinishedRotation(nname.c_str(), dsname.c_str(), open, close, terminating) )
|
||||
{
|
||||
|
|
|
@ -782,7 +782,10 @@ int main(int argc, char** argv)
|
|||
bro_init_magic(&magic_desc_cookie, MAGIC_NONE);
|
||||
bro_init_magic(&magic_mime_cookie, MAGIC_MIME);
|
||||
|
||||
sqlite3_initialize();
|
||||
int r = sqlite3_initialize();
|
||||
|
||||
if ( r != SQLITE_OK )
|
||||
reporter->Error("Failed to initialize sqlite3: %s", sqlite3_errstr(r));
|
||||
|
||||
// FIXME: On systems that don't provide /dev/urandom, OpenSSL doesn't
|
||||
// seed the PRNG. We should do this here (but at least Linux, FreeBSD
|
||||
|
|
|
@ -935,7 +935,7 @@ static const char* check_for_dir(const char* filename, bool load_pkgs)
|
|||
return copy_string(filename);
|
||||
}
|
||||
|
||||
FILE* open_file(const char* filename, const char** full_filename, bool load_pkgs)
|
||||
static FILE* open_file(const char* filename, const char** full_filename, bool load_pkgs)
|
||||
{
|
||||
filename = check_for_dir(filename, load_pkgs);
|
||||
|
||||
|
@ -944,6 +944,13 @@ FILE* open_file(const char* filename, const char** full_filename, bool load_pkgs
|
|||
|
||||
FILE* f = fopen(filename, "r");
|
||||
|
||||
if ( ! f )
|
||||
{
|
||||
char buf[256];
|
||||
strerror_r(errno, buf, sizeof(buf));
|
||||
reporter->Error("Failed to open file %s: %s", filename, buf);
|
||||
}
|
||||
|
||||
delete [] filename;
|
||||
|
||||
return f;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue