dgaudet 98/03/15 13:10:44
Modified: src/main util.c
Log:
take into account comments from Ben and Martin. Including fixing two
signed char -> unsigned extension problems.
Revision Changes Path
1.104 +24 -8 apache-1.3/src/main/util.c
Index: util.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/main/util.c,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -r1.103 -r1.104
--- util.c 1998/03/14 21:27:10 1.103
+++ util.c 1998/03/15 21:10:43 1.104
@@ -84,7 +84,11 @@
static unsigned char test_char_table[256];
-/* we assume the folks using this ensure the char < 256 */
+/* we assume the folks using this ensure 0 <= c < 256... which means
+ * you need a cast to (unsigned char) first, you can't just plug a
+ * char in here and get it to work, because if char is signed then it
+ * will first be sign extended.
+ */
#define TEST_CHAR(c, f) (test_char_table[(unsigned)(c)] & (f))
/* XXX: this should be compile-time initialized so that test_char_table can
@@ -970,13 +974,13 @@
/* find http tokens, see the definition of token from RFC2068 */
API_EXPORT(int) find_token(pool *p, const char *line, const char *tok)
{
- const char *start_token;
- const char *s;
+ const unsigned char *start_token;
+ const unsigned char *s;
if (!line)
return 0;
- s = line;
+ s = (const unsigned char *)line;
for (;;) {
/* find start of token, skip all stop characters, note NUL
* isn't a token stop, so we don't need to test for it
@@ -1020,13 +1024,15 @@
return (strncasecmp(&line[lidx], tok, tlen) == 0);
}
-API_EXPORT(char *) escape_shell_cmd(pool *p, const char *s)
+API_EXPORT(char *) escape_shell_cmd(pool *p, const char *str)
{
char *cmd;
- char *d;
+ unsigned char *d;
+ const unsigned char *s;
- cmd = palloc(p, 2 * strlen(s) + 1); /* Be safe */
- d = cmd;
+ cmd = palloc(p, 2 * strlen(str) + 1); /* Be safe */
+ d = (unsigned char *)cmd;
+ s = (const unsigned char *)str;
for (; *s; ++s) {
#if defined(__EMX__) || defined(WIN32)
@@ -1141,6 +1147,16 @@
}
}
+/* c2x takes an unsigned, and expects the caller has guaranteed that
+ * 0 <= what < 256... which usually means that you have to cast to
+ * unsigned char first, because (unsigned)(char)(x) fist goes through
+ * signed extension to an int before the unsigned cast.
+ *
+ * The reason for this assumption is to assist gcc code generation --
+ * the unsigned char -> unsigned extension is already done earlier in
+ * both uses of this code, so there's no need to waste time doing it
+ * again.
+ */
static const char c2x_table[] = "0123456789abcdef";
static ap_inline unsigned char *c2x(unsigned what, unsigned char *where)