jim 97/12/30 07:10:54
Modified: . STATUS src CHANGES src/ap Makefile.tmpl src/main alloc.c http_config.c http_config.h http_core.c http_main.c httpd.h util.c src/modules/proxy proxy_ftp.c proxy_util.c Added: src/ap ap_cpystrn.c Log: Submitted by: Jim Jagielski Reviewed by: Dean Gaudet, Dirk-Willem van Gulik, Ken Coar Idea by: Martin Kraemer The move from strncpy() to ap_cpystrn(), which is home-brewed and is located in ./src/ap Revision Changes Path 1.40 +1 -4 apachen/STATUS Index: STATUS =================================================================== RCS file: /export/home/cvs/apachen/STATUS,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- STATUS 1997/12/29 15:09:47 1.39 +++ STATUS 1997/12/30 15:10:39 1.40 @@ -60,12 +60,9 @@ * Ben Hyde's [PATCH] Serialize the update to pool.sub_* in destroy_pool (take 2) * Ken's [PATCH] for PR#1195 (" in realm names) + * Jim's [PATCH] ap_cpystrn() function (replace strncpy) Take II Available Patches: - - * Jim's [PATCH] ap_cpystrn() function (replace strncpy) Take II - <[EMAIL PROTECTED]> - Status: Jim +1, Dirk +1, Marc wants to think about the name, Dean +1 * [PATCH] mod_digest/1599: proxy authentication using the digest auth scheme never succeeds (fwd) 1.552 +4 -0 apachen/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apachen/src/CHANGES,v retrieving revision 1.551 retrieving revision 1.552 diff -u -r1.551 -r1.552 --- CHANGES 1997/12/29 17:51:51 1.551 +++ CHANGES 1997/12/30 15:10:41 1.552 @@ -1,5 +1,9 @@ Changes with Apache 1.3b4 + *) migration from strncpy() to our "enhanced" version called + ap_cpystrn() for performance and functionality reasons. + Located in libap.a. [Jim Jagielski] + *) table_set() and table_unset() did not deal correctly with multiple occurrences of the same key. [Stephen Scheck <[EMAIL PROTECTED]>, Ben Laurie] PR#1604 1.6 +2 -1 apachen/src/ap/Makefile.tmpl Index: Makefile.tmpl =================================================================== RCS file: /export/home/cvs/apachen/src/ap/Makefile.tmpl,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- Makefile.tmpl 1997/12/28 04:51:01 1.5 +++ Makefile.tmpl 1997/12/30 15:10:42 1.6 @@ -6,7 +6,7 @@ LIB=libap.a -OBJS=ap_signal.o ap_slack.o ap_snprintf.o ap_strings.o +OBJS=ap_signal.o ap_slack.o ap_snprintf.o ap_strings.o ap_cpystrn.o .c.o: $(CC) -c $(INCLUDES) $(CFLAGS) $(SPACER) $< @@ -28,3 +28,4 @@ ap_slack.o: $(INCDIR)/httpd.h $(INCDIR)/http_log.h ap_snprintf.o: $(INCDIR)/conf.h ap_strings.o: $(INCDIR)/httpd.h +ap_cpystrn.o: $(INCDIR)/httpd.h 1.1 apachen/src/ap/ap_cpystrn.c Index: ap_cpystrn.c =================================================================== /* ==================================================================== * Copyright (c) 1995-1997 The Apache Group. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the Apache Group * for use in the Apache HTTP server project (http://www.apache.org/)." * * 4. The names "Apache Server" and "Apache Group" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * [EMAIL PROTECTED] * * 5. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the Apache Group * for use in the Apache HTTP server project (http://www.apache.org/)." * * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Group and was originally based * on public domain software written at the National Center for * Supercomputing Applications, University of Illinois, Urbana-Champaign. * For more information on the Apache Group and the Apache HTTP server * project, please see <http://www.apache.org/>. * */ #include "httpd.h" /* * Apache's "replacement" for the strncpy() function. We roll our * own to implement these specific changes: * (1) strncpy() doesn't always null terminate and we want it to. * (2) strncpy() null fills, which is bogus, esp. when copy 8byte * strings into 8k blocks. * (3) Instead of returning the pointer to the beginning of * the destination string, we return the end so we can * "check" for truncation * * ap_cpystrn() follows the same call structure as strncpy(). */ char *ap_cpystrn(char *dst, const char *src, size_t dst_size) { char *d, *end; if (!dst_size) return (dst); d = dst; end = dst + dst_size - 1; while ((d < end) && (*d++ = *src++)) ; /* nop, the while does it all */ *d = '\0'; /* always null terminate */ return (d); } 1.64 +1 -2 apachen/src/main/alloc.c Index: alloc.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/alloc.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -r1.63 -r1.64 --- alloc.c 1997/12/29 17:51:57 1.63 +++ alloc.c 1997/12/30 15:10:44 1.64 @@ -536,8 +536,7 @@ if (s == NULL) return NULL; res = palloc(a, n + 1); - strncpy(res, s, n); - res[n] = '\0'; + ap_cpystrn(res, s, n); return res; } 1.90 +1 -2 apachen/src/main/http_config.c Index: http_config.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/http_config.c,v retrieving revision 1.89 retrieving revision 1.90 diff -u -r1.89 -r1.90 --- http_config.c 1997/12/16 07:36:30 1.89 +++ http_config.c 1997/12/30 15:10:45 1.90 @@ -1134,8 +1134,7 @@ /* Global virtual host hash bucket pointers. Init to null. */ init_vhost_config(p); - strncpy(coredump_dir, server_root, sizeof(coredump_dir) - 1); - coredump_dir[sizeof(coredump_dir) - 1] = '\0'; + ap_cpystrn(coredump_dir, server_root, sizeof(coredump_dir)); } server_rec *init_server_config(pool *p) 1.58 +1 -1 apachen/src/main/http_config.h Index: http_config.h =================================================================== RCS file: /export/home/cvs/apachen/src/main/http_config.h,v retrieving revision 1.57 retrieving revision 1.58 diff -u -r1.57 -r1.58 --- http_config.h 1997/12/01 12:10:15 1.57 +++ http_config.h 1997/12/30 15:10:45 1.58 @@ -250,7 +250,7 @@ * handle it back-compatibly, or at least signal an error). */ -#define MODULE_MAGIC_NUMBER 19971026 +#define MODULE_MAGIC_NUMBER 19971226 #define STANDARD_MODULE_STUFF MODULE_MAGIC_NUMBER, -1, __FILE__, NULL /* Generic accessors for other modules to get at their own module-specific 1.144 +2 -4 apachen/src/main/http_core.c Index: http_core.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/http_core.c,v retrieving revision 1.143 retrieving revision 1.144 diff -u -r1.143 -r1.144 --- http_core.c 1997/12/28 04:51:02 1.143 +++ http_core.c 1997/12/30 15:10:46 1.144 @@ -1233,8 +1233,7 @@ if (err != NULL) return err; if (!is_directory (arg)) return "ServerRoot must be a valid directory"; - strncpy (server_root, arg, sizeof(server_root)-1); - server_root[sizeof(server_root)-1] = '\0'; + ap_cpystrn (server_root, arg, sizeof(server_root)); return NULL; } @@ -1571,8 +1570,7 @@ return pstrcat(cmd->pool, "CoreDumpDirectory ", arg, " does not exist or is not a directory", NULL); } - strncpy(coredump_dir, arg, sizeof(coredump_dir)-1); - coredump_dir[sizeof(coredump_dir)-1] = '\0'; + ap_cpystrn(coredump_dir, arg, sizeof(coredump_dir)); return NULL; } 1.261 +13 -28 apachen/src/main/http_main.c Index: http_main.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/http_main.c,v retrieving revision 1.260 retrieving revision 1.261 diff -u -r1.260 -r1.261 --- http_main.c 1997/12/26 18:16:17 1.260 +++ http_main.c 1997/12/30 15:10:47 1.261 @@ -1681,19 +1681,12 @@ ss->conn_bytes = (unsigned long) 0; } if (r) { - int slot_size; conn_rec *c = r->connection; - slot_size = sizeof(ss->client) - 1; - strncpy(ss->client, get_remote_host(c, r->per_dir_config, - REMOTE_NOLOOKUP), slot_size); - ss->client[slot_size] = '\0'; - slot_size = sizeof(ss->request) - 1; - strncpy(ss->request, (r->the_request ? r->the_request : - "NULL"), slot_size); - ss->request[slot_size] = '\0'; - slot_size = sizeof(ss->vhost) - 1; - strncpy(ss->vhost, r->server->server_hostname, slot_size); - ss->vhost[slot_size] = '\0'; + ap_cpystrn(ss->client, get_remote_host(c, r->per_dir_config, + REMOTE_NOLOOKUP), sizeof(ss->client)); + ap_cpystrn(ss->request, (r->the_request ? r->the_request : + "NULL"), sizeof(ss->request)); + ap_cpystrn(ss->vhost, r->server->server_hostname, sizeof(ss->vhost)); } #endif @@ -3513,22 +3506,18 @@ ptrans = make_sub_pool(pconf); server_argv0 = argv[0]; - strncpy(server_root, HTTPD_ROOT, sizeof(server_root) - 1); - server_root[sizeof(server_root) - 1] = '\0'; - strncpy(server_confname, SERVER_CONFIG_FILE, sizeof(server_root) - 1); - server_confname[sizeof(server_confname) - 1] = '\0'; + ap_cpystrn(server_root, HTTPD_ROOT, sizeof(server_root)); + ap_cpystrn(server_confname, SERVER_CONFIG_FILE, sizeof(server_confname)); setup_prelinked_modules(); while ((c = getopt(argc, argv, "Xd:f:vVhlZ:")) != -1) { switch (c) { case 'd': - strncpy(server_root, optarg, sizeof(server_root) - 1); - server_root[sizeof(server_root) - 1] = '\0'; + ap_cpystrn(server_root, optarg, sizeof(server_root)); break; case 'f': - strncpy(server_confname, optarg, sizeof(server_confname) - 1); - server_confname[sizeof(server_confname) - 1] = '\0'; + ap_cpystrn(server_confname, optarg, sizeof(server_confname)); break; case 'v': printf("Server version %s.\n", SERVER_VERSION); @@ -4315,10 +4304,8 @@ ptrans = make_sub_pool(pconf); server_argv0 = argv[0]; - strncpy(server_root, HTTPD_ROOT, sizeof(server_root) - 1); - server_root[sizeof(server_root) - 1] = '\0'; - strncpy(server_confname, SERVER_CONFIG_FILE, sizeof(server_root) - 1); - server_confname[sizeof(server_confname) - 1] = '\0'; + ap_cpystrn(server_root, HTTPD_ROOT, sizeof(server_root)); + ap_cpystrn(server_confname, SERVER_CONFIG_FILE, sizeof(server_confname)); setup_prelinked_modules(); @@ -4344,12 +4331,10 @@ break; #endif /* WIN32 */ case 'd': - strncpy(server_root, optarg, sizeof(server_root) - 1); - server_root[sizeof(server_root) - 1] = '\0'; + ap_cpystrn(server_root, optarg, sizeof(server_root)); break; case 'f': - strncpy(server_confname, optarg, sizeof(server_confname) - 1); - server_confname[sizeof(server_confname) - 1] = '\0'; + ap_cpystrn(server_confname, optarg, sizeof(server_confname)); break; case 'v': printf("Server version %s.\n", SERVER_VERSION); 1.170 +4 -0 apachen/src/main/httpd.h Index: httpd.h =================================================================== RCS file: /export/home/cvs/apachen/src/main/httpd.h,v retrieving revision 1.169 retrieving revision 1.170 diff -u -r1.169 -r1.170 --- httpd.h 1997/12/28 11:52:02 1.169 +++ httpd.h 1997/12/30 15:10:48 1.170 @@ -925,3 +925,7 @@ #else #define RAISE_SIGSTOP(x) #endif + +/* Our own home-brewed strncpy replacement */ +API_EXPORT(char *) ap_cpystrn(char *dst, const char *src, size_t dst_size); + 1.79 +8 -11 apachen/src/main/util.c Index: util.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/util.c,v retrieving revision 1.78 retrieving revision 1.79 diff -u -r1.78 -r1.79 --- util.c 1997/12/19 14:30:12 1.78 +++ util.c 1997/12/30 15:10:49 1.79 @@ -287,9 +287,10 @@ } else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) { len = pmatch[no].rm_eo - pmatch[no].rm_so; - strncpy(dst, source + pmatch[no].rm_so, len); + ap_cpystrn(dst, source + pmatch[no].rm_so, len); dst += len; - if (*(dst - 1) == '\0') /* strncpy hit NULL. */ + /* is this still valid? jj 12/26/97 */ + if (*(dst - 1) == '\0') /* ap_cpystrn hit NULL. */ return NULL; } @@ -440,7 +441,7 @@ if (s[x] == '/') if ((++f) == n) { res = palloc(p, x + 2); - strncpy(res, s, x); + ap_cpystrn(res, s, x); res[x] = '/'; res[x + 1] = '\0'; return res; @@ -499,8 +500,7 @@ } res = palloc(atrans, pos + 1); - strncpy(res, *line, pos); - res[pos] = '\0'; + ap_cpystrn(res, *line, pos); while ((*line)[pos] == stop) ++pos; @@ -534,8 +534,7 @@ } res = palloc(atrans, pos + 1); - strncpy(res, *line, pos); - res[pos] = '\0'; + ap_cpystrn(res, *line, pos); while (isspace((*line)[pos])) ++pos; @@ -562,8 +561,7 @@ } res = palloc(atrans, pos + 1); - strncpy(res, *line, pos); - res[pos] = '\0'; + ap_cpystrn(res, *line, pos); ++pos; @@ -846,8 +844,7 @@ tok_len = ptr - tok_start; token = palloc(p, tok_len + 1); - strncpy(token, tok_start, tok_len); - token[tok_len] = '\0'; + ap_cpystrn(token, tok_start, tok_len); /* Advance accept_line pointer to the next non-white byte */ 1.44 +2 -4 apachen/src/modules/proxy/proxy_ftp.c Index: proxy_ftp.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/proxy/proxy_ftp.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- proxy_ftp.c 1997/11/27 13:30:22 1.43 +++ proxy_ftp.c 1997/12/30 15:10:52 1.44 @@ -343,8 +343,7 @@ link_ptr[n - 1] = '\0'; ap_snprintf(urlptr, sizeof(urlptr), "%s%s%s", url+hostlen, (url[strlen(url) - 1] == '/' ? "" : "/"), filename); ap_snprintf(buf2, sizeof(buf2), "%s <A HREF=\"%s\">%s %s</A>\n", buf, filename, filename, link_ptr); - strncpy(buf, buf2, sizeof(buf) - 1); - buf[sizeof(buf) - 1] = '\0'; + ap_cpystrn(buf, buf2, sizeof(buf)); n = strlen(buf); } else if (buf[0] == 'd' || buf[0] == '-' || buf[0] == 'l' || isdigit(buf[0])) { @@ -380,8 +379,7 @@ else { ap_snprintf(buf2, sizeof(buf2), "%s <A HREF=\"%s\">%s</A>\n", buf, filename, filename); } - strncpy(buf, buf2, sizeof(buf)); - buf[sizeof(buf) - 1] = '\0'; + ap_cpystrn(buf, buf2, sizeof(buf)); n = strlen(buf); } 1.38 +2 -2 apachen/src/modules/proxy/proxy_util.c Index: proxy_util.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/proxy/proxy_util.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- proxy_util.c 1997/11/27 13:46:30 1.37 +++ proxy_util.c 1997/12/30 15:10:53 1.38 @@ -639,7 +639,7 @@ /* now split into directory levels */ for (i = k = d = 0; d < ndepth; ++d) { - strncpy(&val[i], &tmp[k], nlength); + ap_cpystrn(&val[i], &tmp[k], nlength); k += nlength; val[i + nlength] = '/'; i += nlength + 1; @@ -689,7 +689,7 @@ /* now split into directory levels */ for (i = k = d = 0; d < ndepth; ++d) { - strncpy(&val[i], &tmp[k], nlength); + ap_cpystrn(&val[i], &tmp[k], nlength); k += nlength; val[i + nlength] = '/'; i += nlength + 1;