X-Loop: help-debbugs@HIDDEN Subject: [bug#68162] [PATCH] initrd: Parse kernel command line and pass module parameters Resent-From: nathan <nathan_mail@HIDDEN> Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> Resent-CC: guix-patches@HIDDEN Resent-Date: Sun, 31 Dec 2023 04:20:02 +0000 Resent-Message-ID: <handler.68162.B.170399637732150 <at> debbugs.gnu.org> Resent-Sender: help-debbugs@HIDDEN X-GNU-PR-Message: report 68162 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 68162 <at> debbugs.gnu.org X-Debbugs-Original-To: guix-patches@HIDDEN Received: via spool by submit <at> debbugs.gnu.org id=B.170399637732150 (code B ref -1); Sun, 31 Dec 2023 04:20:02 +0000 Received: (at submit) by debbugs.gnu.org; 31 Dec 2023 04:19:37 +0000 Received: from localhost ([127.0.0.1]:45444 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1rJnIW-0008MT-Ge for submit <at> debbugs.gnu.org; Sat, 30 Dec 2023 23:19:37 -0500 Received: from lists.gnu.org ([2001:470:142::17]:50804) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <nathan_mail@HIDDEN>) id 1rJnIS-0008MD-P7 for submit <at> debbugs.gnu.org; Sat, 30 Dec 2023 23:19:35 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <nathan_mail@HIDDEN>) id 1rJnIM-0006Pw-Ae for guix-patches@HIDDEN; Sat, 30 Dec 2023 23:19:26 -0500 Received: from mail.nborghese.com ([207.148.28.48]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <nathan_mail@HIDDEN>) id 1rJnIJ-0003Ni-M9 for guix-patches@HIDDEN; Sat, 30 Dec 2023 23:19:25 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; s=062122; bh=lpJhD8Cs+aG+X 7vMPHk5exYrp+PbDHMIxm+720PsnCg=; h=date:subject:to:from; d=nborghese.com; b=cQUoDiSUia/lk+fc6Mg8WjmkE3fueyQ+Ixpwx+hFnSwDwFVsj0N /imqLj9ayBo0LTQgqoyFU+d8boJG1MY024O7URpNU7m8Xqzqh4cSjCQCBIonevCQVCsLd9 esBIcp84xFtAKcx/02cD6hF1056VBhpmCgwaZ0HGJoS+TUm0rA= Received: by nborghese.com (OpenSMTPD) with ESMTPSA id 28837c8c (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO) for <guix-patches@HIDDEN>; Sun, 31 Dec 2023 04:18:51 +0000 (UTC) From: nathan <nathan_mail@HIDDEN> Date: Sat, 30 Dec 2023 23:14:10 -0500 Message-ID: <87edf3qa0v.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Received-SPF: pass client-ip=207.148.28.48; envelope-from=nathan_mail@HIDDEN; helo=mail.nborghese.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: 0.9 (/) X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.1 (/) --=-=-= Content-Type: text/plain GUIX's initrd code ignores the kernel command line and always passes no parameters to the modules it loads. This fixes it with command line parsing code that is accurate to what modprobe does. The user's module options, like somemodule.param=val, are properly passed now. It also allows the modprobe.blacklist option to optionally be quoted and normalizes the module names given in the blacklist. modprobe.blacklist="module1,mod-ule2" -> '("module1" "mod_ule2") I tested passing module options with the command line in a VM and on my real system. Tested blacklist code in a VM. I've also attached my code I used to test the commandline parsing function manually. fix bug#55907 https://lists.gnu.org/archive/html/bug-guix/2022-06/msg00157.html --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0001-linux-modules-Allow-parameters-to-be-passed-to-kerne.patch Content-Transfer-Encoding: quoted-printable From 626930cbad11e7f5546589fc290b2c95fee97b80 Mon Sep 17 00:00:00 2001 Message-ID: <626930cbad11e7f5546589fc290b2c95fee97b80.1703992381.git.nathan= _mail@HIDDEN> From: nathan <nathan_mail@HIDDEN> Date: Sat, 30 Dec 2023 22:10:26 -0500 Subject: [PATCH 1/3] linux-modules: Allow parameters to be passed to kernel modules * gnu/build/linux-modules.scm (load-linux-module*): New parameter, `get-options', for getting kernel module parameters to give to Linux. Change-Id: I8c4629a1404270fe641fef02a9fbbaeac4360e65 --- gnu/build/linux-modules.scm | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 12cb9c4ba6..c4950ea6d2 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -332,12 +332,15 @@ (define* (load-linux-module* file #:key (recursive? #t) (lookup-module dot-ko) - (black-list (module-black-list))) + (black-list (module-black-list)) + (get-options (const ""))) "Load Linux module from FILE, the name of a '.ko[.gz|.xz]' file; return = true on success, false otherwise. When RECURSIVE? is true, load its dependenci= es first (=C3=A0 la 'modprobe'.) The actual files containing modules depende= d on are obtained by calling LOOKUP-MODULE with the module name. Modules whose name -appears in BLACK-LIST are not loaded." +appears in BLACK-LIST are not loaded. GET-OPTIONS is a procedure that take= s a +normalized module name string input and returns a string containing the co= mplete +parameters to pass to the module. See init_module(2) for the parameters fo= rmat." (define (black-listed? module) (let ((result (member module black-list))) (when result @@ -350,20 +353,23 @@ (define* (load-linux-module* file (let ((dependencies (module-dependencies file))) (every (cut load-linux-module* <> #:lookup-module lookup-module - #:black-list black-list) + #:black-list black-list + #:get-options get-options) (map lookup-module dependencies)))) =20 (and (not (black-listed? (file-name->module-name file))) (or (not recursive?) (load-dependencies file)) - (let ((fd #f)) + (let ((fd #f) + (options (get-options (file-name->module-name file)))) (format (current-module-debugging-port) - "loading Linux module from '~a'...~%" file) + "loading Linux module from '~a' with options '~a'...~%" f= ile + options) =20 (catch 'system-error (lambda () (set! fd (open-fdes file O_RDONLY)) - (load-linux-module/fd fd) + (load-linux-module/fd fd options) (close-fdes fd) #t) (lambda args base-commit: f24b14767d362a84e6469682b4fe303b50f4b589 --=20 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-linux-modules-Parse-kernel-command-line-and-pass-mod.patch From 903b2d5bcb1fa28121ffd46e70f6503559c0ec95 Mon Sep 17 00:00:00 2001 Message-ID: <903b2d5bcb1fa28121ffd46e70f6503559c0ec95.1703992381.git.nathan_mail@HIDDEN> In-Reply-To: <626930cbad11e7f5546589fc290b2c95fee97b80.1703992381.git.nathan_mail@HIDDEN> References: <626930cbad11e7f5546589fc290b2c95fee97b80.1703992381.git.nathan_mail@HIDDEN> From: nathan <nathan_mail@HIDDEN> Date: Sat, 30 Dec 2023 22:11:35 -0500 Subject: [PATCH 2/3] linux-modules: Parse kernel command line and pass module arguments * gnu/build/linux-modules.scm (parse-kernel-cmdline): New procedure. (load-linux-modules-from-directory): Use parse-kernel-cmdline to parse command line and supply options to load-linux-module*. Change-Id: I11a181670d0da5ea08965a80c396358e50bf5048 --- gnu/build/linux-modules.scm | 98 ++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index c4950ea6d2..a54616b2d4 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -305,6 +305,93 @@ (define (modules-loaded) (((modules . _) ...) modules)))) +(define (parse-kernel-cmdline base) + "Input is the entire kernel command line, which is a space-delimited list of +modulename.parameter=value parts. The exact allowed syntax for the string is +based on the kmod_config_parse_kcmdline function from modprobe. Output is a +vhash where the key is the module name as a string and the value is a list of +strings in the form param=val (maybe with quotes in val). +`normalize-module-name' is applied to the module names. + +Duplicate parameters are not removed. The hyphen and underscore normalization +in parameter names is not applied. Empty module names are allowed." + (define (get-quoted start) + "It's similar to string-tokenize, but quoting is supported. Two values +are returned. First is the chunk of characters, second is the unused remainder +of the string. returns (values \"\" \"\") if the input string is just +whitespace or there's an unterminated quote" + ;; strip whitespace at the start + (let ((start (substring + start + (or + (string-skip start char-set:whitespace) + (string-length start))))) + (let lp ((s start) (quoted? #f)) + (if quoted? + (if (string-null? s) + (values "" "") + (lp (substring s 1) (not (eqv? (string-ref s 0) #\")))) + (if (or (string-null? s) (char-whitespace? (string-ref s 0))) + (values + (substring start 0 (- (string-length start) (string-length s))) + s) + (lp (substring s 1) (eqv? (string-ref s 0) #\"))))))) + (let lp ((s base) (table vlist-null)) + (call-with-values (lambda () (get-quoted s)) + (lambda (strblock rest) + (if (string-null? strblock) + table + ;; get parameter name. it is mandatory. + (let ((dotpos (string-index strblock #\.))) + (if dotpos + (let* ((equalpos (string-index strblock #\= dotpos)) + ;; modprobe allows a string like: + ;; "modulename.param=val" + ;; and then it converts it to + ;; modulename.param="val" + ;; This is the only case where a quote is + ;; allowed outside of the value part. + (is-bad-quoting (eqv? (string-ref strblock 0) #\")) + (modulename + (substring strblock (if is-bad-quoting 1 0) dotpos)) + (parampart + (substring + strblock + (1+ dotpos) + (or equalpos (string-length strblock))))) + ;; whitespace is only allowed in value + ;; no quotes allows in param segment + ;; param cant have dot + ;; module cant have equals + (if (or + (string-any (char-set-union + char-set:whitespace + (char-set #\" #\.)) + parampart) + (string-any (char-set-union + char-set:whitespace + (char-set #\=)) + modulename)) + (lp rest table) ;; ignore and recur + ;; add it to the table + (let ((modulename (normalize-module-name modulename))) + (lp rest + (let ((oldval (vhash-assoc modulename table))) + (vhash-cons + modulename + (cons + (if is-bad-quoting + (string-append + (substring strblock + (1+ dotpos) + (1+ equalpos)) + "\"" (substring strblock (1+ equalpos))) + (substring strblock (1+ dotpos))) + (if oldval (cdr oldval) '())) + (vhash-delete modulename table))))))) + (lp rest table))) ;; ignore and recur + ))))) + (define (module-black-list) "Return the black list of modules that must not be loaded. This black list is specified using 'modprobe.blacklist=MODULE1,MODULE2,...' on the kernel @@ -387,10 +474,19 @@ (define (load-linux-modules-from-directory modules directory) needed." (define module-name->file-name (module-name-lookup directory)) + (define options-list + (parse-kernel-cmdline + (call-with-input-file "/proc/cmdline" get-string-all))) + (define (get-options modulename) + (let ((pair (vhash-assoc modulename options-list))) + (if pair + (string-join (cdr pair) " ") + ""))) (for-each (lambda (module) (load-linux-module* (module-name->file-name module) - #:lookup-module module-name->file-name)) + #:lookup-module module-name->file-name + #:get-options get-options)) modules)) -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0003-linux-modules-Rewrite-module-black-list-with-parse-k.patch From 0cd4f6fb19c96a6be4a0d0851e1cf6dfd7046a27 Mon Sep 17 00:00:00 2001 Message-ID: <0cd4f6fb19c96a6be4a0d0851e1cf6dfd7046a27.1703992381.git.nathan_mail@HIDDEN> In-Reply-To: <626930cbad11e7f5546589fc290b2c95fee97b80.1703992381.git.nathan_mail@HIDDEN> References: <626930cbad11e7f5546589fc290b2c95fee97b80.1703992381.git.nathan_mail@HIDDEN> From: nathan <nathan_mail@HIDDEN> Date: Sat, 30 Dec 2023 22:12:19 -0500 Subject: [PATCH 3/3] linux-modules: Rewrite module-black-list with parse-kernel-cmdline * gnu/build/linux-modules.scm (module-black-list): Use parse-kernel-cmdline. Strip quotes from module names. Normalize module names so they can be properly compared with strings from file-name->module-name. Change-Id: I318006f98844593863246fc89ed1703767794702 --- gnu/build/linux-modules.scm | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index a54616b2d4..cbce3394e2 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -397,18 +397,25 @@ (define (module-black-list) is specified using 'modprobe.blacklist=MODULE1,MODULE2,...' on the kernel command line; it is honored by libkmod for users that pass 'KMOD_PROBE_APPLY_BLACKLIST', which includes 'modprobe --use-blacklist' and -udev." - (define parameter - "modprobe.blacklist=") - - (let ((command (call-with-input-file "/proc/cmdline" - get-string-all))) - (append-map (lambda (arg) - (if (string-prefix? parameter arg) - (string-tokenize (string-drop arg (string-length parameter)) - %not-comma) - '())) - (string-tokenize command)))) +udev. The names in the returned list are normalized with `normalize-module-name'." + (define target-parameter "blacklist=") + + (let* ((cmdline (parse-kernel-cmdline (call-with-input-file "/proc/cmdline" + get-string-all))) + (modprobe-pair (vhash-assoc "modprobe" cmdline))) + (if modprobe-pair + (map normalize-module-name + (append-map + (lambda (param) + (if (string-prefix? target-parameter param) + (string-tokenize + (string-delete + #\" + (string-drop param (string-length target-parameter))) + %not-comma) + '())) + (cdr modprobe-pair))) + '()))) (define (module-loaded? module) "Return #t if MODULE is already loaded. MODULE must be a Linux module name, -- 2.41.0 --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=test.scm Content-Transfer-Encoding: base64 Content-Description: manual testing code OzsgdGVzdCBrZXJuZWwgY29tbWFuZCBsaW5lIHBhcnNpbmcKCih1c2UtbW9kdWxlcyAoaWNlLTkg dmxpc3QpKQoodXNlLW1vZHVsZXMgKHJucnMgYmFzZSkgKHNyZmkgc3JmaS0xKSAocm5ycyBzb3J0 aW5nKSkKCjs7IHRlc3Qgbm9ybWFsCjs7IHRlc3QgcXVvdGVkCjs7IHRlc3Qgc3RyYW5nZSBxdW90 ZWQKOzsgdGVzdCBpbnZhbGlkIHF1b3RlIGluIG1vZHVsZSBuYW1lCjs7IHRlc3QgaW52YWxpZCBz cGFjZSBpbiBwYXJhbWV0ZXIKOzsgdGVzdCBpbnZhbGlkIHNwYWNlIGluIG1vZHVsZSBuYW1lCjs7 IHRlc3QgaW52YWxpZCBkb3QgaW4gcGFyYW1ldGVyIG5hbWUKOzsgdGVzdCBuZXdsaW5lIHN1cHBv cnQgYW5kIG11bHRpcGxlIHF1b3RlcyBpbiBhIHNpbmdsZSB2YWx1ZQo7OyB0ZXN0IG1pc3Npbmcg dmFsdWUsIGJ1dCBzdGlsbCB1c2luZyBxdW90ZXMuICh0aGlzIGlzIGludmFsaWQpCjs7IHRlc3Qg ZW1wdHkgdmFsdWUgKHdpdGggcXV0ZXMpCjs7IHRlc3Qgbm8tdmFsdWUgb3B0aW9uCjs7IHRlc3Qg bm9ybWFsaXplZCBtb2R1bGUgbmFtZQooZGVmaW5lIGNtZGxpbmUKICAiCm1vZC50ZXN0MT0xCm1v ZC50ZXN0Mj1cImEgYiBjXCIKXCJtb2QudGVzdDM9YSBiIGNcIgpcImludmFsaWQucFwiPTMKXCJp bnZhbGlkLmQgZD01XCIKXCJpbnZhbCBpZC5kZT01XCIKXCJpbnZhbGlkLmQuZT01XCIKXCJpbnZh bD1pZC5kLmU9NVwiClwibW9kMi50ZXN0ND1hYmMKZGVmXCJcImdoaVwiamtsXCJuCm5vcFwicQoK XCJpbnZhbGlkLnBhcmFtXCIKClwibW9kLnRlc3Q0PVwiCgpnbnUucmVwbAoKem5vcm1hbGl6ZS1t ZS50ZXN0PTEiCiAgKQoKKGRlZmluZSBwYXJzZS1rZXJuZWwtY21kbGluZSAoQEAgKGdudSBidWls ZCBsaW51eC1tb2R1bGVzKSBwYXJzZS1rZXJuZWwtY21kbGluZSkpCgooZGVmaW5lIG15YWxpc3Qg KHZsaXN0LT5saXN0IChwYXJzZS1rZXJuZWwtY21kbGluZSBjbWRsaW5lKSkpCjs7IG5vdGhpbmcg Zm9yIHRoZSAiaW52YWxpZCIgbW9kdWxlIHNob3VsZCBwYXNzCihhc3NlcnQgKG5vdCAoYW55IChs YW1iZGEgKGEpIChzdHJpbmctcHJlZml4PyAiaW52IiAoY2FyIGEpKSkgbXlhbGlzdCkpKQoKKGxl dCAoKHBhcnNlZGFyZ3MKICAgICAgIDs7IHNvcnQgdGhlIGFsaXN0IGVudHJpZXMgYnkgdGhlaXIg a2V5cwogICAgICAgKGxpc3Qtc29ydAogICAgICAgIChsYW1iZGEgKGEgYikgKHN0cmluZzwgKGNh ciBhKSAoY2FyIGIpKSkKICAgICAgICA7OyBzb3J0IHRoZSB2YWx1ZXMgb2YgZWFjaCBhbGlzdCBl bnRyeQogICAgICAgIChtYXAKICAgICAgICAgKGxhbWJkYSAoYikKICAgICAgICAgICAoY29ucyAo Y2FyIGIpIChsaXN0LXNvcnQgc3RyaW5nPCAoY2RyIGIpKSkpCiAgICAgICAgIG15YWxpc3QpKSkp CiAgOzsoKEAgKGljZS05IHByZXR0eS1wcmludCkgcHJldHR5LXByaW50KSBwYXJzZWRhcmdzKQog IChhc3NlcnQKICAgKGVxdWFsPwogICAgcGFyc2VkYXJncwogICAgJygKICAgICAgKCJnbnUiICJy ZXBsIikKICAgICAgKCJtb2QiICJ0ZXN0MT0xIiAidGVzdDI9XCJhIGIgY1wiIiAidGVzdDM9XCJh IGIgY1wiIiAidGVzdDQ9XCJcIiIpCiAgICAgICgibW9kMiIKICAgICAgICJ0ZXN0ND1cImFiYwpk ZWZcIlwiZ2hpXCJqa2xcIm4Kbm9wXCJxIikKICAgICAgKCJ6bm9ybWFsaXplX21lIiAidGVzdD0x IikKICAgICAgKSkpKQoKOzsgZmFpbCBiZWNhdXNlIHVudGVybWluYXRlZCBxdW90ZQooYXNzZXJ0 IChlcXVhbD8KICAgICAgICAgKHZsaXN0LT5saXN0IChwYXJzZS1rZXJuZWwtY21kbGluZSAiYWFh LmJiYj1cImNjYyIpKQogICAgICAgICAnKCkpKQoKOzsgdGVzdCBwcm9wZXIgcGFyc2luZyB3aGVu IGVuZCBvZiBzdHJpbmcgaXMgcmVhY2hlZAooYXNzZXJ0IChlcXVhbD8KICAgICAgICAgKHZsaXN0 LT5saXN0IChwYXJzZS1rZXJuZWwtY21kbGluZSAiYWFhLmJiYj1jY2MiKSkKICAgICAgICAgJygo ImFhYSIgImJiYj1jY2MiKSkpKQoKKGRpc3BsYXkgInBhc3NlZFxuIikK --=-=-=--
Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) Content-Type: text/plain; charset=utf-8 X-Loop: help-debbugs@HIDDEN From: help-debbugs@HIDDEN (GNU bug Tracking System) To: nathan <nathan_mail@HIDDEN> Subject: bug#68162: Acknowledgement ([PATCH] initrd: Parse kernel command line and pass module parameters) Message-ID: <handler.68162.B.170399637732150.ack <at> debbugs.gnu.org> References: <87edf3qa0v.fsf@HIDDEN> X-Gnu-PR-Message: ack 68162 X-Gnu-PR-Package: guix-patches X-Gnu-PR-Keywords: patch Reply-To: 68162 <at> debbugs.gnu.org Date: Sun, 31 Dec 2023 04:20:02 +0000 Thank you for filing a new bug report with debbugs.gnu.org. This is an automatically generated reply to let you know your message has been received. Your message is being forwarded to the package maintainers and other interested parties for their attention; they will reply in due course. Your message has been sent to the package maintainer(s): guix-patches@HIDDEN If you wish to submit further information on this problem, please send it to 68162 <at> debbugs.gnu.org. Please do not send mail to help-debbugs@HIDDEN unless you wish to report a problem with the Bug-tracking system. --=20 68162: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D68162 GNU Bug Tracking System Contact help-debbugs@HIDDEN with problems
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.