| ... | ... |
@@ -1,3 +1,12 @@ |
| 1 |
+Wed Feb 18 21:39:08 EET 2009 (edwin) |
|
| 2 |
+------------------------------------ |
|
| 3 |
+ * clamav-milter/netcode.c, clamd/others.c, clamd/server-th.c, |
|
| 4 |
+ clamd/session.c: Fix wrong use of strerror_r: it doesn't have to |
|
| 5 |
+ use/fill the buffer, it can return a pointer to a static location, |
|
| 6 |
+ as described in the manpage. This can happen on a Linux system with |
|
| 7 |
+ a foreign locale, where the LANG=C messages are returned this way. |
|
| 8 |
+ (BB #1403) |
|
| 9 |
+ |
|
| 1 | 10 |
Wed Feb 18 21:08:50 EET 2009 (edwin) |
| 2 | 11 |
------------------------------------ |
| 3 | 12 |
* clamd/server-th.c, unit_tests/check_clamd.c, |
| ... | ... |
@@ -75,21 +75,18 @@ static int nc_socket(struct CP_ENTRY *cpe) {
|
| 75 | 75 |
char er[256]; |
| 76 | 76 |
|
| 77 | 77 |
if (s == -1) {
|
| 78 |
- strerror_r(errno, er, sizeof(er)); |
|
| 79 |
- logg("!Failed to create socket: %s\n", er);
|
|
| 78 |
+ logg("!Failed to create socket: %s\n", strerror_r(errno, er, sizeof(er)));
|
|
| 80 | 79 |
return -1; |
| 81 | 80 |
} |
| 82 | 81 |
flags = fcntl(s, F_GETFL, 0); |
| 83 | 82 |
if (flags == -1) {
|
| 84 |
- strerror_r(errno, er, sizeof(er)); |
|
| 85 |
- logg("!fcntl_get failed: %s\n", er);
|
|
| 83 |
+ logg("!fcntl_get failed: %s\n", strerror_r(errno, er, sizeof(er)));
|
|
| 86 | 84 |
close(s); |
| 87 | 85 |
return -1; |
| 88 | 86 |
} |
| 89 | 87 |
flags |= O_NONBLOCK; |
| 90 | 88 |
if (fcntl(s, F_SETFL, flags) == -1) {
|
| 91 |
- strerror_r(errno, er, sizeof(er)); |
|
| 92 |
- logg("!fcntl_set failed: %s\n", er);
|
|
| 89 |
+ logg("!fcntl_set failed: %s\n", strerror_r(errno, er, sizeof(er)));
|
|
| 93 | 90 |
close(s); |
| 94 | 91 |
return -1; |
| 95 | 92 |
} |
| ... | ... |
@@ -105,8 +102,7 @@ static int nc_connect(int s, struct CP_ENTRY *cpe) {
|
| 105 | 105 |
|
| 106 | 106 |
if (!res) return 0; |
| 107 | 107 |
if (errno != EINPROGRESS) {
|
| 108 |
- strerror_r(errno, er, sizeof(er)); |
|
| 109 |
- logg("*connect failed: %s\n", er);
|
|
| 108 |
+ logg("*connect failed: %s\n", strerror_r(errno, er, sizeof(er)));
|
|
| 110 | 109 |
close(s); |
| 111 | 110 |
return -1; |
| 112 | 111 |
} |
| ... | ... |
@@ -158,8 +154,7 @@ int nc_send(int s, const void *buff, size_t len) {
|
| 158 | 158 |
continue; |
| 159 | 159 |
} |
| 160 | 160 |
if(errno != EAGAIN && errno != EWOULDBLOCK) {
|
| 161 |
- strerror_r(errno, er, sizeof(er)); |
|
| 162 |
- logg("!send failed: %s\n", er);
|
|
| 161 |
+ logg("!send failed: %s\n", strerror_r(errno, er, sizeof(er)));
|
|
| 163 | 162 |
close(s); |
| 164 | 163 |
return 1; |
| 165 | 164 |
} |
| ... | ... |
@@ -219,8 +214,7 @@ int nc_sendmsg(int s, int fd) {
|
| 219 | 219 |
|
| 220 | 220 |
if((ret = sendmsg(s, &msg, 0)) == -1) {
|
| 221 | 221 |
char er[256]; |
| 222 |
- strerror_r(errno, er, sizeof(er)); |
|
| 223 |
- logg("!clamfi_eom: FD send failed (%s)\n", er);
|
|
| 222 |
+ logg("!clamfi_eom: FD send failed (%s)\n", strerror_r(errno, er, sizeof(er)));
|
|
| 224 | 223 |
close(s); |
| 225 | 224 |
} |
| 226 | 225 |
return ret; |
| ... | ... |
@@ -257,8 +251,7 @@ char *nc_recv(int s) {
|
| 257 | 257 |
res = recv(s, &buf[len], sizeof(buf) - len, 0); |
| 258 | 258 |
if(res==-1) {
|
| 259 | 259 |
char er[256]; |
| 260 |
- strerror_r(errno, er, sizeof(er)); |
|
| 261 |
- logg("!recv failed after successful select: %s\n", er);
|
|
| 260 |
+ logg("!recv failed after successful select: %s\n", strerror_r(errno, er, sizeof(er)));
|
|
| 262 | 261 |
close(s); |
| 263 | 262 |
return NULL; |
| 264 | 263 |
} |
| ... | ... |
@@ -608,15 +608,16 @@ int fds_poll_recv(struct fd_data *data, int timeout, int check_signals) |
| 608 | 608 |
|
| 609 | 609 |
if (retval == -1 && errno != EINTR) {
|
| 610 | 610 |
char buff[BUFFSIZE + 1]; |
| 611 |
+ char *p; |
|
| 611 | 612 |
#ifdef HAVE_STRERROR_R |
| 612 |
- strerror_r(errno, buff, BUFFSIZE); |
|
| 613 |
+ p = strerror_r(errno, buff, BUFFSIZE); |
|
| 613 | 614 |
#else |
| 614 |
- buff[0] = '\0'; |
|
| 615 |
+ p = ""; |
|
| 615 | 616 |
#endif |
| 616 | 617 |
#ifdef HAVE_POLL |
| 617 |
- logg("!poll_recv_fds: poll failed: %s\n", buff);
|
|
| 618 |
+ logg("!poll_recv_fds: poll failed: %s\n", p);
|
|
| 618 | 619 |
#else |
| 619 |
- logg("!poll_recv_fds: select failed: %s\n", buff);
|
|
| 620 |
+ logg("!poll_recv_fds: select failed: %s\n", p);
|
|
| 620 | 621 |
#endif |
| 621 | 622 |
} |
| 622 | 623 |
|
| ... | ... |
@@ -421,8 +421,7 @@ static void *acceptloop_th(void *arg) |
| 421 | 421 |
} else if (errno != EINTR) {
|
| 422 | 422 |
/* very bad - need to exit or restart */ |
| 423 | 423 |
#ifdef HAVE_STRERROR_R |
| 424 |
- strerror_r(errno, buff, BUFFSIZE); |
|
| 425 |
- logg("!accept() failed: %s\n", buff);
|
|
| 424 |
+ logg("!accept() failed: %s\n", strerror_r(errno, buff, BUFFSIZE));
|
|
| 426 | 425 |
#else |
| 427 | 426 |
logg("!accept() failed\n");
|
| 428 | 427 |
#endif |
| ... | ... |
@@ -157,9 +157,9 @@ int conn_reply_errno(const client_conn_t *conn, const char *path, |
| 157 | 157 |
const char *msg) |
| 158 | 158 |
{
|
| 159 | 159 |
char buf[BUFFSIZE + sizeof(". ERROR")];
|
| 160 |
+ char buf2[BUFFSIZE + sizeof(". ERROR")];
|
|
| 160 | 161 |
#ifdef HAVE_STRERROR_R |
| 161 |
- strerror_r(errno, buf, BUFFSIZE-1); |
|
| 162 |
- strcat(buf, ". ERROR"); |
|
| 162 |
+ snprintf(buf, sizeof(buf), "%s. ERROR", strerror_r(errno, buf2, BUFFSIZE-1)); |
|
| 163 | 163 |
#else |
| 164 | 164 |
snprintf(buf, sizeof(buf), "%u. ERROR", errno); |
| 165 | 165 |
#endif |