> <?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