git-svn: trunk@4827
Török Edvin authored on 2009/02/19 04:08:15... | ... |
@@ -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 |