Merge remote-tracking branch 'origin/topic/jsiwek/compiler-warnings'

* origin/topic/jsiwek/compiler-warnings:
  Fixing compiler warnings (addresses #388)
This commit is contained in:
Robin Sommer 2011-11-03 15:17:08 -07:00
commit 3b1f13b861
17 changed files with 82 additions and 75 deletions

View file

@ -1,4 +1,10 @@
2.0-beta-10 | 2011-11-03 15:17:08 -0700
* Notice framework documentation update. (Seth Hall)
* Fixing compiler warnings (addresses #388) (Jon Siwek)
2.0-beta | 2011-10-27 17:46:28 -0700 2.0-beta | 2011-10-27 17:46:28 -0700
* Preliminary fix for SSH login detection: we need a counted measure * Preliminary fix for SSH login detection: we need a counted measure

View file

@ -1 +1 @@
2.0-beta 2.0-beta-10

View file

@ -44,7 +44,7 @@ public:
if ( analyzer ) if ( analyzer )
analyzer->Weird("base64_illegal_encoding", msg); analyzer->Weird("base64_illegal_encoding", msg);
else else
reporter->Error(msg); reporter->Error("%s", msg);
} }
protected: protected:

View file

@ -522,7 +522,7 @@ ListVal* CompositeHash::RecoverVals(const HashKey* k) const
} }
if ( kp != k_end ) if ( kp != k_end )
reporter->InternalError("under-ran key in CompositeHash::DescribeKey %ld", k_end - kp); reporter->InternalError("under-ran key in CompositeHash::DescribeKey %zd", k_end - kp);
return l; return l;
} }

View file

@ -797,7 +797,7 @@ int dbg_handle_debug_input()
input_line = (char*) safe_malloc(1024); input_line = (char*) safe_malloc(1024);
input_line[1023] = 0; input_line[1023] = 0;
// ### Maybe it's not always stdin. // ### Maybe it's not always stdin.
fgets(input_line, 1023, stdin); input_line = fgets(input_line, 1023, stdin);
#endif #endif
// ### Maybe not stdin; maybe do better cleanup. // ### Maybe not stdin; maybe do better cleanup.

View file

@ -296,7 +296,7 @@ void ODesc::AddBytesRaw(const void* bytes, unsigned int n)
if ( ! write_failed ) if ( ! write_failed )
// Most likely it's a "disk full" so report // Most likely it's a "disk full" so report
// subsequent failures only once. // subsequent failures only once.
reporter->Error(fmt("error writing to %s: %s", f->Name(), strerror(errno))); reporter->Error("error writing to %s: %s", f->Name(), strerror(errno));
write_failed = true; write_failed = true;
return; return;

View file

@ -149,7 +149,7 @@ BroFile::BroFile(const char* arg_name, const char* arg_access, BroType* arg_t)
t = arg_t ? arg_t : base_type(TYPE_STRING); t = arg_t ? arg_t : base_type(TYPE_STRING);
if ( ! Open() ) if ( ! Open() )
{ {
reporter->Error(fmt("cannot open %s: %s", name, strerror(errno))); reporter->Error("cannot open %s: %s", name, strerror(errno));
is_open = 0; is_open = 0;
okay_to_manage = 0; okay_to_manage = 0;
} }
@ -641,7 +641,7 @@ void BroFile::InitEncrypt(const char* keyfile)
if ( ! key ) if ( ! key )
{ {
reporter->Error(fmt("can't open key file %s: %s", keyfile, strerror(errno))); reporter->Error("can't open key file %s: %s", keyfile, strerror(errno));
Close(); Close();
return; return;
} }
@ -649,8 +649,8 @@ void BroFile::InitEncrypt(const char* keyfile)
pub_key = PEM_read_PUBKEY(key, 0, 0, 0); pub_key = PEM_read_PUBKEY(key, 0, 0, 0);
if ( ! pub_key ) if ( ! pub_key )
{ {
reporter->Error(fmt("can't read key from %s: %s", keyfile, reporter->Error("can't read key from %s: %s", keyfile,
ERR_error_string(ERR_get_error(), 0))); ERR_error_string(ERR_get_error(), 0));
Close(); Close();
return; return;
} }
@ -671,8 +671,8 @@ void BroFile::InitEncrypt(const char* keyfile)
if ( ! EVP_SealInit(cipher_ctx, cipher_type, &psecret, if ( ! EVP_SealInit(cipher_ctx, cipher_type, &psecret,
(int*) &secret_len, iv, &pub_key, 1) ) (int*) &secret_len, iv, &pub_key, 1) )
{ {
reporter->Error(fmt("can't init cipher context for %s: %s", keyfile, reporter->Error("can't init cipher context for %s: %s", keyfile,
ERR_error_string(ERR_get_error(), 0))); ERR_error_string(ERR_get_error(), 0));
Close(); Close();
return; return;
} }
@ -684,8 +684,8 @@ void BroFile::InitEncrypt(const char* keyfile)
fwrite(secret, ntohl(secret_len), 1, f) && fwrite(secret, ntohl(secret_len), 1, f) &&
fwrite(iv, iv_len, 1, f)) ) fwrite(iv, iv_len, 1, f)) )
{ {
reporter->Error(fmt("can't write header to log file %s: %s", reporter->Error("can't write header to log file %s: %s",
name, strerror(errno))); name, strerror(errno));
Close(); Close();
return; return;
} }
@ -709,8 +709,8 @@ void BroFile::FinishEncrypt()
if ( outl && ! fwrite(cipher_buffer, outl, 1, f) ) if ( outl && ! fwrite(cipher_buffer, outl, 1, f) )
{ {
reporter->Error(fmt("write error for %s: %s", reporter->Error("write error for %s: %s",
name, strerror(errno))); name, strerror(errno));
return; return;
} }
@ -741,17 +741,17 @@ int BroFile::Write(const char* data, int len)
if ( ! EVP_SealUpdate(cipher_ctx, cipher_buffer, &outl, if ( ! EVP_SealUpdate(cipher_ctx, cipher_buffer, &outl,
(unsigned char*)data, inl) ) (unsigned char*)data, inl) )
{ {
reporter->Error(fmt("encryption error for %s: %s", reporter->Error("encryption error for %s: %s",
name, name,
ERR_error_string(ERR_get_error(), 0))); ERR_error_string(ERR_get_error(), 0));
Close(); Close();
return 0; return 0;
} }
if ( outl && ! fwrite(cipher_buffer, outl, 1, f) ) if ( outl && ! fwrite(cipher_buffer, outl, 1, f) )
{ {
reporter->Error(fmt("write error for %s: %s", reporter->Error("write error for %s: %s",
name, strerror(errno))); name, strerror(errno));
Close(); Close();
return 0; return 0;
} }
@ -798,7 +798,7 @@ void BroFile::UpdateFileSize()
struct stat s; struct stat s;
if ( fstat(fileno(f), &s) < 0 ) if ( fstat(fileno(f), &s) < 0 )
{ {
reporter->Error(fmt("can't stat fd for %s: %s", name, strerror(errno))); reporter->Error("can't stat fd for %s: %s", name, strerror(errno));
current_size = 0; current_size = 0;
return; return;
} }

View file

@ -74,11 +74,11 @@ void File_Analyzer::InitMagic(magic_t* magic, int flags)
*magic = magic_open(flags); *magic = magic_open(flags);
if ( ! *magic ) if ( ! *magic )
reporter->Error(fmt("can't init libmagic: %s", magic_error(*magic))); reporter->Error("can't init libmagic: %s", magic_error(*magic));
else if ( magic_load(*magic, 0) < 0 ) else if ( magic_load(*magic, 0) < 0 )
{ {
reporter->Error(fmt("can't load magic file: %s", magic_error(*magic))); reporter->Error("can't load magic file: %s", magic_error(*magic));
magic_close(*magic); magic_close(*magic);
*magic = 0; *magic = 0;
} }

View file

@ -1453,8 +1453,8 @@ bool LogMgr::Flush(EnumVal* id)
void LogMgr::Error(LogWriter* writer, const char* msg) void LogMgr::Error(LogWriter* writer, const char* msg)
{ {
reporter->Error(fmt("error with writer for %s: %s", reporter->Error("error with writer for %s: %s",
writer->Path().c_str(), msg)); writer->Path().c_str(), msg);
} }
// Timer which on dispatching rotates the filter. // Timer which on dispatching rotates the filter.

View file

@ -85,8 +85,8 @@ void OSFingerprint::collide(uint32 id)
if (sig[id].ttl % 32 && sig[id].ttl != 255 && sig[id].ttl % 30) if (sig[id].ttl % 32 && sig[id].ttl != 255 && sig[id].ttl % 30)
{ {
problems=1; problems=1;
reporter->Warning(fmt("OS fingerprinting: [!] Unusual TTL (%d) for signature '%s %s' (line %d).", reporter->Warning("OS fingerprinting: [!] Unusual TTL (%d) for signature '%s %s' (line %d).",
sig[id].ttl,sig[id].os,sig[id].desc,sig[id].line)); sig[id].ttl,sig[id].os,sig[id].desc,sig[id].line);
} }
for (i=0;i<id;i++) for (i=0;i<id;i++)
@ -94,8 +94,8 @@ void OSFingerprint::collide(uint32 id)
if (!strcmp(sig[i].os,sig[id].os) && if (!strcmp(sig[i].os,sig[id].os) &&
!strcmp(sig[i].desc,sig[id].desc)) { !strcmp(sig[i].desc,sig[id].desc)) {
problems=1; problems=1;
reporter->Warning(fmt("OS fingerprinting: [!] Duplicate signature name: '%s %s' (line %d and %d).", reporter->Warning("OS fingerprinting: [!] Duplicate signature name: '%s %s' (line %d and %d).",
sig[i].os,sig[i].desc,sig[i].line,sig[id].line)); sig[i].os,sig[i].desc,sig[i].line,sig[id].line);
} }
/* If TTLs are sufficiently away from each other, the risk of /* If TTLs are sufficiently away from each other, the risk of
@ -277,10 +277,10 @@ do_const:
if (sig[id].opt[j] ^ sig[i].opt[j]) goto reloop; if (sig[id].opt[j] ^ sig[i].opt[j]) goto reloop;
problems=1; problems=1;
reporter->Warning(fmt("OS fingerprinting: [!] Signature '%s %s' (line %d)\n" reporter->Warning("OS fingerprinting: [!] Signature '%s %s' (line %d)\n"
" is already covered by '%s %s' (line %d).", " is already covered by '%s %s' (line %d).",
sig[id].os,sig[id].desc,sig[id].line,sig[i].os,sig[i].desc, sig[id].os,sig[id].desc,sig[id].line,sig[i].os,sig[i].desc,
sig[i].line)); sig[i].line);
reloop: reloop:
; ;

View file

@ -88,7 +88,8 @@ bool LoadPolicyFileText(const char* policy_filename)
// ### This code is not necessarily Unicode safe! // ### This code is not necessarily Unicode safe!
// (probably fine with UTF-8) // (probably fine with UTF-8)
pf->filedata = new char[size+1]; pf->filedata = new char[size+1];
fread(pf->filedata, size, 1, f); if ( fread(pf->filedata, size, 1, f) != 1 )
reporter->InternalError("Failed to fread() file data");
pf->filedata[size] = 0; pf->filedata[size] = 0;
fclose(f); fclose(f);

View file

@ -392,7 +392,7 @@ static bool sendToIO(ChunkedIO* io, ChunkedIO::Chunk* c)
{ {
if ( ! io->Write(c) ) if ( ! io->Write(c) )
{ {
reporter->Warning(fmt("can't send chunk: %s", io->Error())); reporter->Warning("can't send chunk: %s", io->Error());
return false; return false;
} }
@ -404,7 +404,7 @@ static bool sendToIO(ChunkedIO* io, char msg_type, RemoteSerializer::PeerID id,
{ {
if ( ! sendCMsg(io, msg_type, id) ) if ( ! sendCMsg(io, msg_type, id) )
{ {
reporter->Warning(fmt("can't send message of type %d: %s", msg_type, io->Error())); reporter->Warning("can't send message of type %d: %s", msg_type, io->Error());
return false; return false;
} }
@ -419,7 +419,7 @@ static bool sendToIO(ChunkedIO* io, char msg_type, RemoteSerializer::PeerID id,
{ {
if ( ! sendCMsg(io, msg_type, id) ) if ( ! sendCMsg(io, msg_type, id) )
{ {
reporter->Warning(fmt("can't send message of type %d: %s", msg_type, io->Error())); reporter->Warning("can't send message of type %d: %s", msg_type, io->Error());
return false; return false;
} }
@ -715,7 +715,7 @@ bool RemoteSerializer::CloseConnection(PeerID id)
Peer* peer = LookupPeer(id, true); Peer* peer = LookupPeer(id, true);
if ( ! peer ) if ( ! peer )
{ {
reporter->Error(fmt("unknown peer id %d for closing connection", int(id))); reporter->Error("unknown peer id %d for closing connection", int(id));
return false; return false;
} }
@ -750,14 +750,14 @@ bool RemoteSerializer::RequestSync(PeerID id, bool auth)
Peer* peer = LookupPeer(id, true); Peer* peer = LookupPeer(id, true);
if ( ! peer ) if ( ! peer )
{ {
reporter->Error(fmt("unknown peer id %d for request sync", int(id))); reporter->Error("unknown peer id %d for request sync", int(id));
return false; return false;
} }
if ( peer->phase != Peer::HANDSHAKE ) if ( peer->phase != Peer::HANDSHAKE )
{ {
reporter->Error(fmt("can't request sync from peer; wrong phase %d", reporter->Error("can't request sync from peer; wrong phase %d",
peer->phase)); peer->phase);
return false; return false;
} }
@ -777,14 +777,14 @@ bool RemoteSerializer::RequestLogs(PeerID id)
Peer* peer = LookupPeer(id, true); Peer* peer = LookupPeer(id, true);
if ( ! peer ) if ( ! peer )
{ {
reporter->Error(fmt("unknown peer id %d for request logs", int(id))); reporter->Error("unknown peer id %d for request logs", int(id));
return false; return false;
} }
if ( peer->phase != Peer::HANDSHAKE ) if ( peer->phase != Peer::HANDSHAKE )
{ {
reporter->Error(fmt("can't request logs from peer; wrong phase %d", reporter->Error("can't request logs from peer; wrong phase %d",
peer->phase)); peer->phase);
return false; return false;
} }
@ -802,14 +802,14 @@ bool RemoteSerializer::RequestEvents(PeerID id, RE_Matcher* pattern)
Peer* peer = LookupPeer(id, true); Peer* peer = LookupPeer(id, true);
if ( ! peer ) if ( ! peer )
{ {
reporter->Error(fmt("unknown peer id %d for request sync", int(id))); reporter->Error("unknown peer id %d for request sync", int(id));
return false; return false;
} }
if ( peer->phase != Peer::HANDSHAKE ) if ( peer->phase != Peer::HANDSHAKE )
{ {
reporter->Error(fmt("can't request events from peer; wrong phase %d", reporter->Error("can't request events from peer; wrong phase %d",
peer->phase)); peer->phase);
return false; return false;
} }
@ -869,8 +869,8 @@ bool RemoteSerializer::CompleteHandshake(PeerID id)
if ( p->phase != Peer::HANDSHAKE ) if ( p->phase != Peer::HANDSHAKE )
{ {
reporter->Error(fmt("can't complete handshake; wrong phase %d", reporter->Error("can't complete handshake; wrong phase %d",
p->phase)); p->phase);
return false; return false;
} }
@ -1138,7 +1138,7 @@ bool RemoteSerializer::SendCaptureFilter(PeerID id, const char* filter)
if ( peer->phase != Peer::HANDSHAKE ) if ( peer->phase != Peer::HANDSHAKE )
{ {
reporter->Error(fmt("can't sent capture filter to peer; wrong phase %d", peer->phase)); reporter->Error("can't sent capture filter to peer; wrong phase %d", peer->phase);
return false; return false;
} }
@ -1215,8 +1215,8 @@ bool RemoteSerializer::SendCapabilities(Peer* peer)
{ {
if ( peer->phase != Peer::HANDSHAKE ) if ( peer->phase != Peer::HANDSHAKE )
{ {
reporter->Error(fmt("can't sent capabilties to peer; wrong phase %d", reporter->Error("can't sent capabilties to peer; wrong phase %d",
peer->phase)); peer->phase);
return false; return false;
} }
@ -3011,8 +3011,8 @@ bool RemoteSerializer::SendCMsgToChild(char msg_type, Peer* peer)
{ {
if ( ! sendCMsg(io, msg_type, peer ? peer->id : PEER_NONE) ) if ( ! sendCMsg(io, msg_type, peer ? peer->id : PEER_NONE) )
{ {
reporter->Warning(fmt("can't send message of type %d: %s", reporter->Warning("can't send message of type %d: %s",
msg_type, io->Error())); msg_type, io->Error());
return false; return false;
} }
return true; return true;

View file

@ -19,7 +19,7 @@ SerialObj* SerialObj::Instantiate(SerialType type)
return o; return o;
} }
reporter->Error(fmt("Unknown object type 0x%08x", type)); reporter->Error("Unknown object type 0x%08x", type);
return 0; return 0;
} }
@ -29,7 +29,7 @@ const char* SerialObj::ClassName(SerialType type)
if ( f != names->end() ) if ( f != names->end() )
return f->second; return f->second;
reporter->Error(fmt("Unknown object type 0x%08x", type)); reporter->Error("Unknown object type 0x%08x", type);
return "<no-class-name>"; return "<no-class-name>";
} }

View file

@ -350,7 +350,7 @@ void StateAccess::Replay()
v->AsRecordVal()->Assign(idx, op2 ? op2->Ref() : 0); v->AsRecordVal()->Assign(idx, op2 ? op2->Ref() : 0);
} }
else else
reporter->Error(fmt("access replay: unknown record field %s for assign", field)); reporter->Error("access replay: unknown record field %s for assign", field);
} }
else if ( t == TYPE_VECTOR ) else if ( t == TYPE_VECTOR )
@ -411,7 +411,7 @@ void StateAccess::Replay()
v->AsRecordVal()->Assign(idx, new_val, OP_INCR); v->AsRecordVal()->Assign(idx, new_val, OP_INCR);
} }
else else
reporter->Error(fmt("access replay: unknown record field %s for assign", field)); reporter->Error("access replay: unknown record field %s for assign", field);
} }
else if ( t == TYPE_VECTOR ) else if ( t == TYPE_VECTOR )

View file

@ -2181,7 +2181,7 @@ function send_id%(p: event_peer, id: string%) : bool
ID* i = global_scope()->Lookup(id->CheckString()); ID* i = global_scope()->Lookup(id->CheckString());
if ( ! i ) if ( ! i )
{ {
reporter->Error(fmt("send_id: no global id %s", id->CheckString())); reporter->Error("send_id: no global id %s", id->CheckString());
return new Val(0, TYPE_BOOL); return new Val(0, TYPE_BOOL);
} }
@ -2250,7 +2250,7 @@ function get_event_peer%(%) : event_peer
Val* v = remote_serializer->GetPeerVal(src); Val* v = remote_serializer->GetPeerVal(src);
if ( ! v ) if ( ! v )
{ {
reporter->Error(fmt("peer %d does not exist anymore", int(src))); reporter->Error("peer %d does not exist anymore", int(src));
RecordVal* p = mgr.GetLocalPeerVal(); RecordVal* p = mgr.GetLocalPeerVal();
Ref(p); Ref(p);
return p; return p;
@ -3295,13 +3295,13 @@ function identify_data%(data: string, return_mime: bool%): string
if ( ! *magic ) if ( ! *magic )
{ {
reporter->Error(fmt("can't init libmagic: %s", magic_error(*magic))); reporter->Error("can't init libmagic: %s", magic_error(*magic));
return new StringVal(""); return new StringVal("");
} }
if ( magic_load(*magic, 0) < 0 ) if ( magic_load(*magic, 0) < 0 )
{ {
reporter->Error(fmt("can't load magic file: %s", magic_error(*magic))); reporter->Error("can't load magic file: %s", magic_error(*magic));
magic_close(*magic); magic_close(*magic);
*magic = 0; *magic = 0;
return new StringVal(""); return new StringVal("");

View file

@ -1030,7 +1030,7 @@ void clear_reST_doc_comments()
if ( ! reST_doc_comments ) if ( ! reST_doc_comments )
return; return;
fprintf(stderr, "Warning: %lu unconsumed reST comments:\n", fprintf(stderr, "Warning: %zu unconsumed reST comments:\n",
reST_doc_comments->size()); reST_doc_comments->size());
print_current_reST_doc_comments(); print_current_reST_doc_comments();

View file

@ -478,22 +478,22 @@ bool ensure_dir(const char *dirname)
{ {
if ( errno != ENOENT ) if ( errno != ENOENT )
{ {
reporter->Warning(fmt("can't stat directory %s: %s", reporter->Warning("can't stat directory %s: %s",
dirname, strerror(errno))); dirname, strerror(errno));
return false; return false;
} }
if ( mkdir(dirname, 0700) < 0 ) if ( mkdir(dirname, 0700) < 0 )
{ {
reporter->Warning(fmt("can't create directory %s: %s", reporter->Warning("can't create directory %s: %s",
dirname, strerror(errno))); dirname, strerror(errno));
return false; return false;
} }
} }
else if ( ! S_ISDIR(st.st_mode) ) else if ( ! S_ISDIR(st.st_mode) )
{ {
reporter->Warning(fmt("%s exists but is not a directory", dirname)); reporter->Warning("%s exists but is not a directory", dirname);
return false; return false;
} }
@ -506,7 +506,7 @@ bool is_dir(const char* path)
if ( stat(path, &st) < 0 ) if ( stat(path, &st) < 0 )
{ {
if ( errno != ENOENT ) if ( errno != ENOENT )
reporter->Warning(fmt("can't stat %s: %s", path, strerror(errno))); reporter->Warning("can't stat %s: %s", path, strerror(errno));
return false; return false;
} }
@ -556,15 +556,15 @@ static bool read_random_seeds(const char* read_file, uint32* seed,
if ( stat(read_file, &st) < 0 ) if ( stat(read_file, &st) < 0 )
{ {
reporter->Warning(fmt("Seed file '%s' does not exist: %s", reporter->Warning("Seed file '%s' does not exist: %s",
read_file, strerror(errno))); read_file, strerror(errno));
return false; return false;
} }
if ( ! (f = fopen(read_file, "r")) ) if ( ! (f = fopen(read_file, "r")) )
{ {
reporter->Warning(fmt("Could not open seed file '%s': %s", reporter->Warning("Could not open seed file '%s': %s",
read_file, strerror(errno))); read_file, strerror(errno));
return false; return false;
} }
@ -599,8 +599,8 @@ static bool write_random_seeds(const char* write_file, uint32 seed,
if ( ! (f = fopen(write_file, "w+")) ) if ( ! (f = fopen(write_file, "w+")) )
{ {
reporter->Warning(fmt("Could not create seed file '%s': %s", reporter->Warning("Could not create seed file '%s': %s",
write_file, strerror(errno))); write_file, strerror(errno));
return false; return false;
} }
@ -1024,7 +1024,7 @@ FILE* rotate_file(const char* name, RecordVal* rotate_info)
FILE* newf = fopen(tmpname, "w"); FILE* newf = fopen(tmpname, "w");
if ( ! newf ) if ( ! newf )
{ {
reporter->Error(fmt("rotate_file: can't open %s: %s", tmpname, strerror(errno))); reporter->Error("rotate_file: can't open %s: %s", tmpname, strerror(errno));
return 0; return 0;
} }
@ -1033,7 +1033,7 @@ FILE* rotate_file(const char* name, RecordVal* rotate_info)
struct stat dummy; struct stat dummy;
if ( link(name, newname) < 0 || stat(newname, &dummy) < 0 ) if ( link(name, newname) < 0 || stat(newname, &dummy) < 0 )
{ {
reporter->Error(fmt("rotate_file: can't move %s to %s: %s", name, newname, strerror(errno))); reporter->Error("rotate_file: can't move %s to %s: %s", name, newname, strerror(errno));
fclose(newf); fclose(newf);
unlink(newname); unlink(newname);
unlink(tmpname); unlink(tmpname);
@ -1043,7 +1043,7 @@ FILE* rotate_file(const char* name, RecordVal* rotate_info)
// Close current file, and move the tmp to its place. // Close current file, and move the tmp to its place.
if ( unlink(name) < 0 || link(tmpname, name) < 0 || unlink(tmpname) < 0 ) if ( unlink(name) < 0 || link(tmpname, name) < 0 || unlink(tmpname) < 0 )
{ {
reporter->Error(fmt("rotate_file: can't move %s to %s: %s", tmpname, name, strerror(errno))); reporter->Error("rotate_file: can't move %s to %s: %s", tmpname, name, strerror(errno));
exit(1); // hard to fix, but shouldn't happen anyway... exit(1); // hard to fix, but shouldn't happen anyway...
} }