Skip to content
Snippets Groups Projects
Forked from ffbs / ffbs-gluon
Source project has a limited visibility.
  • Jan-Philipp Litza's avatar
    afce06c3
    gluon-cron: Fix endless loop parsing invalid lines · afce06c3
    Jan-Philipp Litza authored
    Using the line
    ```
    * * * * echo "foobar"
    ```
    (notice the missing fifth time field) in a crontab causes gluon-cron
    to enter an endless loop while parsing it, thus it won't even execute
    the other, valid crontabs.
    
    This is caused by the loop in [line 138] where `begin - min`
    substracts the unsigned `min` from the signed `begin`. If now `begin`
    is invalid, `strict_atoi` returns -1 and the loop starts at
    `(-1)-1=MAX_INT` and runs while `i <= MAX_INT` which is always true.
    
    The real culprit lies in [line 134] where exactly this case
    `begin < min` is checked - but because of the signedness, this check doesn't
    work as expected either.
    
    The easiest solution is to make `min` a signed integer instead of an unsigned
    one, as we do not require it to be very large and only pass the constants 0 or
    1 to it.
    
    To avoid other similar problems, this patch makes the input variable `n` a
    signed integer as well.
    afce06c3
    History
    gluon-cron: Fix endless loop parsing invalid lines
    Jan-Philipp Litza authored
    Using the line
    ```
    * * * * echo "foobar"
    ```
    (notice the missing fifth time field) in a crontab causes gluon-cron
    to enter an endless loop while parsing it, thus it won't even execute
    the other, valid crontabs.
    
    This is caused by the loop in [line 138] where `begin - min`
    substracts the unsigned `min` from the signed `begin`. If now `begin`
    is invalid, `strict_atoi` returns -1 and the loop starts at
    `(-1)-1=MAX_INT` and runs while `i <= MAX_INT` which is always true.
    
    The real culprit lies in [line 134] where exactly this case
    `begin < min` is checked - but because of the signedness, this check doesn't
    work as expected either.
    
    The easiest solution is to make `min` a signed integer instead of an unsigned
    one, as we do not require it to be very large and only pass the constants 0 or
    1 to it.
    
    To avoid other similar problems, this patch makes the input variable `n` a
    signed integer as well.