]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsfd: fix crash triggered by an empty filter expression
authorMasatake YAMATO <yamato@redhat.com>
Thu, 28 Jul 2022 03:56:52 +0000 (12:56 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Thu, 28 Jul 2022 04:09:03 +0000 (13:09 +0900)
  $ lsfd -Q ''

or

  $ lsfd --filter ''

made lsfd process crash.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
misc-utils/lsfd-filter.c
tests/expected/lsfd/option-filter-broken-exp [new file with mode: 0644]
tests/ts/lsfd/option-filter-broken-exp [new file with mode: 0755]

index 844adb0a2cab32520b3f7345583cd798318c6f11..6cd4b3de69285b1ca5936b0a2e1542e3a1d16a21 100644 (file)
@@ -869,8 +869,13 @@ static struct node *dparser_compile(struct parser *parser)
                        return NULL;
                }
 
-               if (node == node0)
+               if (node == node0) {
+                       if (node == NULL)
+                               strncpy(parser->errmsg,
+                                       _("error: empty filter expression"),
+                                       ERRMSG_LEN - 1);
                        return node;
+               }
                node = node0;
        }
 }
@@ -1312,6 +1317,7 @@ struct lsfd_filter *lsfd_filter_new(const char *const expr, struct libscols_tabl
                strcpy(filter->errmsg, parser.errmsg);
                return filter;
        }
+       assert(node);
        if (parser.paren_level > 0) {
                node_free(node);
                strncpy(filter->errmsg, _("error: unbalanced parenthesis: ("), ERRMSG_LEN - 1);
diff --git a/tests/expected/lsfd/option-filter-broken-exp b/tests/expected/lsfd/option-filter-broken-exp
new file mode 100644 (file)
index 0000000..8c14f22
--- /dev/null
@@ -0,0 +1,7 @@
+lsfd: error: empty filter expression
+lsfd: error: empty filter expression
+lsfd: error: unbalanced parenthesis: )
+lsfd: error: unexpected token: garbage after OP2
+lsfd: error: bool expression is expected: FD
+lsfd: unknown column: NOSUCHCOLUMN
+lsfd: error: no such column: NOSUCHCOLUMN
diff --git a/tests/ts/lsfd/option-filter-broken-exp b/tests/ts/lsfd/option-filter-broken-exp
new file mode 100755 (executable)
index 0000000..58b48e1
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/bash
+#
+# Copyright (C) 2022 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="passing broken expressions to -Q option"
+
+. $TS_TOPDIR/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+
+ts_cd "$TS_OUTDIR"
+
+{
+    $TS_CMD_LSFD -Q ''
+    $TS_CMD_LSFD -Q '('
+    $TS_CMD_LSFD -Q ')'
+    $TS_CMD_LSFD -Q '(FD == 1)garbage'
+    $TS_CMD_LSFD -Q 'FD' 
+    $TS_CMD_LSFD -Q 'NOSUCHCOLUMN'
+} > $TS_OUTPUT 2>&1
+
+ts_finalize