glibc + uid ?

Giorgos Keramidas keramida at ceid.upatras.gr
Wed Aug 28 00:59:02 EEST 2002


On 2002-08-27 22:30 +0000, V13 wrote:
> Mporei na moy eksigisei kapoios an ayto einai sfalma ths glibc h
> kapoioy alloy?

Κάτι περίεργο παίζει εδώ.  Το header επιμένει ότι ο τύπος του δεύτερου
και τρίτου argument είναι unsigned, αλλά στο kernel του FreeBSD
(κοιτάζω το αρχείο vfs_syscalls.c τώρα[1]) είναι λίγο διαφορετικά
δηλωμένα τα πράγματα:

	/* ARGSUSED */
	int
	chown(td, uap)
		struct thread *td;
		register struct chown_args /* {
			syscallarg(char *) path;
			syscallarg(int) uid;
			syscallarg(int) gid;
		} */ *uap;
	{

Προφανώς εδώ θα θεωρηθούν signed τα δυο τελευταία arguments, με ό,τι
αυτό συνεπάγεται για τιμές που έχουν το sign-bit = 1.

> Sto /usr/include/bits/types.h exei:
>
> typedef __u_int __uid_t;                /* Type of user identifications.  */
> typedef __u_int __gid_t;                /* Type of group identifications.  */

Αυτό είναι για να κάνει ο compiler το απαραίτητο type-checking και να
μπορείς να περάσεις τιμές μέχρι UINT_MAX σαν arguments.

> Eno sto man ths chown(2) leei kathara:
>
> int chown(const char *path, uid_t owner, gid_t group);
>
>        If  the owner or group is specified as -1, then that ID is
>        not changed.

Το manpage τον παίρνει ασύστολα.  Δεν επιτρέπεται να υπάρχουν μαγικές
σταθερές, που κυκλοφορούν έτσι ξεκάρφωτες στα διάφορα sources.  Εδώ
μάλλον εννοεί ότι μπορείς να περάσεις σαν argument μια τιμή που να
έχει όλα τα bits = 1 (την οποία BTW *τυχαίνει* να χρησιμοποιεί το VFS
layer του kernel στο FreeBSD σαν signed integer, και παίζει επειδή
συμβαίνει να έχει την ίδια αναπαράσταση στη μνήμη το (signed)-1 με το
(unsigned int)~0).   Φυσικά αν θέλουμε να είμαστε σωστοί σύμφωνα
με το prototype της chown(), η μαγική τιμή θα είναι η ~0U.

> To opoio kai doylevei alla me tin katallili xorodia:
>
> hell:/tmp$ cat a.cc
> #include "sys/types.h"
> #include "unistd.h"
>
> int main()
> {
>         chown ("/dev/null",-1,-1);
> }

Ένα αντίστοιχο πρόγραμμα, κάνει compile αν αντί για -1 (που είναι
προφανώς signed) χρησιμοποιήσεις ~0U.

    charon at hades[00:37]/tmp$ cat > a.cc
    #include <sys/types.h>
    #include <unistd.h>

    int
    main(void)
    {
	    chown("/dev/null", ~0U, ~0U);
	    return (0);
    }
    charon at hades[00:39]/tmp$ cc -W -Wall -Wconversion a.c
    charon at hades[00:39]/tmp$

Θα ήμουνα πιο ικανοποιημένος από το manpage αν έλεγε πως αλλαγές δεν
γίνονται στον owner ενός αρχείου αν το uid_t argument είναι ίσο με
UID_MAX, και αλλαγές δεν γίνονται στο group του αρχείου αν είναι ίσο
με GID_MAX (σε αντιστοιχία με τα INT_MAX, UINT_MAX, LONG_MAX, κλπ).

Αλλά κάτι τέτοιο δεν υπάρχει :-(

- Γιώργος



[1] http://cvsweb.FreeBSD.org/src/sys/kern/vfs_syscalls.c
    http://cvsweb.FreeBSD.org/src/sys/sys/sysproto.h
    http://cvsweb.FreeBSD.org/src/sys/i386/include/limits.h

-- 
FreeBSD: The Power to Serve -- http://www.FreeBSD.org



More information about the Linux-greek-users mailing list