Subject: bug#48960: closed (Re: bug#48960: stat v8.30 - device number in decimal shown as 16bit number instead of to converted 8bit)

From: [email-masked] (GNU bug Tracking System)
Date: Mon, 21 Jun 2021 11:08:02 +0000

Your bug report

#48960: stat v8.30 - device number in decimal shown as 16bit number instead of to converted 8bit

which was filed against the coreutils package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
48960: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=48960
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#48960: stat v8.30 - device number in decimal shown as 16bit number instead of to converted 8bit
From: Pádraig Brady <[email-masked]>
To: Paul Eggert <[email-masked]>, [email-masked], [email-masked]
Date: Mon, 21 Jun 2021 12:07:01 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

On 20/06/2021 22:38, Paul Eggert wrote:
> Thanks for writing that patch. One minor note:
> 
> On 6/20/21 7:21 AM, Pádraig Brady wrote:
> 
>> +                                    (to_uchar (mod_char) << CHAR_BIT)
>> +                                     + to_uchar (fmt_char),
> 
> Neither mod_char nor fmt_char can be negative (this is guaranteed by the
> C standard since all the relevant constants are in the basic character
> set) so the to_uchar calls are unnecessary.
> 
> Also, this code assumes that 2 * CHAR_BIT <= MIN (INT_WIDTH,
> UINT_WIDTH), something that POSIX requires but the C standard does not;
> it'd be a bit safer (if pedantic) to add 'verify (2 * CHAR_BIT <= MIN
> (INT_WIDTH, UINT_WIDTH));'.
> 
> I'd also change print_stat's arg from unsigned int to int; if you did
> that, you could change the above 'MIN (INT_WIDTH, UINT_WIDTH)' to plain
> 'INT_WIDTH'. (These days we're negative on unsigned types anyway, for
> all the usual reasons....)
> 
> Better yet, pass two char args to print_stat instead of a single int
> portmanteau.

Yes two separate char arguments is cleaner.
I thought there was some reason for the existing unsigned int usage,
but looking I see it was added for commit db42ae78 (to support :X formats),
but then became unneeded with commit c7375c23 (to instead support %.9X formats).

I've pushed both commits now, so marking this as done,

thanks for the review!
Pádraig

Subject: stat v8.30 - device number in decimal shown as 16bit number instead of to converted 8bit
From: Wolfgang Rohm <[email-masked]>
To: [email-masked]
Date: Fri, 11 Jun 2021 09:37:54 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Hello.

Stat prints the device number, major and minor, in hex and decimal. They 
are both 8bit numbers clamped together. While the hex number is 
perfectly fine, the decimal doesn't respect how this number has come to 
existence. There is no meaning in the decimal value, if the the hex 
value is taken as one 16bit number and then converted.

For example "fd00h" is converted to "64768d". There is no major device 
with 647 and no minor device with 768. Its just completely wrong.

So instead of converting fd00h to 64768d, both 8bit hex numbers must be 
converted each, meaning alone. The right number would be therefore 
253000, major 253 and minor 0. While the hex number needs two digits 
each (the first 0 can be ommited), the decimal needs three digits each 
(the first and second 0 can be omitted).

|stat (GNU coreutils) 8.30
Copyright © 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Geschrieben von Michael Meskes.
|

-- 
Mit freundlichen Grüßen
Wolfgang Rohm