> <?php > echo "Stripslashes test: "; > ini_set('magic_quotes_sybase', 0); > $s = 'c:\\windows\\system32'; > $s1 = '\\'; > if ($s == stripslashes($s) && $s1 == stripslashes($s1)) echo "OK\n"; > else echo "FAILED\n"; > ?>
'c:\\windows\\system32' becomes 'c:\windows\system32' in memory (the slashes are stripped). stripslashes() will make it 'c:windowssystem32'. Thus the above tests will fail. This isn't a bug? (Doesn't magic_quotes_sybase only override magic_quotes_gpc which affects GPC data?) Jevon ----- Original Message ----- From: "Alexander Valyalkin" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Wednesday, June 09, 2004 10:52 PM Subject: Re: [PHP-DEV] stripslashes() improvements > On Tue, 8 Jun 2004 16:03:19 +0200 (CEST), Derick Rethans <[EMAIL PROTECTED]> > wrote: > > > > > You'll have to proof that by writing testcases, for example try it with > > the test cases in the current source and write new ones for things that > > we don't have a test case for yet. > > > >> -PHPAPI void php_stripslashes(char *str, int *len TSRMLS_DC) > >> +PHPAPI void php_stripslashes(char *str, size_t *len TSRMLS_DC) > > > > You can't just change the API call, that will break things. > > > > > > regards, > > Derick > > Ok. First of all, my version of the stripslashes() solves following bugs: > #9437 > #19947 > #27848 > > I have successfully tested my code with test case from current source > /ext/standard/tests/strings/add-and-stripslashes.phpt > > And here is my testcase, related to mentioned bugs: > > <?php > echo "Stripslashes test: "; > ini_set('magic_quotes_sybase', 0); > $s = 'c:\\windows\\system32'; > $s1 = '\\'; > if ($s == stripslashes($s) && $s1 == stripslashes($s1)) echo "OK\n"; > else echo "FAILED\n"; > ?> > > Here is corrected code with standart API call: > ====================cut====================== > PHPAPI void php_stripslashes(char *str, int *len TSRMLS_DC) > { > char *s, *t; > size_t l; > size_t dst_len; /* length of the stripped string */ > > if (len != NULL) l = dst_len = (size_t) *len; > else l = dst_len = strlen(str); > if (l < 2) return; /* there is no characters to strip */ > s = t = str; > > if (PG(magic_quotes_sybase)) { /* sybase magic_quotes ( '' -> ', \0 -> > NULL) */ > while (l > 1) { > if (*t == '\'' && *(t + 1) == '\'') { > *s++ = '\''; > t += 2; > l--; > dst_len--; > } else if (*t == '\\' && *(t + 1) == '0') { > *s++ = '\0'; > t += 2; > l--; > dst_len--; > } else *s++ = *t++; > l--; > } > } else { /* ordinary magic_qoutes (not sybase) ( \\ -> \, \' -> ', \" > -> ", \0 -> NULL) */ > while (l > 1) { > if (*t == '\\') { > t++; > switch (*t) { > case '\\' : > case '\'' : > case '"' : > *s++ = *t++; dst_len--; break; > case '0' : *s++ = '\0'; t++; dst_len--; break; > default : *s++ = '\\'; *s++ = *t++; break; > } > l -= 2; > } else { > *s++ = *t++; > l--; > } > } > } > if (l == 1) *s++ = *t; /* copy the last symbol */ > if (len != NULL) *len = (int) dst_len; /* set length of the stripped > string */ > *s = '\0'; > } > ====================cut====================== > > diff: > ====================cut====================== > --- string.c Thu May 13 20:44:32 2004 > +++ string_new.c Wed Jun 09 13:47:21 2004 > @@ -2159,70 +2159,51 @@ > PHPAPI void php_stripslashes(char *str, int *len TSRMLS_DC) > { > char *s, *t; > - int l; > - > - if (len != NULL) { > - l = *len; > - } else { > - l = strlen(str); > - } > - s = str; > - t = str; > + size_t l; > + size_t dst_len; /* length of the stripped string */ > > - if (PG(magic_quotes_sybase)) { > - while (l > 0) { > - if (*t == '\'') { > - if ((l > 0) && (t[1] == '\'')) { > - t++; > - if (len != NULL) > - (*len)--; > + if (len != NULL) l = dst_len = (size_t) *len; > + else l = dst_len = strlen(str); > + if (l < 2) return; /* there is no characters to strip */ > + s = t = str; > + > + if (PG(magic_quotes_sybase)) { /* sybase magic_quotes ( '' -> ', \0 > -> NULL) */ > + while (l > 1) { > + if (*t == '\'' && *(t + 1) == '\'') { > + *s++ = '\''; > + t += 2; > l--; > - } > - *s++ = *t++; > - } else if (*t == '\\' && l > 0 && t[1] == '0') { > + dst_len--; > + } else if (*t == '\\' && *(t + 1) == '0') { > *s++='\0'; > t += 2; > - if (len != NULL) > - (*len)--; > l--; > - } else { > - *s++ = *t++; > - } > + dst_len--; > + } else *s++ = *t++; > l--; > } > - *s = '\0'; > - > - return; > - } > - > - while (l > 0) { > + } else { /* ordinary magic_qoutes (not sybase) ( \\ -> \, \' -> ', \" > -> ", \0 -> NULL) */ > + while (l > 1) { > if (*t == '\\') { > - t++; /* skip the slash */ > - if (len != NULL) > - (*len)--; > - l--; > - if (l > 0) { > - if (*t == '0') { > - *s++='\0'; > t++; > - } else { > - *s++ = *t++; /* preserve the next character */ > - } > - l--; > + switch (*t) { > + case '\\' : > + case '\'' : > + case '"' : > + *s++ = *t++; dst_len--; break; > + case '0' : *s++ = '\0'; t++; dst_len--; break; > + default : *s++ = '\\'; *s++ = *t++; break; > } > + l -= 2; > } else { > - if (s != t) { > *s++ = *t++; > - } else { > - s++; > - t++; > - } > l--; > } > } > - if (s != t) { > - *s = '\0'; > } > + if (l == 1) *s++ = *t; /* copy the last symbol */ > + if (len != NULL) *len = (int) dst_len; /* set length of the stripped > string */ > + *s = '\0'; > } > /* }}} */ > ====================cut====================== > -- > Using Opera's revolutionary e-mail client: http://www.opera.com/m2/ > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php