From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 76691 invoked by alias); 5 Jun 2018 19:05:26 -0000 Mailing-List: contact libc-help-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Post: List-Help: , Sender: libc-help-owner@sourceware.org Received: (qmail 74146 invoked by uid 89); 5 Jun 2018 19:05:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=communicating, documents X-HELO: mail-oi0-f45.google.com Received: from mail-oi0-f45.google.com (HELO mail-oi0-f45.google.com) (209.85.218.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 05 Jun 2018 19:05:22 +0000 Received: by mail-oi0-f45.google.com with SMTP id d5-v6so3108545oib.5 for ; Tue, 05 Jun 2018 12:05:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to:cc; bh=88FPtKpFWu+3JTY38kYpIkybUzp6CNJ/It4zyxa2kCM=; b=kQkTAxgYufnTT2JAINHQO+MIU8z+mC0l3quvlZcSJhbDFqDYVlwVxtlQ96nAemW0dz Ifm53gajqFn76QlzFbNXsc//Dvx9SgfykX8Or1bcbLRZIkKI/ev9gGzwl/UVlxKIrc0t rxEIC+UoEwO8aXlkd5bsOS7b/FvoAE+lPzqVT8UBKgAdVcLvJsk8akT+CDeyL9xuXJvL EDz9ueflsvg0bLApY7hF7Bq4iMEQYNUX2Psk1L5FNBP9PFnYYcUlyNYakamGZAvAliq5 6G9Ra7Z3aEl+Mx5a6/0UG06KmQnGjYQBNHqniuTU+X2APRT8wzA/AO7E6LGooO/T4ego NG9w== X-Gm-Message-State: ALKqPwcCmyEgDjL52LD9eWct6aLrBKnWArdi/O9jrpcQaBN0HjikNnwD QeqSYy6B57q3a7/gMaXCiDnc2RUdlKkifhIVTlJerIbPF7Q= X-Google-Smtp-Source: ADUXVKJT1bPMSZNWBCM/1rcYxrnPgTwbMUTsBlcdkfCnMK/SoSIhCFepvnBhCzLzulfc8rgeT7uGyPCG0VDspSWoTxE= X-Received: by 2002:aca:b341:: with SMTP id c62-v6mr15778441oif.9.1528225520153; Tue, 05 Jun 2018 12:05:20 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a9d:e34:0:0:0:0:0 with HTTP; Tue, 5 Jun 2018 12:05:19 -0700 (PDT) From: Daniel Drake Date: Tue, 05 Jun 2018 19:05:00 -0000 Message-ID: Subject: posix_spawn and script execution To: libc-help@sourceware.org Cc: shea@shealevy.com, drepper@gmail.com Content-Type: text/plain; charset="UTF-8" X-IsSubscribed: yes X-SW-Source: 2018-06/txt/msg00012.txt.bz2 Hi, The posix_spawn man page says: >The only difference between posix_spawn() and posix_spawnp() is the >manner in which they specify the file to be executed by the child >process. With posix_spawn(), the executable file is specified as a >pathname (which can be absolute or relative). With posix_spawnp(), the >executable file is specified as a simple filename; the system searches >for this file in the list of directories specified by PATH (in the same >way as for execvp(3)). For the remainder of this page, the discussion >is phrased in terms of posix_spawn(), with the understanding that >posix_spawnp() differs only on the point just described. That seems rather definitive in communicating that there are no other differences other than the path-searching behavioural aspect. However, I have found another difference: posix_spawnp() can execute scripts, by that I mean a text file that has executable permissions that does not have a shebang. When used in this way, it will use the shell to execute the script. You can try this by taking the sample program in the posix_spawn man page and switching it between posix_spawn/posix_spawnp and launching a script created with: echo "/bin/echo hello" > test.sh chmod a+x test.sh posix_spawn fails to execute it, but it runs fine with posix_spawnp. Is this an omission in the man page that should be corrected, to state that a second difference between posix_spawn and posix_spawnp is that the spawnp variant can execute scripts, in the same way that exec(3) documents the exact same behavioural exception for execlp/execvp? Or is the presence of this behavioural difference a bug in glibc? Looking at the history, posix_spawn() used to be able to launch scripts too, but this behaviour was changed here: https://sourceware.org/bugzilla/show_bug.cgi?id=13134 The resulting commit looks like it tries to make the change both for posix_spawn and posix_spawnp, in that it creates compat versions of both functions that set SPAWN_XFLAGS_TRY_SHELL while also omitting that flag from the "fixed" functions: https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=d96de9634a334af16c0ac711074c15ac1762b23c however ultimately posix_spawnp script execution is still possible today because the spawnp variant uses __execvpe. Check the source code for __execvpe and you can clearly see the script exec ENOEXEC fallback, and I believe that's why posix_spawnp can run scripts. Clarifications appreciated! Thanks Daniel