9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
* [9fans] Fix sam regexp bug with metacharacters in classes
@ 2021-11-23 20:26 adr
  2021-11-24  1:28 ` Conor Williams
  0 siblings, 1 reply; 3+ messages in thread
From: adr @ 2021-11-23 20:26 UTC (permalink / raw)
  To: 9fans

The code assumes runes are 16 bits long, not 21, creating faulting
code parsing classes. I.e. '/[\-]' will not match '-'.

This is the same fix already in 9front.

http://adr.freeshell.org/plan9/patches/sam_fix_metachars_on_classes.diff

--- /sys/src/cmd/sam/regexp.c   Tue Apr 23 19:06:01 2013
+++ regexp.c    Tue Nov 23 15:01:18 2021
@@ -53,8 +53,8 @@
  /*
   * Actions and Tokens
   *
- *     0x100xx are operators, value == precedence
- *     0x200xx are tokens, i.e. operands for operators
+ *     0x2000xx are operators, value == precedence
+ *     0x3000xx are tokens, i.e. operands for operators
   */
  enum {
        OPERATOR = Runemask+1,  /* Bitmask of all operators */
@@ -462,7 +462,8 @@
                        exprp++;
                        return '\n';
                }
-               return *exprp++|(Runemax+1);
+               /* add a flag so metacharacters aren't interpreted */
+               return *exprp++|(Runemask+1);
        }
        return *exprp++;
  }
@@ -498,11 +499,12 @@
                        if((c2 = nextrec()) == ']')
                                goto Error;
                        classp[n+0] = Runemax;
-                       classp[n+1] = c1;
-                       classp[n+2] = c2;
+                       /* remove possible flag from nextrec() */
+                       classp[n+1] = c1 & Runemask;
+                       classp[n+2] = c2 & Runemask;
                        n += 3;
                }else
-                       classp[n++] = c1;
+                       classp[n++] = c1 & Runemask;
        }
        classp[n] = 0;
        if(nclass == Nclass){


------------------------------------------
9fans: 9fans
Permalink: https://9fans.topicbox.com/groups/9fans/Tccbdb20b670003a1-M5d4e6bea6c6908b388e51f0c
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [9fans] Fix sam regexp bug with metacharacters in classes
  2021-11-23 20:26 [9fans] Fix sam regexp bug with metacharacters in classes adr
@ 2021-11-24  1:28 ` Conor Williams
  2021-11-24  1:29   ` Conor Williams
  0 siblings, 1 reply; 3+ messages in thread
From: Conor Williams @ 2021-11-24  1:28 UTC (permalink / raw)
  To: 9fans

[-- Attachment #1: Type: text/plain, Size: 2233 bytes --]

why on Gaia do you not have a
Runemas_Incremented_By_One_To_Keep_A_Negative_Sub
variable?
apart from that, it looks okay... will tango it in later...

/c:2022November!^N^M

On Tue, Nov 23, 2021 at 8:27 PM adr <adr@sdf.org> wrote:

> The code assumes runes are 16 bits long, not 21, creating faulting
> code parsing classes. I.e. '/[\-]' will not match '-'.
> 
> This is the same fix already in 9front.
> 
> http://adr.freeshell.org/plan9/patches/sam_fix_metachars_on_classes.diff
> 
> --- /sys/src/cmd/sam/regexp.c   Tue Apr 23 19:06:01 2013
> +++ regexp.c    Tue Nov 23 15:01:18 2021
> @@ -53,8 +53,8 @@
>   /*
>    * Actions and Tokens
>    *
> - *     0x100xx are operators, value == precedence
> - *     0x200xx are tokens, i.e. operands for operators
> + *     0x2000xx are operators, value == precedence
> + *     0x3000xx are tokens, i.e. operands for operators
>    */
>   enum {
>         OPERATOR = Runemask+1,  /* Bitmask of all operators */
> @@ -462,7 +462,8 @@
>                         exprp++;
>                         return '\n';
>                 }
> -               return *exprp++|(Runemax+1);
> +               /* add a flag so metacharacters aren't interpreted */
> +               return *exprp++|(Runemask+1);
>         }
>         return *exprp++;
>   }
> @@ -498,11 +499,12 @@
>                         if((c2 = nextrec()) == ']')
>                                 goto Error;
>                         classp[n+0] = Runemax;
> -                       classp[n+1] = c1;
> -                       classp[n+2] = c2;
> +                       /* remove possible flag from nextrec() */
> +                       classp[n+1] = c1 & Runemask;
> +                       classp[n+2] = c2 & Runemask;
>                         n += 3;
>                 }else
> -                       classp[n++] = c1;
> +                       classp[n++] = c1 & Runemask;
>         }
>         classp[n] = 0;
>         if(nclass == Nclass){
> 

------------------------------------------
9fans: 9fans
Permalink: https://9fans.topicbox.com/groups/9fans/Tccbdb20b670003a1-M7b2bbb4acbd0bc7b5c5c7f69
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

[-- Attachment #2: Type: text/html, Size: 5075 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [9fans] Fix sam regexp bug with metacharacters in classes
  2021-11-24  1:28 ` Conor Williams
@ 2021-11-24  1:29   ` Conor Williams
  0 siblings, 0 replies; 3+ messages in thread
From: Conor Williams @ 2021-11-24  1:29 UTC (permalink / raw)
  To: 9fans

[-- Attachment #1: Type: text/plain, Size: 2437 bytes --]

sorry that s should have a k preceding _ /c:2021248pm

On Wed, Nov 24, 2021 at 1:28 AM Conor Williams <conor.williams@gmail.com>
wrote:

> why on Gaia do you not have a
> Runemas_Incremented_By_One_To_Keep_A_Negative_Sub
> variable?
> apart from that, it looks okay... will tango it in later...
>
> /c:2022November!^N^M
>
> On Tue, Nov 23, 2021 at 8:27 PM adr <adr@sdf.org> wrote:
>
>> The code assumes runes are 16 bits long, not 21, creating faulting
>> code parsing classes. I.e. '/[\-]' will not match '-'.
>> 
>> This is the same fix already in 9front.
>> 
>> http://adr.freeshell.org/plan9/patches/sam_fix_metachars_on_classes.diff
>> 
>> --- /sys/src/cmd/sam/regexp.c   Tue Apr 23 19:06:01 2013
>> +++ regexp.c    Tue Nov 23 15:01:18 2021
>> @@ -53,8 +53,8 @@
>>   /*
>>    * Actions and Tokens
>>    *
>> - *     0x100xx are operators, value == precedence
>> - *     0x200xx are tokens, i.e. operands for operators
>> + *     0x2000xx are operators, value == precedence
>> + *     0x3000xx are tokens, i.e. operands for operators
>>    */
>>   enum {
>>         OPERATOR = Runemask+1,  /* Bitmask of all operators */
>> @@ -462,7 +462,8 @@
>>                         exprp++;
>>                         return '\n';
>>                 }
>> -               return *exprp++|(Runemax+1);
>> +               /* add a flag so metacharacters aren't interpreted */
>> +               return *exprp++|(Runemask+1);
>>         }
>>         return *exprp++;
>>   }
>> @@ -498,11 +499,12 @@
>>                         if((c2 = nextrec()) == ']')
>>                                 goto Error;
>>                         classp[n+0] = Runemax;
>> -                       classp[n+1] = c1;
>> -                       classp[n+2] = c2;
>> +                       /* remove possible flag from nextrec() */
>> +                       classp[n+1] = c1 & Runemask;
>> +                       classp[n+2] = c2 & Runemask;
>>                         n += 3;
>>                 }else
>> -                       classp[n++] = c1;
>> +                       classp[n++] = c1 & Runemask;
>>         }
>>         classp[n] = 0;
>>         if(nclass == Nclass){
>> 

------------------------------------------
9fans: 9fans
Permalink: https://9fans.topicbox.com/groups/9fans/Tccbdb20b670003a1-M5540075cb6bb20848c0e586d
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

[-- Attachment #2: Type: text/html, Size: 5520 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-11-24  1:29 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-23 20:26 [9fans] Fix sam regexp bug with metacharacters in classes adr
2021-11-24  1:28 ` Conor Williams
2021-11-24  1:29   ` Conor Williams

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).