Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions ChangeLog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2295,3 +2295,6 @@ Version 1.8.0p5, 12 May 1996
36789.foo
(an understandable typo for #6789.foo) stopped compiling when found in a
database made by a pre-1.8.0 server.

Version X, in progress
-- Trapped various error conditions formerly ignored.
12 changes: 8 additions & 4 deletions db_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ dbpriv_set_dbio_input(FILE * f)
void
dbio_read_line(char *s, int n)
{
fgets(s, n, input);
if (!fgets(s, n, input)) {
errlog("DBIO_READ_LINE: Error or end of file reading db\n");
if (n)
*s = '\0';
}
}

int
Expand Down Expand Up @@ -133,7 +137,7 @@ dbio_read_num(void)
char *p;
int i;

fgets(s, 20, input);
dbio_read_line(s, 20);
i = strtol(s, &p, 10);
if (isspace(*s) || *p != '\n')
errlog("DBIO_READ_NUM: Bad number: \"%s\" at file pos. %ld\n",
Expand All @@ -148,7 +152,7 @@ dbio_read_float(void)
char *p;
double d;

fgets(s, 40, input);
dbio_read_line(s, 40);
d = strtod(s, &p);
if (isspace(*s) || *p != '\n')
errlog("DBIO_READ_FLOAT: Bad number: \"%s\" at file pos. %ld\n",
Expand All @@ -173,7 +177,7 @@ dbio_read_string(void)
str = new_stream(1024);

try_again:
fgets(buffer, sizeof(buffer), input);
dbio_read_line(buffer, sizeof(buffer));
len = strlen(buffer);
if (len == sizeof(buffer) - 1 && buffer[len - 1] != '\n') {
stream_add_string(str, buffer);
Expand Down
44 changes: 31 additions & 13 deletions name_lookup.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,11 @@ spawn_pipe(void (*child_proc) (int to_parent, int from_parent),
log_perror("SPAWNING: Couldn't fork child");
exit(1);
} else if (pid != 0) { /* still the middleman */
write(pipe_from_child[1], &pid, sizeof(pid));
if (write(pipe_from_child[1], &pid, sizeof(pid)) != sizeof(pid))
{
log_perror("SPAWNING: Write to child pipe failed");
exit(1);
}
exit(0);
} else { /* finally, the child */
(*child_proc) (pipe_from_child[1], pipe_to_child[0]);
Expand Down Expand Up @@ -183,14 +187,16 @@ lookup(int to_intermediary, int from_intermediary)
*/
e = gethostbyname((void *) buffer);
cancel_timer(id);
if (e && e->h_length == sizeof(unsigned32))
write(to_intermediary, e->h_addr_list[0], e->h_length);
else {
if (e && e->h_length == sizeof(unsigned32)) {
if (write(to_intermediary, e->h_addr_list[0], e->h_length) != e->h_length)
_exit(1);
} else {
unsigned32 addr;

/* This cast is for the same reason as the one above... */
addr = inet_addr((void *) buffer);
write(to_intermediary, &addr, sizeof(addr));
if (write(to_intermediary, &addr, sizeof(addr)) != sizeof(addr))
_exit(1);
}
} else {
const char *host_name;
Expand All @@ -202,8 +208,10 @@ lookup(int to_intermediary, int from_intermediary)
cancel_timer(id);
host_name = e ? e->h_name : "";
length = strlen(host_name);
write(to_intermediary, &length, sizeof(length));
write(to_intermediary, host_name, length);
if (write(to_intermediary, &length, sizeof(length)) != sizeof(length))
_exit(1);
if (write(to_intermediary, host_name, length) != length)
_exit(1);
}
}
}
Expand Down Expand Up @@ -255,18 +263,25 @@ intermediary(int to_server, int from_server)
if (!lookup_pid) /* Restart lookup if it's died */
restart_lookup();
if (lookup_pid) { /* Only try to deal with lookup if alive */
write(to_lookup, &req, sizeof(req));
if (req.kind == REQ_ADDR_FROM_NAME) {
write(to_lookup, buffer, req.u.length);
if (write(to_lookup, &req, sizeof(req)) != sizeof(req))
goto lookup_dead;
if (write(to_lookup, buffer, req.u.length) != req.u.length)
goto lookup_dead;
if (robust_read(from_lookup, &addr, sizeof(addr))
!= sizeof(addr)) {
lookup_dead:
restart_lookup();
addr = 0;
}
write(to_server, &addr, sizeof(addr));
if (write(to_server, &addr, sizeof(addr)) != sizeof(addr))
_exit(1);
} else {
if (write(to_lookup, &req, sizeof(req)) != sizeof(req))
goto lookup_dead_B;
if (robust_read(from_lookup, &len, sizeof(len))
!= sizeof(len)) {
lookup_dead_B:
restart_lookup();
len = 0;
} else {
Expand All @@ -277,14 +292,17 @@ intermediary(int to_server, int from_server)
len = 0;
}
}
write(to_server, &len, sizeof(len));
if (write(to_server, &len, sizeof(len)) != sizeof(len))
_exit(1);
if (len > 0)
write(to_server, buffer, len);
if (write(to_server, buffer, len) != len)
_exit(1);
}
} else { /* Lookup dead and wouldn't restart ... */
int failure = 0;

write(to_server, &failure, sizeof(failure));
if (write(to_server, &failure, sizeof(failure)) != sizeof(failure))
_exit(1);
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion server.c
Original file line number Diff line number Diff line change
Expand Up @@ -606,7 +606,8 @@ read_stdin_line()
s = new_stream(100);

do { /* Read even a very long line of input */
fgets(buffer, sizeof(buffer), stdin);
if (!fgets(buffer, sizeof(buffer), stdin))
return NULL;
buflen = strlen(buffer);
if (buflen == 0)
return 0;
Expand Down