Changeset 455
- Timestamp:
- 11/13/06 13:13:07 (2 years ago)
- Files:
-
- cherokee/trunk/ChangeLog (modified) (1 diff)
- cherokee/trunk/cherokee/buffer.c (modified) (27 diffs)
- cherokee/trunk/cherokee/socket.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
cherokee/trunk/ChangeLog
r454 r455 1 2006-11-13 A.D.F <adefacc@tin.it> 2 3 * cherokee/buffer.c: 4 - remove redundant spaces in blank lines; 5 6 - add a couple of unlikely(pbuf == NULL) 7 for failed allocations; 8 9 - fix realloc() handling in order to avoid a memory leak; 10 if realloc returns NULL then the original pointer 11 to memory content is not touched and it is still valid 12 (no free happens); 13 NOTE: I don't think this is a real issue because 14 usually it never happens on PCs, anyway as in theory 15 it _may_ happen (maybe only on some micro-embedded-system), 16 it's better to handle it properly; 17 18 - remove cherokee_buffer_replace(), 19 it looks like a stub function and it is not used by anybody; 20 21 - optimize cherokee_buffer_replace_string(), 22 if substring is not found in "buf" or if resulting length is 0 23 then there is no need to do something (copy / alloc memory). 24 25 * cherokee/sendfile.c: 26 - add a new constant MAX_SF_BLK_SIZE 27 (max. sendfile block size) 28 to limit size of data sent by each sendfile call 29 because this can improve a lot things on small 30 or old systems (FreeBSD 4.x, Linux 2.2, etc.); 31 NOTE: right now default is set to 4 MB 32 which should be good even for monster systems 33 (i.e. up to 10-100 GB / sec. of disk I/O). 34 NOTE: maybe in the near future we will add a new parameter 35 in configuration file to set the value 36 at runtime / startup; 37 38 - cherokee_socket_sendfile(): 39 - if size of data to be sent is 0 then return 40 without calling sendfile; 41 42 - limit size of data to MAX_SF_BLK_SIZE; 43 44 - fix FreeBSD return error handling, 45 only (re) variable has to be tested for error value, 46 return ret_eagain only if errno == EAGAIN && *sent == 0. 47 1 48 2006-11-08 Alvaro Lopez Ortega <alvaro@alobbs.com> 2 49 cherokee/trunk/cherokee/buffer.c
r440 r455 52 52 n->size = 0; 53 53 n->len = 0; 54 54 55 55 *buf = n; 56 56 return ret_ok; … … 65 65 buf->buf = NULL; 66 66 } 67 67 68 68 free (buf); 69 69 return ret_ok; … … 87 87 free (buf->buf); 88 88 } 89 89 90 90 return cherokee_buffer_init (buf); 91 91 } … … 94 94 cherokee_buffer_clean (cherokee_buffer_t *buf) 95 95 { 96 if (likely ((buf->buf != NULL) && (buf->len != 0)) ) 97 { 96 if (likely ((buf->buf != NULL) && (buf->len != 0)) ) { 98 97 buf->buf[0] = '\0'; 99 98 } … … 154 153 */ 155 154 if (free < (size+1)) { 156 buf->buf = (char *) realloc(buf->buf, buf->size + size - free + 1); 157 if (unlikely (buf->buf == NULL)) 155 char *pbuf; 156 pbuf = (char *) realloc(buf->buf, buf->size + size - free + 1); 157 if (unlikely (pbuf == NULL)) 158 158 return ret_nomem; 159 159 buf->buf = pbuf; 160 160 buf->size += size - free + 1; 161 161 } 162 162 163 163 /* Copy 164 164 */ … … 167 167 buf->len += size; 168 168 buf->buf[buf->len] = '\0'; 169 169 170 170 return ret_ok; 171 171 } … … 250 250 */ 251 251 if (free < (num+1)) { 252 buf->buf = (char *) realloc(buf->buf, buf->size + num - free + 1); 253 return_if_fail (buf->buf, ret_nomem); 254 252 char *pbuf; 253 pbuf = (char *) realloc(buf->buf, buf->size + num - free + 1); 254 if (unlikely (pbuf == NULL)) 255 return ret_nomem; 256 buf->buf = pbuf; 255 257 buf->size += num - free + 1; 256 258 } … … 272 274 /* Get memory 273 275 */ 274 if (free <= size) { 275 buf->buf = (char *) realloc(buf->buf, buf->size + size - free + 1); 276 return_if_fail (buf->buf, ret_nomem); 277 276 if (free < (size+1)) { 277 char *pbuf; 278 pbuf = (char *) realloc(buf->buf, buf->size + size - free + 1); 279 if (unlikely (pbuf == NULL)) 280 return ret_nomem; 281 buf->buf = pbuf; 278 282 buf->size += size - free + 1; 279 283 } … … 284 288 buf->len += size; 285 289 buf->buf[buf->len] = '\0'; 286 290 287 291 return ret_ok; 288 292 } … … 328 332 cherokee_buffer_ensure_size (cherokee_buffer_t *buf, size_t size) 329 333 { 334 char *pbuf; 335 330 336 /* Maybe it doesn't need it 331 337 */ … … 337 343 if (buf->buf == NULL) { 338 344 buf->buf = (char *) malloc (size); 339 if (unlikely (buf->buf == NULL)) return ret_nomem; 345 if (unlikely (buf->buf == NULL)) 346 return ret_nomem; 340 347 buf->size = size; 341 348 return ret_ok; … … 344 351 /* It already has memory, but it needs more.. 345 352 */ 346 buf->buf = (char *) realloc(buf->buf, size); 347 if (unlikely (buf->buf == NULL)) return ret_nomem; 353 pbuf = (char *) realloc(buf->buf, size); 354 if (unlikely (pbuf == NULL)) 355 return ret_nomem; 356 357 buf->buf = pbuf; 348 358 buf->size = size; 349 359 350 360 return ret_ok; 351 361 } … … 394 404 char *a = buffer->buf; 395 405 int offset = 0; 396 406 397 407 if (buffer->len < 2) { 398 408 return ret_ok; … … 536 546 ret = cherokee_buffer_ensure_size (buf, buf->len + info.st_size + 1); 537 547 if (unlikely(ret != ret_ok)) return ret; 538 548 539 549 /* Open the file 540 550 */ … … 551 561 return ret_error; 552 562 } 553 563 554 564 /* Close it and exit 555 565 */ … … 594 604 cherokee_buffer_add (buf, tmp, len); 595 605 *ret_size = len; 596 606 597 607 return ret_ok; 598 608 } … … 623 633 char* ascii_text; 624 634 unsigned char tmp; 625 635 626 636 if ((len == -1) || (buf->len <= len)) { 627 637 length = buf->len; … … 629 639 length = len; 630 640 } 631 641 632 642 if (length <= 0) 633 643 return ret_ok; 634 644 635 645 memset(text, 0, 67); 636 646 for (i=0; i < length; i++) { … … 643 653 ascii_text = text + 49; 644 654 } 645 655 646 656 tmp = buf->buf[i]; 647 657 sprintf (hex_text, "%02x", tmp & 0xFF); … … 651 661 hex_text++; 652 662 } 653 663 654 664 if ((tmp > ' ') && (tmp < 128)) 655 665 *ascii_text = tmp; … … 738 748 return ret_error; 739 749 } 740 750 741 751 /* Verify if unescaping is needed. 742 752 */ … … 1027 1037 struct MD5Context context; 1028 1038 unsigned char digest[16]; 1029 1039 1030 1040 MD5Init (&context); 1031 1041 MD5Update (&context, (md5byte *)buf->buf, buf->len); … … 1054 1064 { 1055 1065 struct MD5Context context; 1056 1066 1057 1067 cherokee_buffer_ensure_size (encoded, 17); 1058 1068 … … 1199 1209 1200 1210 ret_t 1201 cherokee_buffer_replace (cherokee_buffer_t *buf, char *string1, int len1, char *string2, int len2)1202 {1203 char *p = buf->buf;1204 1205 do {1206 p = strstr(p, string1);1207 if (p != NULL) {1208 if (len1 < len2) {1209 1210 } else {1211 1212 }1213 }1214 } while (p);1215 1216 return ret_ok;1217 }1218 1219 1220 ret_t1221 1211 cherokee_buffer_add_chunked (cherokee_buffer_t *buf, char *txt, size_t size) 1222 1212 { 1223 1213 ret_t ret; 1224 1214 1225 1215 ret = cherokee_buffer_add_va (buf, "0x%x"CRLF, size); 1226 1216 if (unlikely(ret < ret_ok)) return ret_ok; … … 1259 1249 const char *substring_position; 1260 1250 1251 /* Verify formal parameters 1252 * (those which are not tested should raise a segment violation). 1253 */ 1254 if (buf->buf == NULL || 1255 substring == NULL || substring_length < 1 || 1256 replacement == NULL || replacement_length < 0) 1257 return ret_deny; 1258 1261 1259 /* Calculate the new size 1262 1260 */ … … 1271 1269 } 1272 1270 1271 /* If no substring have been found, then return now. 1272 */ 1273 if (p == buf->buf) 1274 return ret_ok; 1275 1276 /* If resulting length is zero, then return now. 1277 */ 1278 if (result_length < 1) { 1279 buf->buf[0] = '\0'; 1280 buf->len = 0; 1281 return ret_ok; 1282 } 1283 1273 1284 /* Take the new memory chunk 1274 1285 */ 1275 1286 result = (char *) malloc (result_length + 1); 1276 if (result == NULL) return ret_nomem; 1277 1287 if (result == NULL) 1288 return ret_nomem; 1289 1278 1290 /* Build the new string 1279 1291 */ … … 1330 1342 } 1331 1343 1332 for (i =0; i<num; i++) {1344 for (i = 0; i < num; i++) { 1333 1345 int len = (buf->buf + buf->len) - p; 1334 1346 memmove(p+1, p, len); 1335 1347 *p = ','; 1336 p +=4;1348 p +=4; 1337 1349 buf->len++; 1338 1350 } cherokee/trunk/cherokee/socket.c
r454 r455 95 95 96 96 97 /* Max. sendfile block size (bytes): limiting size of data sent by 98 * each sendfile call may improve responsiveness, reduce memory 99 * pressure, prevent blocking calls, etc. 100 * 101 * NOTE: try to reduce block size (down to 64 KB) on small or old 102 * systems and see if something improves under heavy load. 103 */ 104 #define MAX_SF_BLK_SIZE (65536 * 64) /* limit size of block size */ 105 106 97 107 ret_t 98 108 cherokee_socket_init (cherokee_socket_t *socket) … … 686 696 break; 687 697 #endif 698 #ifdef AF_LOCAL 699 case AF_LOCAL: 700 memset (&sock->client_addr, 0, sizeof (struct sockaddr_un)); 701 break; 702 #endif 688 703 default: 689 704 SHOULDNT_HAPPEN; … … 742 757 743 758 744 ret_t 745 cherokee_ socket_listen (cherokee_socket_t *socket, int backlog)759 static ret_t 760 cherokee_bind_local (cherokee_socket_t *sock, cherokee_buffer_t *listen_to) 746 761 { 747 762 int re; 748 763 749 re = listen (SOCKET_FD(socket), backlog); 750 if (re < 0) return ret_error; 764 strncpy (SOCKET_SUN_PATH (socket), listen_to->buf, sizeof(SOCKET_SUN_PATH (socket)) -1); 765 sock->client_addr_len = sizeof(SOCKET_ADDR_UNIX(sock)->sun_family) + listen_to->len; 766 767 mktemp (SOCKET_SUN_PATH (socket)); 768 769 re = bind (SOCKET_FD(sock), SOCKET_ADDR_UNIX(sock), sock->client_addr_len); 770 if (re != 0) return ret_error; 751 771 752 772 return ret_ok; … … 766 786 return cherokee_bind_v6 (sock, port, listen_to); 767 787 #endif 788 #ifdef AF_LOCAL 789 case AF_LOCAL: 790 return cherokee_bind_local (sock, listen_to); 791 #endif 768 792 default: 769 793 break; … … 772 796 SHOULDNT_HAPPEN; 773 797 return ret_error; 798 } 799 800 801 ret_t 802 cherokee_socket_listen (cherokee_socket_t *socket, int backlog) 803 { 804 int re; 805 806 re = listen (SOCKET_FD(socket), backlog); 807 if (re < 0) return ret_error; 808 809 return ret_ok; 774 810 } 775 811 … … 1074 1110 cherokee_socket_sendfile (cherokee_socket_t *socket, int fd, size_t size, off_t *offset, ssize_t *sent) 1075 1111 { 1112 /* If there is nothing to send then return now, 1113 * this maybe needed in some systems (i.e. *BSD) 1114 * because value 0 may have special meanings. 1115 */ 1116 if (size == 0) 1117 return ret_ok; 1118 1119 /* Limit size of data that has to be sent. 1120 */ 1121 if (size > MAX_SF_BLK_SIZE) 1122 size = MAX_SF_BLK_SIZE; 1123 1076 1124 #if defined(LINUX_SENDFILE_API) || defined(HAVE_SENDFILE64) 1077 1125 … … 1103 1151 #elif HAVE_SENDFILE_BROKEN 1104 1152 1105 /* Some Linux 2.4 kernels do esn't support sendfile in a LFS1153 /* Some Linux 2.4 kernels don't support sendfile in a LFS 1106 1154 * environment. 1107 1155 */ … … 1127 1175 hdtrl.iov_len = 0; 1128 1176 1177 *sent = 0; 1129 1178 1130 1179 /* FreeBSD sendfile: in_fd and out_fd are reversed … … 1145 1194 } while (re == -1 && errno == EINTR); 1146 1195 1147 if (*sent < 0) { 1148 if (errno == EAGAIN) { 1149 return ret_eagain; 1196 if (re == -1) { 1197 switch (errno) { 1198 case ENOSYS: 1199 return ret_no_sys; 1200 case EAGAIN: 1201 if (*sent < 1) 1202 return ret_eagain; 1203 1204 /* else it's ok, something has been sent. 1205 */ 1206 break; 1207 default: 1208 return ret_error; 1150 1209 } 1151 return ret_error;1152 1210 } 1153 1211 *offset = *offset + *sent; … … 1199 1257 return ret_no_sys; 1200 1258 #else 1201 SOCKET_ADDR_UNIX(socket).sun_family = AF_UNIX;1202 1259 memset ((char*) SOCKET_SUN_PATH (socket), 0, sizeof (SOCKET_ADDR_UNIX(socket))); 1260 1261 SOCKET_ADDR_UNIX(socket)->sun_family = AF_UNIX; 1203 1262 strncpy (SOCKET_SUN_PATH (socket), hostname->buf, hostname->len); 1263 1204 1264 return ret_ok; 1205 1265 #endif … … 1217 1277 if (SOCKET_AF(socket) == AF_UNIX) { 1218 1278 #ifndef _WIN32 1219 r = connect (SOCKET_FD(socket), (struct sockaddr *) &SOCKET_ADDR_UNIX(socket), sizeof(SOCKET_ADDR_UNIX(socket)));1279 r = connect (SOCKET_FD(socket), (struct sockaddr *) SOCKET_ADDR_UNIX(socket), sizeof(SOCKET_ADDR_UNIX(socket))); 1220 1280 #else 1221 1281 SHOULDNT_HAPPEN;