From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.2 Received: from mother.openwall.net (mother.openwall.net [195.42.179.200]) by inbox.vuxu.org (OpenSMTPD) with SMTP id bdc1069f for ; Mon, 20 Jan 2020 11:16:00 +0000 (UTC) Received: (qmail 9281 invoked by uid 550); 20 Jan 2020 11:15:58 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 27806 invoked from network); 20 Jan 2020 10:39:37 -0000 User-agent: mu4e 0.9.18; emacs 25.1.1 From: Olaf Meeuwissen To: musl@lists.openwall.com Date: Mon, 20 Jan 2020 19:39:22 +0900 Message-ID: <8736cajtt1.fsf@member.fsf.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp Subject: [musl] [BUG] ioctl: overflow in implicit constant conversion Hi all, I've been asked[1] to upstream an issue I initially submitted[2] to the Alpinelinux project. [1]: https://gitlab.alpinelinux.org/alpine/aports/issues/7580#note_63663 [2]: https://gitlab.alpinelinux.org/alpine/aports/issues/7580 You can find all the details in that issue[2], but to save you the trip, here's the gist of it. I get `overflow in implicit constant conversion` compiler warnings on some `ioctl()` calls in my code. I found ``` c int ioctl (int, int, ...) ``` in `/usr/include/sys/ioctl.h` and the following in `/usr/include/bits/ioctl.h` (included by the former) ``` c #define _IOC(a,b,c,d) ( ((a)<<30) | ((b)<<8) | (c) | ((d)<<16) ) #define _IOC_NONE 0U #define _IOC_WRITE 1U #define _IOC_READ 2U #define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0) #define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c)) #define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c)) #define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c)) ``` If I am not mistaken and assuming a 32-bit int, that means that any second argument passed to `ioctl()` that is created using the `_IOR` or `_IOWR` macros will be an *unsigned* 32-bit integer with its most significant bit set and will trigger the warning I observe. BTW, most other distributions I compile on define ioctl() as ``` c int ioctl (int, unsigned long, ...) ``` and chaging your declaration to take an `unsigned int` “fixes” this for me. This happens when I compile with `-Wall -pedantic` on x86_64/amd64. When compiling without `-pedantic` the warning goes away. Since my initial report (against musl-1.1.16) the warning has changed to something like overflow in conversion from 'long unsigned int' to 'int' changes value from '3221771554' to '-1073195742' [-Woverflow] and I have not checked what happens when `-pedantic` is not given. Nor have I checked whether my `unsigned int` still “fixes” this. I still see this with 1.1.24. I think this is a bug and would like to see this fixed. Hope this helps, -- Olaf Meeuwissen, LPIC-2 FSF Associate Member since 2004-01-27 GnuPG key: F84A2DD9/B3C0 2F47 EA19 64F4 9F13 F43E B8A4 A88A F84A 2DD9 Support Free Software https://my.fsf.org/donate Join the Free Software Foundation https://my.fsf.org/join