{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/lobste-rs/2026-10-25-posix-wordexp-3-is-dangerous/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "[`wordexp(3)`](https://pubs.opengroup.org/onlinepubs/9799919799/functions/wordexp.html) is a POSIX API for performing shell-style expansions from C.\n\nIt's often cited/recommended as a way to do tilde expansion (e.g. `~/foo` to `/home/me/foo`):\n\n```c\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <wordexp.h>\n\nint expand_tilde(const char *input, char **output) {\n    wordexp_t p;\n    int ret = wordexp(input, &p, 0);\n    if (ret == 0) {\n        *output = strdup(p.we_wordv[0]);\n        wordfree(&p);\n    }\n    return ret;\n}\n\nint main(void) {\n    char *expanded = NULL;\n    expand_tilde(\"~/foo\", &expanded);\n    printf(\"expanded: %s\\n\", expanded);\n    return 0;\n}\n```\n\nHowever, `wordexp(3)` is also dangerous! That last `0` argument is for the *flags* parameter. By default, all expansion features are enabled, **including command expansion**:\n\n```c\nexpand_tilde(\"$(whoami)/foo\", &expanded);\n```\n\nor:\n\n```c\nexpand_tilde(\"$(cat /etc/passwd)/foo\", &expanded);\n```\n\nDisabling this requires passing [`WRDE_NOCMD`](https://pubs.opengroup.org/onlinepubs/9799919799/functions/wordexp.html#:~:text=WRDE_NOCMD,Substitution%2C%20is%20requested.) as a flag. Unfortunately, this palliative at best in some libc implementations:\n\n- [musl implements `wordexp(3)`](https://git.musl-libc.org/cgit/musl/tree/src/misc/wordexp.c) by delegating to the system shell. It adds some perfunctory scanning for command substitutions before delegating, but fails to match some patterns that the underlying shell (like GNU Bash) can treat as valid command substitutions.\n\n- [macOS's libc implements `wordexp(3)`](https://github.com/apple-oss-distributions/Libc/blob/71bbe350ab79eef58113991d817ccc6165061a64/gen/FreeBSD/wordexp.c#L201) in a similar manner, delegating to `/usr/lib/system/wordexp-helper`[^1]. According to [Julian Squires](https://www.cipht.net) this had the same bypass as musl [as recently as 2023](https://www.cipht.net/2023/11/21/worried-by-wordexp.html), although I didn't bother testing whether it's still effective now that the default macOS shell is `zsh` instead of `bash`.\n\nBottom line: don't use `wordexp(3)` on untrusted inputs, even with `WRDE_NOCMD`.\n\n[^1]: Previously, macOS's `wordexp(3)` would shell out to Perl. `wordexp-helper` appears to be the \"modern\" solution.\n",
  "authors": [
    "yossarian.net by yossarian"
  ],
  "captured_at": "2026-10-26T14:07:38.108821132+00:00",
  "category": "news",
  "content_html": "<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://pubs.opengroup.org/onlinepubs/9799919799/functions/wordexp.html\"><code>wordexp(3)</code></a> is a POSIX API for performing shell-style expansions from C.</p>\n<p>It's often cited/recommended as a way to do tilde expansion (e.g. <code>~/foo</code> to <code>/home/me/foo</code>):</p>\n<pre><code class=\"language-c\"><span class=\"code-snippet\" data-language=\"C\"><span class=\"syntax-source syntax-c\"><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&lt;</span>stdio.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&lt;</span>stdlib.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&lt;</span>string.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&lt;</span>wordexp.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&gt;</span></span>\n</span>\n<span class=\"syntax-storage syntax-type syntax-c\">int</span> <span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-entity syntax-name syntax-function syntax-c\">expand_tilde</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-storage syntax-type syntax-c\">char</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span><span class=\"syntax-variable syntax-parameter syntax-c\">input</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">char</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span><span class=\"syntax-keyword syntax-operator syntax-c\">*</span><span class=\"syntax-variable syntax-parameter syntax-c\">output</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c\"> </span><span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-meta syntax-block syntax-c\">\n    wordexp_t p<span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-storage syntax-type syntax-c\">int</span> ret <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">wordexp</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">input<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>p<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-keyword syntax-control syntax-c\">if</span> <span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span>ret <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">==</span> <span class=\"syntax-constant syntax-numeric syntax-c\">0</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c\">{</span>\n        <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>output <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">strdup</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">p<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-c\">we_wordv</span><span class=\"syntax-meta syntax-brackets syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-c\">[</span><span class=\"syntax-constant syntax-numeric syntax-c\">0</span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-c\">]</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n        <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">wordfree</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>p</span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c\">}</span></span>\n    <span class=\"syntax-keyword syntax-control syntax-c\">return</span> ret<span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c\">}</span></span></span>\n\n<span class=\"syntax-storage syntax-type syntax-c\">int</span> <span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-entity syntax-name syntax-function syntax-c\">main</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-storage syntax-type syntax-c\">void</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c\"> </span><span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-meta syntax-block syntax-c\">\n    <span class=\"syntax-storage syntax-type syntax-c\">char</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>expanded <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-language syntax-c\">NULL</span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">expand_tilde</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>~/foo<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>expanded</span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">printf</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>expanded: <span class=\"syntax-constant syntax-other syntax-placeholder syntax-c\">%s</span><span class=\"syntax-constant syntax-character syntax-escape syntax-c\">\\n</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> expanded</span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-keyword syntax-control syntax-c\">return</span> <span class=\"syntax-constant syntax-numeric syntax-c\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c\">}</span></span></span>\n</span></span></code></pre>\n<p>However, <code>wordexp(3)</code> is also dangerous! That last <code>0</code> argument is for the <em>flags</em> parameter. By default, all expansion features are enabled, <strong>including command expansion</strong>:</p>\n<pre><code class=\"language-c\"><span class=\"code-snippet\" data-language=\"C\"><span class=\"syntax-source syntax-c\"><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">expand_tilde</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>$(whoami)/foo<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>expanded</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n</span></span></code></pre>\n<p>or:</p>\n<pre><code class=\"language-c\"><span class=\"code-snippet\" data-language=\"C\"><span class=\"syntax-source syntax-c\"><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">expand_tilde</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>$(cat /etc/passwd)/foo<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>expanded</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n</span></span></code></pre>\n<p>Disabling this requires passing <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://pubs.opengroup.org/onlinepubs/9799919799/functions/wordexp.html#:~:text=WRDE_NOCMD,Substitution%2C%20is%20requested.\"><code>WRDE_NOCMD</code></a> as a flag. Unfortunately, this palliative at best in some libc implementations:</p>\n<ul>\n<li>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://git.musl-libc.org/cgit/musl/tree/src/misc/wordexp.c\">musl implements <code>wordexp(3)</code></a> by delegating to the system shell. It adds some perfunctory scanning for command substitutions before delegating, but fails to match some patterns that the underlying shell (like GNU Bash) can treat as valid command substitutions.</p>\n</li>\n<li>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/apple-oss-distributions/Libc/blob/71bbe350ab79eef58113991d817ccc6165061a64/gen/FreeBSD/wordexp.c#L201\">macOS's libc implements <code>wordexp(3)</code></a> in a similar manner, delegating to <code>/usr/lib/system/wordexp-helper</code><sup class=\"footnote-ref\"><a href=\"#fn-1\" id=\"fnref-1\" data-footnote-ref>1</a></sup>. According to <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.cipht.net\">Julian Squires</a> this had the same bypass as musl <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.cipht.net/2023/11/21/worried-by-wordexp.html\">as recently as 2023</a>, although I didn't bother testing whether it's still effective now that the default macOS shell is <code>zsh</code> instead of <code>bash</code>.</p>\n</li>\n</ul>\n<p>Bottom line: don't use <code>wordexp(3)</code> on untrusted inputs, even with <code>WRDE_NOCMD</code>.</p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Previously, macOS's <code>wordexp(3)</code> would shell out to Perl. <code>wordexp-helper</code> appears to be the &quot;modern&quot; solution. <a href=\"#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n</ol>\n</section>\n",
  "content_markdown": "[`wordexp(3)`](https://pubs.opengroup.org/onlinepubs/9799919799/functions/wordexp.html) is a POSIX API for performing shell-style expansions from C.\n\nIt's often cited/recommended as a way to do tilde expansion (e.g. `~/foo` to `/home/me/foo`):\n\n```c\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <wordexp.h>\n\nint expand_tilde(const char *input, char **output) {\n    wordexp_t p;\n    int ret = wordexp(input, &p, 0);\n    if (ret == 0) {\n        *output = strdup(p.we_wordv[0]);\n        wordfree(&p);\n    }\n    return ret;\n}\n\nint main(void) {\n    char *expanded = NULL;\n    expand_tilde(\"~/foo\", &expanded);\n    printf(\"expanded: %s\\n\", expanded);\n    return 0;\n}\n```\n\nHowever, `wordexp(3)` is also dangerous! That last `0` argument is for the *flags* parameter. By default, all expansion features are enabled, **including command expansion**:\n\n```c\nexpand_tilde(\"$(whoami)/foo\", &expanded);\n```\n\nor:\n\n```c\nexpand_tilde(\"$(cat /etc/passwd)/foo\", &expanded);\n```\n\nDisabling this requires passing [`WRDE_NOCMD`](https://pubs.opengroup.org/onlinepubs/9799919799/functions/wordexp.html#:~:text=WRDE_NOCMD,Substitution%2C%20is%20requested.) as a flag. Unfortunately, this palliative at best in some libc implementations:\n\n- [musl implements `wordexp(3)`](https://git.musl-libc.org/cgit/musl/tree/src/misc/wordexp.c) by delegating to the system shell. It adds some perfunctory scanning for command substitutions before delegating, but fails to match some patterns that the underlying shell (like GNU Bash) can treat as valid command substitutions.\n\n- [macOS's libc implements `wordexp(3)`](https://github.com/apple-oss-distributions/Libc/blob/71bbe350ab79eef58113991d817ccc6165061a64/gen/FreeBSD/wordexp.c#L201) in a similar manner, delegating to `/usr/lib/system/wordexp-helper`[^1]. According to [Julian Squires](https://www.cipht.net) this had the same bypass as musl [as recently as 2023](https://www.cipht.net/2023/11/21/worried-by-wordexp.html), although I didn't bother testing whether it's still effective now that the default macOS shell is `zsh` instead of `bash`.\n\nBottom line: don't use `wordexp(3)` on untrusted inputs, even with `WRDE_NOCMD`.\n\n[^1]: Previously, macOS's `wordexp(3)` would shell out to Perl. `wordexp-helper` appears to be the \"modern\" solution.\n",
  "dateCreated": "2026-10-26T14:07:38.108821132+00:00",
  "date_created": "2026-10-25T15:09:29+00:00",
  "date_modified": "2026-10-25T15:09:29+00:00",
  "date_published": "2026-10-25T15:09:29+00:00",
  "description": "Comments",
  "external_url": "https://yossarian.net/til/post/posix-wordexp-3-is-dangerous/",
  "git": {
    "commit": "20068632b65d2830a2d54f25ca1d90d697bea2c0",
    "path": "items/lobste-rs/2026/10/2026-10-25-posix-wordexp-3-is-dangerous.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/20068632b65d2830a2d54f25ca1d90d697bea2c0/items/lobste-rs/2026/10/2026-10-25-posix-wordexp-3-is-dangerous.md"
  },
  "id": "urn:aggr:item:ac69a322ac206bfce1edc19b4f0ce0d26bcbec80",
  "isBasedOn": {
    "@id": "https://yossarian.net/til/post/posix-wordexp-3-is-dangerous/"
  },
  "mainEntity": {
    "@id": "https://yossarian.net/til/post/posix-wordexp-3-is-dangerous/",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/lobste-rs/2026-10-25-posix-wordexp-3-is-dangerous/#webpage"
    },
    "author": [
      {
        "@type": "Person",
        "name": "yossarian.net by yossarian"
      }
    ],
    "dateModified": "2026-10-25T15:09:29+00:00",
    "datePublished": "2026-10-25T15:09:29+00:00",
    "headline": "POSIX wordexp(3) is dangerous",
    "timeRequired": "PT2M",
    "url": "https://yossarian.net/til/post/posix-wordexp-3-is-dangerous/",
    "wordCount": 252
  },
  "name": "Archived snapshot: POSIX wordexp(3) is dangerous",
  "preview": null,
  "reading_minutes": 2,
  "replicated_at": null,
  "source": "lobste-rs",
  "source_name": "Lobsters: Top Stories of the Past Week",
  "summary": "Comments",
  "tags": [
    "c",
    "security"
  ],
  "temporalCoverage": "2026-10-26T14:07:38.108821132+00:00",
  "title": "POSIX wordexp(3) is dangerous",
  "url": "https://aggr.aymericbeaumet.com/items/lobste-rs/2026-10-25-posix-wordexp-3-is-dangerous/",
  "word_count": 252
}